Operator 是 Kubernetes 的扩展软件,它利用自定义资源来管理应用程序及其组件。Operator通过代码化的方式实现应用程序的自动化管理,会封装你编写的(Kubernetes 本身提供功能以外的)任务自动化代码。
一、简介
Operator 模式旨在帮助运维人员实现关键目标,这些人员负责管理特定的应用程序和服务。他们需要清楚地了解系统的预期运行方式、部署策略以及故障处理方法。
在 Kubernetes 上运行工作负载的人们通常喜欢利用自动化来处理重复的任务。Operator 模式通过封装自动化代码,使你能够编写与 Kubernetes 平台本身提供的功能不同的自动化任务。
通过 Operator 模式,你可以创建自定义控制器来管理应用程序和服务的生命周期。这些控制器会监视资源状态并采取必要的操作以确保系统的正常运行。例如,当有新的 Pod 创建请求时,控制器可以自动进行调度和部署,或者在出现故障时自动进行故障恢复。
二、Kubernetes上的Operator
Kubernetes确实在设计之初就注重自动化。它提供了许多内置的自动化功能,无需进行任何修改即可使用。
通过Kubernetes的自动化部署和运行工作负载功能,可以轻松地管理应用程序和服务的生命周期。可以定义Deployment、StatefulSet或DaemonSet等资源对象,并指定所需的副本数、容器镜像和其他配置参数。Kubernetes会自动处理资源的创建、调度、部署和扩展,确保工作负载按照预期运行。
三、Operator示例
使用 Operator 可以自动化的事情包括:
- 按需部署应用;
- 获取/还原应用状态的备份;
- 处理应用代码的升级以及相关改动。例如数据库 Schema 或额外的配置设置;
- 发布一个 Service,要求不支持 Kubernetes API 的应用也能发现它;
- 模拟整个或部分集群中的故障以测试其稳定性;
- 在没有内部成员选举程序的情况下,为分布式应用选择首领角色。
下面是一个示例,以帮助大家进一步了解 Operator:
1、有一个名为 SampleDB 的自定义资源,你可以将其配置到集群中。
2、一个包含 Operator 控制器部分的 Deployment,用来确保 Pod 处于运行状态。
3、Operator 代码的容器镜像。
4、控制器代码,负责查询控制平面以找出已配置的 SampleDB 资源。
5、Operator 的核心是告诉 API 服务器,如何使现实与代码里配置的资源匹配。
- 如果添加新的 SampleDB,Operator 将设置 PersistentVolumeClaims 以提供持久化的数据库存储, 设置 StatefulSet 以运行 SampleDB,并设置 Job 来处理初始配置;
- 如果你删除它,Operator 将建立快照,然后确保 StatefulSet 和 Volume 已被删除。
6、Operator 也可以管理常规数据库的备份。对于每个 SampleDB 资源,Operator 会确定何时创建(可以连接到数据库并进行备份的)Pod。这些 Pod 将依赖于 ConfigMap 和/或具有数据库连接详细信息和凭据的 Secret。
7、由于 Operator 旨在为其管理的资源提供强大的自动化功能,因此它还需要一些额外的支持性代码。 在这个示例中,代码将检查数据库是否正运行在旧版本上, 如果是,则创建 Job 对象为你升级数据库。
四、部署Operator
部署 Operator 最常见的方法是将自定义资源及其关联的控制器添加到你的集群中。 跟运行容器化应用一样,控制器通常会运行在控制平面之外。 例如,你可以在集群中将控制器作为 Deployment 运行。
五、使用Operator
署 Operator 后,你可以对 Operator 所使用的资源执行添加、修改或删除操作。 按照上面的示例,你将为 Operator 本身建立一个 Deployment,然后:
kubectl get SampleDB # 查找所配置的数据库 kubectl edit SampleDB/example-database # 手动修改某些配置
Operator 会负责应用所作的更改并保持现有服务处于良好的状态。
六、编写Operator
如果生态系统中没有可以实现你目标的 Operator,你可以自己编写代码。
你还可以使用任何支持 Kubernetes API 客户端的语言或运行时来实现 Operator(即控制器)。
以下是一些库和工具,你可用于编写自己的云原生 Operator。
- Charmed Operator Framework
- Java Operator SDK
- Kopf (Kubernetes Operator Pythonic Framework)
- kube-rs (Rust)
- kubebuilder
- KubeOps (.NET operator SDK)
- KUDO(Kubernetes 通用声明式 Operator)
- Mast
- Metacontroller,可与 Webhook 结合使用,以实现自己的功能。
- Operator Framework
- shell-operator