10.3.3 Operator
Operator 的概念由 CoreOS 于 2016 年提出,它并非一个具体的工具或系统,而是一种封装、部署和管理 Kubernetes 应用的方法,尤其适合需要特定领域知识的复杂有状态应用,如数据库、分布式缓存和消息队列等。
容器化应用程序最困难的任务之一,就是设计有状态分布式组件的部署体系结构。
理解 Operator 所做的工作,需要先弄清楚“无状态应用”和“有状态应用”的含义。
如果使用 Operator,情况就简单得多。Etcd 的 Operator 提供了 EtcdCluster 自定义资源,在它的帮助下,仅用几十行代码,安装、启动、停止等基础的运维操作。但对于其他高级运维操作,例如升级、扩容、备份、恢复、监控和故障转移,如下面代码所示。
apiVersion: operator.etcd.database.coreos.com/v1beta2
kind: EtcdCluster
metadata:
name: my-etcd-cluster
namespace: default
spec:
size: 3
version: "3.4.15"
storage:
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
Operator 本身在实现上,其实是在 Kubernetes 声明式 API 基础上的一种“微创新”。它利用了 CRD 构建“高层抽象”,又通过 Kubernetes 原生的“控制器模式”,完成了一个面向分布式应用终态的“调谐”过程。
使用 CRD 构建“高层抽象”、使用配套的控制器来维护期望状态,带来的好处远不止使用简单。
就是把运维的经验沉淀为代码,实现运维的代码化、自动化、智能化。以往的高可用、扩展收缩,以及故障恢复等等运维操作,都通过 Operator 进行沉淀下来。
Red Hat 今天与 AWS、Google Cloud 和 Microsoft 合作推出了 OperatorHub.io。
图 3-14 operatorhub.io
现在很多复杂分布式系统都有了官方或者第三方提供的 Operator,从数据库(如 MySQL、PostgreSQL、MongoDB)到消息队列(如 RabbitMQ、Kafka),再到监控系统(如 Prometheus)。
这些 Operator 提供了 Kubernetes 集群中各种服务和应用程序的生命周期管理。
无论是 Helm、Kustomize 或者是 CRD + Operator ,它们其实在自领域承载一个“组件”的概念。但对于一个完整的“应用”,即面向具体业务场景的定义、部署和运行需求,仍旧缺乏思想指导和有效的解决手段。