最佳实践(Good Practices)
什么是 Operator 的 “Reconciliation”?
用 Kubebuilder 创建项目后,你会在 cmd/main.go 看到脚手架代码。该代码初始化一个 Manager,项目基于 controller-runtime 框架。Manager 管理若干控制器,每个控制器提供 reconcile 函数,使资源在集群中不断向期望状态收敛。
“Reconciliation(调谐)” 是一个持续循环,按 Kubernetes 的控制回路原理执行必要操作以维持期望状态。更多背景可参考 Operator 模式 文档。
为什么调谐应具备幂等性?
开发 Operator 时,控制器的调谐循环需要是幂等的。遵循Operator 模式,我们实现的控制器应能在集群中不断同步资源直至达到期望状态。幂等的设计有助于正确应对通用或意外事件、顺利处理启动与升级。更多说明见此处。
将调谐逻辑严格绑定到特定事件会违背 Operator 模式与 controller-runtime 的设计原则,可能导致资源卡死、需要人工介入等问题。
理解 Kubernetes API 并遵循 API 约定
构建 Operator 通常涉及扩展 Kubernetes API。理解 CRD 与 API 的交互方式至关重要。建议阅读 Kubebuilder 文档 中的 Group/Version/Kind 章节,以及 Kubernetes 的 Operator 模式 文档。
为什么要遵循 Kubernetes API 约定与标准
遵循 Kubernetes API 约定与标准 对应用与部署至关重要:
- 互操作性:遵循约定可减少兼容性问题,带来一致体验;
- 可维护性:一致的模式/结构便于调试与支持,提高效率;
- 发挥平台能力:在标准框架下更好地利用特性,实现可扩展与高可用;
- 面向未来:与生态演进保持一致,兼容后续更新与特性。
总之,遵循这些约定能显著提升集成、维护、性能与演进能力。
为何应避免一个控制器同时管理多个 CRD(例如 “install_all_controller.go”)?
避免让同一个控制器调谐多个 Kind。这通常违背 controller-runtime 的设计,也损害封装、单一职责与内聚性等原则,增加扩展/复用/维护难度。问题包括:
- 复杂性:单控多 CR 会显著增加代码复杂度;
- 可扩展性:易成为瓶颈,降低系统效率与响应性;
- 单一职责:每个控制器聚焦一个职责更稳健;
- 错误隔离:单控多 CR 时,一处错误可能影响所有受管 CR;
- 并发与同步:多 CR 并行易引发竞态与复杂同步(尤其存在依赖关系时)。
因此,通常遵循单一职责:一个 CR 对应一个控制器。
推荐使用 Status Conditions
建议按 K8s API 约定 使用 Status Conditions 管理状态,原因包括:
- 标准化:为自定义资源提供统一的状态表示,便于人和工具理解;
- 可读性:多 Condition 组合可表达复杂状态;
- 可扩展:新增特性/状态时易于扩展,而无需重构 API;
- 可观测:便于运维/监控工具跟踪资源状态;
- 兼容性:与生态一致,带来一致的使用体验。
