0

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

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

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

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

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

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

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

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

Edit2:对edit1的澄清。

4

1 回答 1

2

仅出于澄清目的:

  • Helm 是一个包管理器,您可以使用它以捆绑的方式将应用程序安装到集群上:它基本上为您提供了所有必要的 YAML,例如 ConfigMap、服务、部署以及启动所需应用程序所需的任何其他内容以正确的方式运行。

  • Operator 本质上是一个控制器。replicas在 Kubernetes 中,有许多不同的控制器来定义每当你做某事时的“逻辑”(例如,如果你决定增加字段,replication-controller 会添加更多的 Pod 副本)。控制器太多了,无法全部列出并单独运行,这就是为什么它们被编译成一个称为 kube-controller-manager 的二进制文件的原因。定制的控制器被称为操作符以便于区分。这些操作员只是监视某些“事物”的状态,并在需要时执行操作。大多数情况下,这些“东西”将是 CustomResources (CRs),它们本质上是通过应用 CustomResourceDefinitions (CRD) 引入集群的新 Kubernetes 对象。

话虽如此,使用 helm 来部署 operator 的情况并不少见,但是,请尽量避免使用“helm operator”一词,因为它实际上指的是一个非常具体的 operator,并且可能会在未来导致混淆:https:// github.com/fluxcd/helm-operator

所以我的问题是,我们能否以某种方式在操作员内部使用这些 helm 操作员?

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

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

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

更新:当另一个编辑他的问题并发表评论时,我决定更新这篇文章:

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

您认为将运算符捆绑在另一个运算符中是否有意义,就像对 Helm 所做的那样?

不,这根本没有意义。这正是 helm 的用途。使用 helm,您可以捆绑东西,甚至可以将多个 helm 图表捆绑在一起,这可能是您真正想要的。您可以拥有一个 helm 图表,将所需的值传递给实际的 operator helm 图表,因此在多个位置使用类似 service-name 的东西。

算子里面算子的情况下,配置算子的时候还需要单独配置每个子算子吗?

如上所述,这样做没有任何意义,这只是一种过度设计的方法。但是,如果您真的想采用运算符方法,则基本上可以采用两种方法:

  • 编写一个算子,通过更改其他算子的 CR、ConfigMap 等来配置其他算子;使用这种方法,您将拥有一个轻量级的运算符,但是您必须确保它始终与您希望它干扰的所有不同运算符兼容(当它们更改为apiVersion具有重大更改的新运算符时,引入新的 CR 或任何那种,你将不得不再次适应)。
  • 将现有运算符中的整个逻辑提取到您的运算符中(即重建已经存在的东西);使用这种方法,您将拥有一个庞大的单体应用程序,维护起来会非常痛苦,因为只要上游操作符有更新,您就必须不断更新代码

希望现在很清楚,为“操作”其他操作符构建自己的操作符会带来很多痛苦的依赖关系,并且不应该是要走的路。

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

好的操作符和掌舵图让您可以通过相应的 CR / ConfigMap 或文件开箱即用地执行此values.yaml操作,但是,这现在取决于您要使用的解决方案。所以总的来说答案是:是的,如果支持的话是可能的。

于 2021-05-18T20:38:51.330 回答