K8s系列之:K8s OPERATOR是什么
一、K8s OPERATOR是什么二、Operator 如何管理 Kubernetes 应用三、Operator 框架四、Operator 模式五、Kubernetes 上的 Operator六、Operator 示例七、部署 Operator八、使用 Operator九、编写你自己的 Operator十、java-operator-sdk十一、使用 JOSDK 的项目
一、K8s OPERATOR是什么
Kubernetes Operator 是一种封装、部署和管理 Kubernetes 应用的方法。我们使用 Kubernetes API(应用编程接口)和 kubectl 工具在 Kubernetes 上部署并管理 Kubernetes 应用。Kubernetes Operator 是一种特定于应用的控制器,可扩展 Kubernetes API 的功能,来代表 Kubernetes 用户创建、配置和管理复杂应用的实例。它基于基本 Kubernetes 资源和控制器概念构建,但又涵盖了特定于域或应用的知识,用于实现其所管理软件的整个生命周期的自动化。在 Kubernetes 中,控制平面的控制器实施控制循环,反复比较集群的理想状态和实际状态。如果集群的实际状态与理想状态不符,控制器将采取措施解决此问题。Operator 是使用自定义资源(CR)管理应用及其组件的自定义 Kubernetes 控制器。高级配置和设置由用户在 CR 中提供。Kubernetes Operator 基于嵌入在 Operator 逻辑中的最佳实践将高级指令转换为低级操作。自定义资源是 Kubernetes 中的 API 扩展机制。自定义资源定义(CRD)会明确 CR 并列出 Operator 用户可用的所有配置。Kubernetes Operator 监视 CR 类型并采取特定于应用的操作,确保当前状态与该资源的理想状态相符。Kubernetes Operator 通过自定义资源定义引入新的对象类型。Kubernetes API 可以像处理内置对象一样处理自定义资源定义,包括通过 kubectl 交互以及包含在基于角色的访问权限控制(RBAC)策略中。Kubernetes Operator 会持续监控正在运行的应用,可备份数据,从故障中恢复,以及随着时间的推移自动升级应用。Kubernetes Operator 几乎可执行任何操作:扩展复杂的应用,应用版本升级,甚至使用专用硬件管理计算集群中节点的内核模块。详细了解 Kubernetes Operator 的工作原理(包括实例),以及如何使用 Operator 框架和软件开发套件构建 Operator。二、Operator 如何管理 Kubernetes 应用
Kubernetes 可管理和扩展无状态应用,如 Web 应用、移动后端和 API 服务,无需掌握关于这些应用的工作原理的任何其他知识。Kubernetes 的内置功能旨在轻松处理这些任务。但是,数据库和监控系统等无状态应用需要 Kubernetes 以外的其他域特定知识。有了这些知识,才能够扩展、升级和重新配置这些应用。Kubernetes Operator 将这些特定域知识编码了到 Kubernetes 扩展中,从而能够实现应用生命周期的管理和自动化。通过消除麻烦的手动应用管理任务,Kubernetes Operator 使这些流程可扩展、可重复且标准化。对于应用开发人员,Operator 使得部署和运行其应用所依赖的基础服务变得更简单。对于基础架构工程师和供应商,Operator 提供了在 Kubernetes 集群上分发软件的一致方式,并通过识别和纠正应用问题降低了支持成本。除了 Kubernetes 中提供的基本自动化功能之外,Operator 还允许您编写代码来实现任务自动化。对于采用 DevOps 或站点可靠性工程(SRE)方法的团队,开发了将 SRE 实践应用到 Kubernetes 的 Operator。Operator 模式能够捕捉运维人员如何管理服务的规律。运维人员需要全面了解应用或服务的工作原理、部署方式以及如何解决可能发生的问题。站点可靠性工程师或运维团队通常编写软件来管理应用,但 Operator 可以获取人类运维知识并将其编码到软件中,用于管理和部署 Kubernetes 工作负载,同时消除手动任务。Operator 最好由安装、运行和升级特定应用的业务逻辑专家来构建。创建 Operator 一开始要实现应用安装自动化和自助服务部署,接着创建更复杂的自动化功能。Kubernetes Operator 软件开发套件(SDK)也可以帮助您开发自己的 Operator。SDK 提供构建、测试和封装 Operator 的工具,并可选择使用 Helm 图表、Ansible Playbook 或 Golang 创建 Operator三、Operator 框架
Operator 框架是提供开发人员和运行时 Kubernetes 工具的开源项目,使您能够加速开发 Operator。
Operator 框架包括:
Operator SDK:使开发人员能够利用其专业知识来构建 Operator,无需了解 Kubernetes API 的复杂性。Operator 生命周期管理:监控在 Kubernetes 集群上运行的所有 Operator 的生命周期的安装、更新和管理。Operator 计量:为提供专业服务的 Operator 启用使用情况报告。四、Operator 模式
Operator 是 Kubernetes 的扩展软件, 它利用定制资源管理应用及其组件。 Operator 遵循 Kubernetes 的理念,特别是在控制器方面。
Operator 模式 旨在记述(正在管理一个或一组服务的)运维人员的关键目标。 这些运维人员负责一些特定的应用和 Service,他们需要清楚地知道系统应该如何运行、如何部署以及出现问题时如何处理。
在 Kubernetes 上运行工作负载的人们都喜欢通过自动化来处理重复的任务。 Operator 模式会封装你编写的(Kubernetes 本身提供功能以外的)任务自动化代码。
五、Kubernetes 上的 Operator
Kubernetes 为自动化而生。无需任何修改,你即可以从 Kubernetes 核心中获得许多内置的自动化功能。 你可以使用 Kubernetes 自动化部署和运行工作负载,甚至 可以自动化 Kubernetes 自身。
Kubernetes 的 Operator 模式概念允许你在不修改 Kubernetes 自身代码的情况下, 通过为一个或多个自定义资源关联控制器来扩展集群的能力。 Operator 是 Kubernetes API 的客户端, 充当自定义资源的控制器。
六、Operator 示例
使用 Operator 可以自动化的事情包括:
按需部署应用获取/还原应用状态的备份处理应用代码的升级以及相关改动。例如数据库 Schema 或额外的配置设置发布一个 Service,要求不支持 Kubernetes API 的应用也能发现它模拟整个或部分集群中的故障以测试其稳定性在没有内部成员选举程序的情况下,为分布式应用选择首领角色想要更详细的了解 Operator?下面是一个示例:
有一个名为 SampleDB 的自定义资源,你可以将其配置到集群中。一个包含 Operator 控制器部分的 Deployment,用来确保 Pod 处于运行状态。Operator 代码的容器镜像。控制器代码,负责查询控制平面以找出已配置的 SampleDB 资源。Operator 的核心是告诉 API 服务器,如何使现实与代码里配置的资源匹配。如果添加新的 SampleDB,Operator 将设置 PersistentVolumeClaims 以提供持久化的数据库存储, 设置 StatefulSet 以运行 SampleDB,并设置 Job 来处理初始配置。如果你删除它,Operator 将建立快照,然后确保 StatefulSet 和 Volume 已被删除。Operator 也可以管理常规数据库的备份。对于每个 SampleDB 资源,Operator 会确定何时创建(可以连接到数据库并进行备份的)Pod。这些 Pod 将依赖于 ConfigMap 和/或具有数据库连接详细信息和凭据的 Secret。由于 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。
java-operator-sdk十、java-operator-sdk
无需麻烦地使用Java构建Kubernetes Operators
Java Operator SDK是一个可用于在Java中轻松实现Kubernetes Operators的生产就绪框架。它提供了控制器运行时,支持测试运算符以及相关工具。除此之外,它还支持实现转换钩子和动态准入控制器作为一个单独的项目。在底层,它使用了优秀的Fabric8 Kubernetes Client,该客户端提供了额外的功能,例如从源代码生成CRD(和反之亦然)。Java Operator SDK 是一个高级框架和相关工具,用于支持使用 Java 编写 Kubernetes Operators。它使实现 Operator 的最佳实践和模式变得容易。其功能包括:
最优处理 Kubernetes API 事件处理依赖资源、相关事件和缓存。自动重试- 智能事件调度自动处理观察到的生成- 易于使用的错误处理- ……以及一个含电池的框架所需的一切。十一、使用 JOSDK 的项目
虽然我们知道有多个项目在生产中使用 JOSDK,但我们不想假设这些项目想要在此处宣传这一事实。因此,如果您希望您的项目在此部分中展示,请提交一个 PR,添加一个链接和项目的简短描述,如下所示:
ExposedApp operator: 一个示例运算符,用于说明 JOSDK 的概念和其在 . 上的 Quarkus 扩展。Keycloak operator: 官方的 Keycloak 运算符,使用 Quarkus 和 JOSDK 构建。Apache Flink Kubernetes operator: 在 Flink 运算符中市场领先。Strimzi Access operator:虽然核心的 Strimzi 运算符开发早于 JOSDK,但新的组件如 Access 运算符正在使用该框架。EureKubeOperator: 使用该框架集成了 Eureka 和 Kubernetes 的服务发现,由 11street 开发。尽管它尚未作为开源发布,但通过使用 JOSDK 编写的运算符解决了这个问题,非常有趣。Locust k8s operator: 在任何 Kubernetes 集群上运行性能测试的云原生解决方案。Strimzi Schema Registry Operator: 基于 JOSDK 的模式注册表运算符,用于在基于 Strimzi 的 Kafka 集群上运行 Confluent 模式注册表。Airflow Dag Operator: 使用 JOSDK(Quarkus 扩展)替代 Airflow Git 同步策略。该项目的主要思想是在每个 Airflow Pod 上启动一个同步容器,将 DAG/文件同步到 DAG 文件夹中。Glasskube Operator: 简化流行的开源业务工具的部署、维护和升级。它使用 Kotlin 编写,并使用基于 Kotlin 的 DSL 的 JOSDK 和 fabric8 Kubernetes 客户端。Debezium Operator: Debezium 运算符为您的 Kubernetes 或 Openshift 集群增加了 Change-Data-Capture 功能,通过提供一种简单的方式来运行和管理 实例。