构建 Kubernetes Operators的最佳实践说我应该编写一大堆 Operators 来管理我的应用程序。运营商之间的通信是如何发生的?
换句话说,我应该如何构建我的 Operator,以便它可以与其他 Operator 对话?
构建 Kubernetes Operators的最佳实践说我应该编写一大堆 Operators 来管理我的应用程序。运营商之间的通信是如何发生的?
换句话说,我应该如何构建我的 Operator,以便它可以与其他 Operator 对话?
他们没有。反正不是直接的。Kubernetes 上的通信完全通过 YAML 文件进行。
例如,如果您的应用程序需要访问数据库,您应该为 Postgresql 安装一个运算符,创建一个 PostgreSQLCluster CR 对象,并在设置完成后从中提取凭据。
但是,从长远来看,这不是一个实用的解决方案,因为 Operator应该能够自动更新且无需交互。您也不允许安装旧版本。为了命名,Crunchy Postgres Operator 实际上在每次更新时都会经历许多重大变化。如果您依赖他们维护他们的 CRD 格式,那么您的架构就会变得脆弱。
确实存在一些例外。Tekton Pipelines 和 Argo Pipelines 等产品的运营商非常稳定,不太可能因设计而改变,完全可以依赖这些运营商。
纯粹谈谈最佳实践,您应该能够使用 webhook 从旧版本的 CRD API 迁移到新版本,尽管尚不清楚任何 Operator 实现是否真正做到这一点。尽管如此,在撰写本文时, OperatorHub.io上还没有依赖其他 Operator 的 Operator(2021 年 2 月 16 日)。读者,你将是第一个。
如果您仍然想这样做,那么您想要依赖的 Operator 很可能在Go 包存储库中可用。您可以只go get
使用它们并在您的代码中本地使用它们的 CRD API 类型,这样可以很容易地跟上 API 的最新状态。
从技术上讲,您想要依赖的 Operator 可以在其管理器中实现 REST API,并将其作为服务公开。我严重怀疑有人会这样做。在 Kubernetes 设计理念中挖洞并打开攻击向量似乎并不聪明。