操作符模式
操作员是 Kubernetes 的软件扩展,它们利用 自定义资源 来管理应用程序及其组件。操作员遵循 Kubernetes 原则,特别是 控制循环。
动机
操作员模式 旨在捕捉管理服务或一组服务的运维人员的关键目标。负责特定应用程序和服务的运维人员对系统应如何运行、如何部署以及如何应对问题有深入的了解。
在 Kubernetes 上运行工作负载的人员通常喜欢使用自动化来处理可重复的任务。操作员模式捕捉了如何编写代码来自动化超出 Kubernetes 本身提供的任务。
Kubernetes 中的操作员
Kubernetes 旨在实现自动化。开箱即用,您将从 Kubernetes 的核心获得大量内置自动化。您可以使用 Kubernetes 来自动化部署和运行工作负载,以及 自动化 Kubernetes 如何执行此操作。
Kubernetes 的 操作员模式 概念允许您通过将 控制器 链接到一个或多个自定义资源来扩展集群的行为,而无需修改 Kubernetes 本身的代码。操作员是 Kubernetes API 的客户端,充当 自定义资源 的控制器。
操作员示例
您可以使用操作员来自动化的一些事情包括
- 按需部署应用程序
- 对该应用程序状态进行备份和还原
- 处理应用程序代码的升级以及相关的更改,例如数据库模式或额外的配置设置
- 将服务发布到不支持 Kubernetes API 的应用程序以发现它们
- 模拟集群全部或部分的故障以测试其弹性
- 为没有内部成员选举过程的分布式应用程序选择领导者
操作员在更详细的层面上可能是什么样子?以下是一个示例
- 一个名为 SampleDB 的自定义资源,您可以将其配置到集群中。
- 一个 Deployment,确保运行包含操作员控制器部分的 Pod。
- 操作员代码的容器镜像。
- 查询控制平面以找出配置了哪些 SampleDB 资源的控制器代码。
- 操作员的核心是代码,用于告诉 API 服务器如何使现实与配置的资源相匹配。
- 如果您添加一个新的 SampleDB,操作员将设置 PersistentVolumeClaims 以提供持久性数据库存储、StatefulSet 以运行 SampleDB 以及 Job 以处理初始配置。
- 如果您将其删除,操作员将拍摄快照,然后确保 StatefulSet 和卷也被删除。
- 操作员还管理定期数据库备份。对于每个 SampleDB 资源,操作员都会确定何时创建可以连接到数据库并进行备份的 Pod。这些 Pod 将依赖于具有数据库连接详细信息和凭据的 ConfigMap 和/或 Secret。
- 由于操作员旨在为其管理的资源提供强大的自动化,因此将有额外的支持代码。对于此示例,代码检查数据库是否正在运行旧版本,如果是,则创建 Job 对象以为您升级它。
部署操作员
部署操作员最常见的方法是将自定义资源定义及其关联的控制器添加到您的集群中。控制器通常在 控制平面 之外运行,就像您运行任何容器化应用程序一样。例如,您可以在集群中将控制器作为 Deployment 运行。
使用操作员
部署操作员后,您将通过添加、修改或删除操作员使用的资源类型来使用它。按照上面的示例,您将为操作员本身设置一个 Deployment,然后
kubectl get SampleDB # find configured databases
kubectl edit SampleDB/example-database # manually change some settings
…就这样!操作员将负责应用更改以及保持现有服务处于良好状态。
编写您自己的操作员
如果生态系统中没有实现您想要的行为的操作员,您可以编写自己的操作员。
您还可以使用任何可以作为 Kubernetes API 客户端 的语言/运行时来实现操作员(即控制器)。
以下是一些您可以用来编写自己的云原生操作员的库和工具。
- Charmed Operator Framework
- Java Operator SDK
- Kopf (Kubernetes Operator Pythonic Framework)
- kube-rs (Rust)
- kubebuilder
- KubeOps (.NET operator SDK)
- Mast
- Metacontroller 以及您自己实现的 WebHooks
- Operator Framework
- shell-operator
下一步
- 阅读 CNCF 操作员白皮书。
- 详细了解 自定义资源
- 在 OperatorHub.io 上找到适合您用例的现成操作员
- 发布 您的操作员供其他人使用
- 阅读 CoreOS 的原始文章,该文章介绍了操作员模式(这是原始文章的存档版本)。
- 阅读 Google Cloud 关于构建操作员的最佳实践的 文章
此页面上的项目引用了提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对这些第三方产品或项目负责。有关更多详细信息,请参阅 CNCF 网站指南。
在提出添加额外第三方链接的更改之前,您应该阅读 内容指南。