在StatefulSet有状态应用和StatefulSet应用部署实践中介绍和实践了有状态应用的管理方法。但是在实践过程中明显感觉到编写有状态应用的YAML非常麻烦费力。
为此,k8s中提供了更加灵活和编程友好的管理“有状态”应用的解决方案,那就是Operator。
Etcd Operator的使用
Etcd Operator的使用非常简单,只需要两步:
- 将这个Operator的代码clone到本地:
$ git clone https://github.com/coreos/etcd-operator- 将这个Operator部署在k8s集群中。 但是部署之前需要为Etcd Operator创建RBAC规则,因为Etcd Operator需要访问APIServer来创建对象。
$ example/rbac/create_role.sh上述脚本为 Etcd Operator 定义了如下所示的权限:
- 对 Pod、Service、PVC、Deployment、Secret 等 API 对象,有所有权限;
- 对 CRD 对象,有所有权限;
- 对属于 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,与我们前面编写一个自定义控制器的过程,没什么不同。