知识卡片

Operator用自定义资源把有状态应用的运维知识固化进控制器代码

结构图卡

内容

[[Helm模拟Linux包管理器思路却难以应对有状态应用]]留下的缺口,本质源于 有状态应用(依赖外部资源、实例间有拓扑顺序关系,如数据库/etcd/ Elasticsearch)和无状态应用的根本差异——无状态应用天生高可用(不用管 状态一致性,CAP里没有C的限制,A和P可以兼得),但多数关键基础服务恰恰 都是有状态的。Kubernetes从1.9版起提供StatefulSet:Pod按顺序创建/销毁 (前一个就绪才建下一个)、有稳定的编号网络名称(重启后不变)、有稳定 的持久化存储(重调度到别的节点,磁盘依然挂载)——但StatefulSet最多 只能做到创建/删除集群、扩缩容这些基础操作,备份恢复、创建删除索引、 调整平衡策略这些真正的运维动作它完全帮不上忙。用StatefulSet直接部署 Elasticsearch集群需要一份极其冗长的YAML,根本原因是Kubernetes完全不 知道Elasticsearch是什么,所有信息都要用户手把手教(这就是Red Hat所说 的”低级操作”)。Operator的解法是用自定义资源(CRD)把应用封装成更高 层次的资源,再把控制器模式从内置资源扩展到自定义资源——比如Elastic.co 官方Operator提供kind: Elasticsearch资源,用户只需十行YAML表达”部署 三个7.9.1版ES节点”这个意图(”高级指令”),Operator开发者写的专属控制器 就知道如何把它翻译成具体的底层操作。这比Helm/Kustomize更灵活的地方在于: 它们最终还是靠Kubernetes内置资源打交道,而Operator开发者可以用代码 实现内置资源做不到的操作(比如原地重启Pod而不必先删再建),代价是 开发门槛更高——etcd这个不算特别复杂的应用,官方Operator代码量也超过 一万行。

结构图

flowchart LR
    A[StatefulSet] -->|能做到| A1[创建/删除集群, 扩缩容, 稳定网络名与存储]
    A -->|做不到| A2[备份恢复/索引管理/平衡策略调整]
    B[用户十行YAML表达高级指令] --> C[Operator专属控制器]
    C -->|把高级指令翻译为低级操作| D[创建/更新/管理底层资源]
    C -.可实现StatefulSet做不到的能力.-> A2

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第11章"虚拟化容器"11.3.3节 "Operator与CRD"(源文件:_epub-src对应OEBPS/Text/chapter141.xhtml) - 结论依据:原文对比StatefulSet只能做基础操作、无法覆盖备份恢复等运维 需求,用ES部署的冗长YAML示例说明"低级操作"的问题,进而说明Elasticsearch Operator用自定义资源把"高级指令"翻译为低级操作,且Operator比Helm/ Kustomize更灵活但开发门槛更高,直接支撑本卡片的结构梳理。 - 原始内容:Operator是使用自定义资源(CR),管理应用及其组件的自定义 Kubernetes控制器……Kubernetes Operator基于嵌入在Operator逻辑中的最佳 实践将高级指令转换为低级操作……以etcd的Operator为例……代码已经超过 一万行了。