在Operator SDK中混合实现语言-Helm、Go、Ansible



我需要在一个Kubernetes集群中部署几个容器。目标是实现Kafka、KafkaConnect、PostgreSQL等的自动化部署。其中一些已经提供了我们可以使用的Helm运算符。所以我的问题是,我们能以某种方式在我们的操作员内部使用这些掌舵操作员吗?如果是这样,最好的方法是什么?

到目前为止,我能想到的唯一方法是从部署应用程序中调用helm setup控制台命令。另一种方法是在不使用这些helm文件的情况下,在我自己的运营商中实现每个运营商的功能,这似乎没有多大意义,因为我需要的东西已经开发出来并且是公开的。

我是运营商开发的新手,所以如果这是一个愚蠢的问题,请原谅我。

编辑:操作员的主要目的是部署X数据库。除此之外,我们希望有一个单独的操作员/捆绑包,可以立即部署整个系统。即使我们对一些容器有额外的任务,使用运算符进行绑定是否有意义?这样,用户就可以在yaml文件中指定:

databases
- type: "postgres"
name: "users"
- type: "postgres"
name: "purchases"

并将创建2个PostgreSQL数据库。然后,这些数据库可以在其他yaml文件中提及,也可以在同一个yaml文件下提及。手头的案例:数据库中的信息将由Debezium(另一个容器)提取,因此Debezium需要知道它们的地址。因此,操作员应该创建一个服务,并将服务地址与数据库名称相关联。

这是ETL系统的一部分。其想法是,操作员可以通过处理大部分配置来轻松部署整个系统。考虑到这一点,我们正在考虑是否不可能选择现有的Helm运营商(或另一种运营商),并在对配置进行小修改的情况下部署它们,例如不同数据库的不同端口。

但在阅读了F1ko的回复后,我获得了新的视角。也许这对于最初预期的操作员来说是不可能的?

第2版:对第1版的澄清。

仅用于澄清目的:

  • Helm是一个包管理器,您可以使用它在集群中捆绑安装应用程序:它基本上为您提供了所有必要的YAML,如ConfigMaps、Services、Deployments,以及以正确方式启动和运行所需的任何其他应用程序。

  • 操作员本质上是一个控制器。在Kubernetes中,有许多不同的控制器定义了";逻辑";每当您执行某些操作时(例如,如果您决定增加replicas字段,则复制控制器会添加更多Pod的复制)。控制器太多了,无法将它们全部列出并单独运行,这就是为什么它们被编译成一个二进制文件,称为kube控制器管理器。自定义构建的控制器被称为运算符,以便于区分。这些操作员只是监视某些"状态";事物;并将在需要时执行动作。大多数时候;事物;将是CustomResources(CR),它本质上是通过应用CustomResourceDefinitions(CRD)引入集群的新Kubernetes对象。

话虽如此,使用helm部署运营商并不罕见,但要尽量避免使用";舵手;因为它实际上指的是一个非常具体的运营商,并且可能在未来导致混淆:https://github.com/fluxcd/helm-operator

所以我的问题是,我们能在运营商内部使用这些掌舵运营商吗?

尽管您可以使用操作员sdk构建自己的操作员,然后允许您部署或触发其他操作员的某些事件(例如,通过编辑他们的CRD),但没有理由这样做。

到目前为止,我能想到的唯一方法是从部署应用程序中调用helm设置控制台命令。

您最需要的很可能是一个合适的CI/CD工作流程。只需将helm install期间使用的helm图表和values.yaml文件提交到Git存储库中,并在每次进行新提交时让CI/CD工具(如GitLab)将它们部署到集群中。

更新:当另一位编辑了他的问题并留下评论时,我决定更新这篇文章:

操作员的主要目的是部署X数据库。除此之外,我们希望有一个单独的操作员/捆绑包,可以立即部署整个系统。

您认为将运算符捆绑在另一个运算符中有意义吗?

不,这根本没有意义。这正是掌舵的目的。有了helm,你可以捆绑东西,甚至可以将多个helm图表捆绑在一起,这可能是你真正想要的。您可以有一个舵图,将所需的值传递给实际的操作员舵图,因此可以在多个位置使用类似服务名称的内容。

对于运算符内部的运算符,在配置运算符时是否仍需要单独配置每个子运算符?

如上所述,这样做毫无意义,这只是一种过度设计的方法。然而,如果你真的想采用运营商的方法,基本上有两种方法可以采用:

  • 编写一个操作符,通过更改其他操作符的CR、ConfigMaps等来配置它们;使用这种方法,您将有一个有点的轻量级运算符,但您必须确保它始终与您希望它干扰的所有不同运算符兼容(当它们更改为具有中断更改的新apiVersion、引入新CR或任何类似操作时,您将不得不再次适应)
  • 将现有运算符中的整个逻辑提取到您的运算符中(即重建已经存在的内容);使用这种方法,您将拥有一个庞大的单片应用程序,这将是一个维护起来非常困难的问题,因为无论何时上游操作符中有更新,您都必须不断更新代码

希望现在已经清楚了,为";操作";其他运营商有很多痛苦的依赖关系,不应该成为首选。

是否可以部署不同的映像配置?比如配置了不同端口的数据库?

好的运算符和舵图可以让您通过相应的CR/ConfigMap或values.yaml文件开箱即用地完成这项工作,但现在这取决于您将要使用的解决方案。因此,总的来说,答案是:是的,如果得到支持,这是可能的。

最新更新