问题描述
正在使用kubebuilder和Go编写一个k8s操作器。他有一些CRD和控制器。其中一个控制器需要在创建自定义对象时创建一组statefulsets、deployments、services等。
他看到了以下几种实现方式:
1. 使用Go结构体来定义所有的k8s对象。这种方式灵活,但意味着他需要让一些人开始编写Go代码,而不是像他们在helm中那样简单地组合yaml文件。
2. 在Reconcile()函数中执行helm install。这种方式对于简单的fire and forget场景很容易。然而,这似乎有些hacky,他不确定在未来会遇到什么问题,以及可能会遇到哪些限制和困难。
他不认为OperatorSDK基于Helm的操作器对他来说是一个好选择,因为他的其他控制器需要执行一些调用其他服务、进行一些验证等操作。
他希望有人帮助他理解每种方法的优缺点。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1:使用Go结构体定义k8s对象
使用Go结构体来定义所有的k8s对象是一种灵活的方式。这种方式的优点是可以通过代码来定义和管理k8s对象,具有更高的可控性和可扩展性。但是,这也意味着你需要让团队中的一些人开始编写Go代码,而不是使用他们熟悉的简单的yaml文件。
优点:
– 可以通过代码来定义和管理k8s对象,具有更高的可控性和可扩展性。
– 可以使用Go的强类型和面向对象的特性来进行更复杂的操作和逻辑。
缺点:
– 需要团队中的一些人开始编写Go代码,可能需要一些学习和适应的时间。
– 相对于使用简单的yaml文件,编写和维护Go代码可能需要更多的工作量。
方案2:在Reconcile()函数中执行helm install
在Reconcile()函数中执行helm install是一种简单的方式,适用于简单的fire and forget场景。这种方式的优点是简单易用,可以快速实现功能。但是,这种方式可能会有一些hacky的感觉,而且可能会在未来遇到一些问题和限制。
优点:
– 简单易用,可以快速实现功能。
– 可以使用helm的强大功能和生态系统。
缺点:
– 可能会有一些hacky的感觉,不够优雅。
– 可能会在未来遇到一些问题和限制,例如helm版本升级或兼容性问题。
方案3:OperatorSDK基于Helm的操作器
根据用户的描述,OperatorSDK基于Helm的操作器不适合他的需求,因为他的其他控制器需要执行一些调用其他服务、进行一些验证等操作。因此,我们不推荐使用这种方式。
综上所述,使用Go结构体来定义k8s对象是一种灵活的方式,可以通过代码来定义和管理k8s对象,具有更高的可控性和可扩展性。然而,这也意味着需要团队中的一些人开始编写Go代码。另一方面,在Reconcile()函数中执行helm install是一种简单易用的方式,适用于简单的fire and forget场景,但可能会有一些hacky的感觉,并且可能会在未来遇到一些问题和限制。
请根据你的具体需求和团队情况选择合适的方式。