Operator

Operator 是 CoreOS 推出的旨在简化复杂有状态应用管理的框架,它是一个感知应用状态的控制器,通过扩展 Kubernetes API 来自动创建、管理和配置应用实例。

你可以在 OperatorHub.io 上查看 Kubernetes 社区推荐的一些 Operator 范例。

Operator 原理

Operator 基于 Third Party Resources 扩展了新的应用资源,并通过控制器来保证应用处于预期状态。比如 etcd operator 通过下面的三个步骤模拟了管理 etcd 集群的行为:

  1. 通过 Kubernetes API 观察集群的当前状态;
  2. 分析当前状态与期望状态的差别;
  3. 调用 etcd 集群管理 API 或 Kubernetes API 消除这些差别。

etcd

如何创建 Operator

Operator 是一个感知应用状态的控制器,所以实现一个 Operator 最关键的就是把管理应用状态的所有操作封装到配置资源和控制器中。通常来说 Operator 需要包括以下功能:

  • Operator 自身以 deployment 的方式部署
  • Operator 自动创建一个 Third Party Resources 资源类型,用户可以用该类型创建应用实例
  • Operator 应该利用 Kubernetes 内置的 Serivce/ReplicaSet 等管理应用
  • Operator 应该向后兼容,并且在 Operator 自身退出或删除时不影响应用的状态
  • Operator 应该支持应用版本更新
  • Operator 应该测试 Pod 失效、配置错误、网络错误等异常情况

要创建一个新的 Operator,最简单的方法使用 Operator Framework。比如,要创建一个最简单的 Operator,需要以下几个步骤:

(1)安装 operator-sdk 工具:

  1. $ mkdir -p $GOPATH/src/github.com/operator-framework
  2. $ cd $GOPATH/src/github.com/operator-framework
  3. $ git clone https://github.com/operator-framework/operator-sdk
  4. $ cd operator-sdk
  5. $ git checkout master
  6. $ make dep
  7. $ make install

(2)初始化项目:

  1. $ mkdir -p $GOPATH/src/github.com/example-inc/
  2. $ cd $GOPATH/src/github.com/example-inc/
  3. $ operator-sdk new memcached-operator
  4. $ cd memcached-operator

(3)添加 CRD 定义和控制器:

  1. $ operator-sdk add api --api-version=cache.example.com/v1alpha1 --kind=Memcached
  2. $ operator-sdk add controller --api-version=cache.example.com/v1alpha1 --kind=Memcached

(4)实现 Controller、Reconciler 等控制逻辑。

(5)部署 Operator 到 Kubernetes 集群中,并通过自定义的 CRD 创建资源。

完整的示例可以参考 这里

如何使用 Operator

为了方便描述,以 Etcd Operator 为例,具体的链接可以参考 -Etcd Operator

在 Kubernetes 部署 Operator: 通过在 Kubernetes 集群中创建一个 deploymet 实例,来部署对应的 Operator。具体的 Yaml 示例如下:

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: admin
  5. namespace: default
  6. ---
  7. kind: ClusterRoleBinding
  8. apiVersion: rbac.authorization.k8s.io/v1alpha1
  9. metadata:
  10. name: admin
  11. subjects:
  12. - kind: ServiceAccount
  13. name: admin
  14. namespace: default
  15. roleRef:
  16. kind: ClusterRole
  17. name: cluster-admin
  18. apiGroup: rbac.authorization.k8s.io
  19. ---
  20. apiVersion: extensions/v1beta1
  21. kind: Deployment
  22. metadata:
  23. name: etcd-operator
  24. spec:
  25. replicas: 1
  26. template:
  27. metadata:
  28. labels:
  29. name: etcd-operator
  30. spec:
  31. serviceAccountName: admin
  32. containers:
  33. - name: etcd-operator
  34. image: quay.io/coreos/etcd-operator:v0.4.2
  35. env:
  36. - name: MY_POD_NAMESPACE
  37. valueFrom:
  38. fieldRef:
  39. fieldPath: metadata.namespace
  40. - name: MY_POD_NAME
  41. valueFrom:
  42. fieldRef:
  43. fieldPath: metadata.name
  1. # kubectl create -f deployment.yaml
  2. serviceaccount "admin" created
  3. clusterrolebinding "admin" created
  4. deployment "etcd-operator" created
  5. # kubectl get pod
  6. NAME READY STATUS RESTARTS AGE
  7. etcd-operator-334633986-3nzk1 1/1 Running 0 31s

查看 operator 是否部署成功:

  1. # kubectl get thirdpartyresources
  2. NAME DESCRIPTION VERSION(S)
  3. cluster.etcd.coreos.com Managed etcd clusters v1beta1

对应的有状态服务 yaml 文件示例如下:

  1. apiVersion: "etcd.coreos.com/v1beta1"
  2. kind: "Cluster"
  3. metadata:
  4. name: "example-etcd-cluster"
  5. spec:
  6. size: 3
  7. version: "3.1.8"

部署对应的有状态服务:

  1. # kubectl create -f example-etcd-cluster.yaml
  2. Cluster "example-etcd-cluster" created
  3. # kubectl get cluster
  4. NAME KIND
  5. example-etcd-cluster Cluster.v1beta1.etcd.coreos.com
  6. # kubectl get service
  7. NAME CLUSTER-IP EXTERNAL-IP PORT(S)
  8. example-etcd-cluster None <none> 2379/TCP,2380/TCP
  9. example-etcd-cluster-client 10.105.90.190 <none> 2379/TCP
  10. # kubectl get pod
  11. NAME READY STATUS RESTARTS AGE
  12. example-etcd-cluster-0002 1/1 Running 0 5h
  13. example-etcd-cluster-0003 1/1 Running 0 4h
  14. example-etcd-cluster-0004 1/1 Running 0 4h

其他示例

与其他工具的关系

  • StatefulSets:StatefulSets 为有状态服务提供了 DNS、持久化存储等,而 Operator 可以自动处理服务失效、备份、重配置等复杂的场景。
  • Puppet:Puppet 是一个静态配置工具,而 Operator 则可以实时、动态地保证应用处于预期状态
  • Helm:Helm 是一个打包工具,可以将多个应用打包到一起部署,而 Operator 则可以认为是 Helm 的补充,用来动态保证这些应用的正常运行

参考资料