Operator

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

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

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

    如何创建 Operator

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

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

    (1)安装 operator-sdk 工具:

    (2)初始化项目:

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

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

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

    完整的示例可以参考 这里

    为了方便描述,以 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. roleRef:
    15. kind: ClusterRole
    16. name: cluster-admin
    17. ---
    18. apiVersion: extensions/v1beta1
    19. kind: Deployment
    20. metadata:
    21. name: etcd-operator
    22. spec:
    23. replicas: 1
    24. template:
    25. metadata:
    26. labels:
    27. name: etcd-operator
    28. spec:
    29. serviceAccountName: admin
    30. containers:
    31. - name: etcd-operator
    32. image: quay.io/coreos/etcd-operator:v0.4.2
    33. env:
    34. - name: MY_POD_NAMESPACE
    35. valueFrom:
    36. fieldRef:
    37. fieldPath: metadata.namespace
    38. valueFrom:
    39. fieldRef:
    40. fieldPath: metadata.name

    查看 operator 是否部署成功:

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

    部署对应的有状态服务:

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

    其他示例

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

    参考资料