StatefulSet有状态应用StatefulSet应用部署实践中介绍和实践了有状态应用的管理方法。但是在实践过程中明显感觉到编写有状态应用的YAML非常麻烦费力。

为此,k8s中提供了更加灵活和编程友好的管理“有状态”应用的解决方案,那就是Operator

Etcd Operator的使用

Etcd Operator的使用非常简单,只需要两步:

  1. 将这个Operator的代码clone到本地:
$ git clone https://github.com/coreos/etcd-operator
  1. 将这个Operator部署在k8s集群中。 但是部署之前需要为Etcd Operator创建RBAC规则,因为Etcd Operator需要访问APIServer来创建对象。
$ example/rbac/create_role.sh

上述脚本为 Etcd Operator 定义了如下所示的权限:

  1. 对 Pod、Service、PVC、Deployment、Secret 等 API 对象,有所有权限;
  2. 对 CRD 对象,有所有权限;
  3. 对属于 etcd.database.coreos.com 这个 API Group 的 CR(Custom Resource)对象,有所有权限。

Etcd Operator本身是一个Deployment,其YAML的示例如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: etcd-operator
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: etcd-operator
    spec:
      containers:
      - name: etcd-operator
        image: quay.io/coreos/etcd-operator:v0.9.2
        command:
        - etcd-operator
        env:
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
...

创建这个Etcd Operator,查看其信息会发现,这个Pod被创建后会有一个CRD被自动创建出来:

$ kubectl get pods
NAME                              READY     STATUS      RESTARTS   AGE
etcd-operator-649dbdb5cb-bzfzp    1/1       Running     0          20s
 
$ kubectl get crd
NAME                                    CREATED AT
etcdclusters.etcd.database.coreos.com   2018-09-18T11:42:55Z

所以说,通过上述两步操作,你实际上是在 Kubernetes 里添加了一个名叫 EtcdCluster 的自定义资源类型。而 Etcd Operator 本身,就是这个自定义资源类型对应的自定义控制器

接下来只要编写EtcdCluster的YAML文件提交k8s即可:

apiVersion: "etcd.database.coreos.com/v1beta2"
kind: "EtcdCluster"
metadata:
  name: "example-etcd-cluster"
spec:
  size: 3
  version: "3.2.13"
$ kubectl apply -f example/example-etcd-cluster.yaml

现在就运行了一个3节点的Etcd集群。

Operator工作原理

通过Etcd Operator的示例,可以明白Operator 的工作原理,实际上是利用了 Kubernetes 的自定义 API 资源(CRD),来描述我们想要部署的“有状态应用”;然后在自定义控制器里,根据自定义 API 对象的变化,来完成具体的部署和运维工作

所以,编写一个 Etcd Operator,与我们前面编写一个自定义控制器的过程,没什么不同。


tags: 容器编排 TODO