k8s中 CRD(Custom Resource Definition) 和 Controller(控制器)的关系
在 Kubernetes 中,CRD(Custom Resource Definition) 和 Controller(控制器) 是扩展集群功能的两个核心组件,其关系可理解为 定义资源 与 管理资源状态 的协作机制:
一、CRD:定义自定义资源
-
功能定位
CRD 用于声明一种新的资源类型(Custom Resource),本质是扩展 Kubernetes API 的核心机制68。用户通过 YAML 定义资源的字段(如spec
、status
)、校验规则(Schema)及 API 路径(Group/Version/Kind。- 例如:定义一个
Network
资源,描述集群网络配置需求。
- 例如:定义一个
-
工作原理
CRD 提交后,Kubernetes API Server 会动态注册该资源,使其支持kubectl create/get
等操作68。此时资源仅为静态声明,尚无实际逻辑。
二、Controller:实现资源状态管理
-
功能定位
Controller 是持续运行的守护进程,监听 CRD 定义的资源对象(CR),并根据其spec
驱动集群状态向期望状态收敛。- 核心逻辑:对比资源的
spec
(期望状态)与status
(实际状态),执行调谐(Reconcile)操作。
- 核心逻辑:对比资源的
-
工作流程
- 监听 CR 的创建/更新事件;
- 解析 CR 的
spec
字段(如副本数、镜像版本); - 调用 Kubernetes API 创建关联资源(如 Deployment、Service);
- 更新 CR 的
status
字段反馈当前状态。
用户创建 CR → Controller 检测变更 → 生成关联资源 → 更新 CR 状态
三、协作关系:CRD + Controller = 完整扩展能力
-
分工协作模型
- CRD 负责“是什么”:定义资源的形态和规范;
- Controller 负责“怎么做”:实现资源声明到实际组件的转换逻辑。
-
Operator 模式
二者结合形成 Operator,将运维经验编码为自动化操作(如数据库备份、中间件配置)。例如:定义一个
MySQLCluster
CRD,配套 Controller 自动创建 Pod/Secret/Volume 等资源。
总结关系图谱
graph LR
CRD[CRD:定义资源结构] -->|声明| CR[Custom Resource]
Controller -->|监听/调谐| CR
Controller -->|创建| K8s_Resources[Pod, Service等]
CR -->|status 反馈| Controller
- CRD 是资源蓝图,Controller 是资源引擎;
- 二者分离设计,支持灵活扩展复杂业务场景。
时间是个伟大的作者,必将给出完美的答案。