Operator 介绍
Kubernetes Operator 是一种软件扩展模式,用于基于自定义资源(Custom Resources)来管理应用程序及其组件。它遵循 Kubernetes 的核心原则,特别是控制循环(Control Loop)机制。
在 Kubernetes 中,用户通常希望通过自动化来处理重复性任务,而 Operator 正是为了在 Kubernetes 提供的基础能力之上,进一步扩展自动化管理的范围。
一句话总结:Operator 的工作核心就是通过 自定义资源(CRD) 和 自定义控制器(Controller) 实现对应用的自动化管理。同时 Operator 是对 K8s 资源(自定义或内置的资源)的扩展编程或者说开发一个资源对象,就像:Pod、Deploy、Service 一样。实现的主要逻辑是在 Controller 部分。
CRD
CRD(Custom Resource Definition):是 Kubernetes 中扩展 API 的方式,它允许你定义一种新的资源类型,使其看起来就像是 Kubernetes 本身的原生资源(例如 Pods、Services 等)。每个 CRD 都是一个资源类型,它定义了你要管理的应用程序或服务的状态、字段以及控制器的行为。
CRD 对象本身是 Kubernetes 中的一种 API 对象,用于扩展 Kubernetes 的 API,使得你可以创建自定义的资源类型。
Controller
Controller: 控制器是 Kubernetes 中的核心概念之一,它负责不断地检查集群中的资源对象(如 Pod、Service、Deployment 等)是否符合预期状态。Kubernetes 内置的控制器包括 Deployment 控制器、ReplicaSet 控制器等。
k8s 的是一个高度自动化的系统,其中涵盖了常见应用程序所需的大部分功能,比如我们通过 kubectl 命令创建一个 deployment 对象之后,为什么就会有 Pod 创建出来了?
这其实是后台有多个 Controller 在后台工作实现的。比如:
-
Deployment Controller 根据 Deployment 创建 ReplicasSet 对象 -
ReplicasSet Controller 则根据 ReplicasSet 创建 Pod
K8s 资源标识 GVK&GVR
在 Kubernetes 中,GVK(Group, Version, Kind)和 GVR(Group, Version, Resource)是用于标识和访问 Kubernetes 资源的两个重要概念。
-
Group:API 组的名称。例如,
apps组包含 Deployment、StatefulSet 等资源,batch组包含 Job、CronJob 等资源。 -
-
注意;早期的 core组的资源(如 Pod、Service 等)是没有组名的,默认使用空字符串""。
-
-
Version:API 版本。每个资源在 Kubernetes 中可能会有多个版本(如
v1、v1beta1、v1alpha1等),每个版本可能会有不同的功能和行为。 -
Kind:资源的类型。通常是资源的单数形式,如
Pod、Deployment、Service。 -
Resource:资源的名称。通常是复数形式,如
pods、deployments、services
GVK 和 GVR 区别在于:
-
GVR 更侧重于资源的实际操作,特别是动态客户端和工具中使用,用于指定和操作特定类型的资源实例。 -
GVK 更侧重于资源的定义和描述,特别是在控制器、操作器以及元数据操作中使用,用于唯一标识和处理特定类型的资源。
以下面这个 Deployment 为例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: caddy
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 1
...
-
Group 为 apps -
Version 为 v1 -
Kind 则是 Deployment -
Resource 则是 deployments
实现 Operator 的方式
client-go:Kubernetes 官方客户端库
定位:基础开发工具包,提供与 Kubernetes API Server 交互的核心能力。
核心功能:
1)API 交互:
-
-
提供 Clientset对内置资源(如 Pod、Deployment)进行 CRUD 操作。 -
DynamicClient支持操作自定义资源(CRD)和未结构化数据6。
-
2)Informer 机制:
-
-
通过 Reflector监听 API Server 事件(Add/Update/Delete),存储到本地缓存Indexer6。 -
使用 Lister从缓存高效查询资源,避免频繁请求 API Server6。
-
3)Workqueue:
-
-
事件去重与重试机制,确保控制器可靠处理事件
-
Kubebuilder:Operator 开发脚手架
定位:基于 controller-runtime 的框架,快速生成 Operator 项目结构。
核心特性:
1)项目生成:
-
-
初始化项目: kubebuilder init --domain=example.com生成标准目录(api/、controllers/、config/)2。 -
创建 CRD 和控制器: kubebuilder create api --group=webapp --version=v1 --kind=App2。
-
2)自动化代码生成:
-
-
自动生成 CRD YAML、RBAC 配置( make manifests)2。 -
集成 controller-gen工具生成深拷贝函数和 OpenAPI 校验规则5。
-
3)Webhook 支持:
-
-
一键生成 Mutating/Validating Webhook: kubebuilder create webhook
-
Operator SDK:多模式 Operator 开发框架
定位:支持多种开发模式的工具集,整合 Kubebuilder 并扩展 Ansible/Helm
开发模式对比:
| 模式 | 语言 | 适用场景 | 特点 |
|---|---|---|---|
| Go | Go | 复杂逻辑(如自动扩缩容) | 基于 Kubebuilder,高性能 |
| Ansible | Ansible | 运维脚本迁移(如备份任务) | 无需编码,用 Playbook 定义逻辑 |
| Helm | Helm Chart | 已有 Chart 的自动化管理 | 自动生成 Operator 包装 Helm Release |
核心功能:
-
集成测试:提供 operator-sdk test本地测试框架。 -
跨模式支持:同一项目可混合使用 Go/Ansible/Helm 组件。
四、三者核心区别总结
| 维度 | client-go | Kubebuilder | Operator SDK |
|---|---|---|---|
| 定位 | 基础客户端库 | Go Operator 脚手架 | 多模式 Operator 框架 |
| 抽象层级 | 底层(需手动实现控制器) | 中层(自动生成代码) | 高层(支持无代码模式) |
| 核心用户 | 深度定制化开发者 | Go 语言 Operator 开发者 | 运维团队/多语言开发者 |
| 开发速度 | 慢(大量样板代码) | 快(自动化生成) | 极快(Ansible/Helm 模式) |
| 扩展性 | 高(完全自主控制) | 中(受框架约束) | 中(模式依赖性强) |
END
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.qiuyl.com/devops/489


Abutogel: <a href=" https://abutowin.icu/# ">S...