这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Operator 用自定义资源和控制器把领域专家的运维知识自动化,例如部署、扩容、备份、故障切换和升级。
27.1 核心组成
Custom Resource Definition
-> Custom Resource
-> Controller / Operator
-> Reconcile desired state
例如数据库 Operator 可以管理:
- 集群拓扑;
- 主从复制;
- 备份;
- 故障切换;
- 版本升级;
- 监控规则。
27.2 CRD 示例
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: postgresclusters.example.com
spec:
group: example.com
names:
kind: PostgresCluster
plural: postgresclusters
singular: postgrescluster
scope: Namespaced
versions:
- name: v1
served: true
storage: true
自定义资源:
apiVersion: example.com/v1
kind: PostgresCluster
metadata:
name: shop-db
spec:
replicas: 3
version: "16"
storage: 200Gi
backup:
schedule: "0 1 * * *"
27.3 Reconcile 原则
控制器会被反复调用,必须:
- 幂等;
- 不假设每次都成功;
- 处理最终一致;
- 依赖 status 而不是内存状态;
- 避免长时间阻塞;
- 正确处理删除和 finalizer。
27.4 开发方式
常用框架:
| 工具 | 特点 |
|---|---|
| Kubebuilder | Go 常用脚手架 |
| Operator SDK | 上游项目与生态集成 |
| Metacontroller | Webhook 模式扩展 |
| Helm / Kustomize | 只是模板,不是控制器 |
27.5 使用 Operator 的风险
- 复杂度转移而非消失;
- Operator 自身故障影响业务;
- CRD 版本演进复杂;
- 备份和升级路径要验证;
- 权限往往较大;
- 社区项目维护性不确定。
本章小结
Operator 把运维流程编码为控制循环,适合复杂有状态系统。使用前要评估成熟度、备份、升级、权限和故障场景。
思考题
- CRD 和 CR 的关系是什么?
- Reconcile 为什么必须幂等?
- Operator 适合哪些工作负载?
- Operator 权限为什么要最小化?
- 如何验证 Operator 升级方案?