Operator
Operator 是 CoreOS 推出的旨在简化复杂有状态应用管理的框架,它是一个感知应用状态的控制器,通过扩展 Kubernetes API 来自动创建、管理和配置应用实例。
你可以在 OperatorHub.io 上查看 Kubernetes 社区推荐的一些 Operator 范例。

Operator 原理

Operator 基于 CustomResourceDefinition(CRD) 扩展了新的应用资源,并通过控制器来保证应用处于预期状态。比如 etcd operator 通过下面的三个步骤模拟了管理 etcd 集群的行为:
    1.
    通过 Kubernetes API 观察集群的当前状态;
    2.
    分析当前状态与期望状态的差别;
    3.
    调用 etcd 集群管理 API 或 Kubernetes API 消除这些差别。
etcd

如何创建 Operator

Operator 是一个感知应用状态的控制器,所以实现一个 Operator 最关键的就是把管理应用状态的所有操作封装到配置资源和控制器中。通常来说 Operator 需要包括以下功能:
    Operator 自身以 Deployment 的方式部署
    Operator 自动创建一个 CustomResourceDefinition(CRD) 资源类型,用户可以用该类型创建应用实例
    Operator 应该利用 Kubernetes 内置的 Serivce/Deployment 等管理应用
    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
Copied!
(2)初始化项目:
1
$ mkdir memcached-operator
2
$ cd memcached-operator
3
$ operator-sdk init --domain example.com --repo github.com/example/memcached-operator
Copied!
(3)添加 CRD 定义和控制器:
1
$ operator-sdk create api --group cache --version v1alpha1 --kind Memcached --resource --controller
Copied!
(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
---
8
kind: ClusterRoleBinding
9
apiVersion: rbac.authorization.k8s.io/v1alpha1
10
metadata:
11
name: admin
12
subjects:
13
- kind: ServiceAccount
14
name: admin
15
namespace: default
16
roleRef:
17
kind: ClusterRole
18
name: cluster-admin
19
apiGroup: rbac.authorization.k8s.io
20
---
21
apiVersion: extensions/v1beta1
22
kind: Deployment
23
metadata:
24
name: etcd-operator
25
spec:
26
replicas: 1
27
template:
28
metadata:
29
labels:
30
name: etcd-operator
31
spec:
32
serviceAccountName: admin
33
containers:
34
- name: etcd-operator
35
image: quay.io/coreos/etcd-operator:v0.4.2
36
env:
37
- name: MY_POD_NAMESPACE
38
valueFrom:
39
fieldRef:
40
fieldPath: metadata.namespace
41
- name: MY_POD_NAME
42
valueFrom:
43
fieldRef:
44
fieldPath: metadata.name
Copied!
1
# kubectl create -f deployment.yaml
2
serviceaccount "admin" created
3
clusterrolebinding "admin" created
4
deployment "etcd-operator" created
5
6
# kubectl get pod
7
NAME READY STATUS RESTARTS AGE
8
etcd-operator-334633986-3nzk1 1/1 Running 0 31s
Copied!
查看 operator 是否部署成功:
1
# kubectl get thirdpartyresources
2
NAME DESCRIPTION VERSION(S)
3
cluster.etcd.coreos.com Managed etcd clusters v1beta1
Copied!
对应的有状态服务 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"
Copied!
部署对应的有状态服务:
1
# kubectl create -f example-etcd-cluster.yaml
2
Cluster "example-etcd-cluster" created
3
4
# kubectl get cluster
5
NAME KIND
6
example-etcd-cluster Cluster.v1beta1.etcd.coreos.com
7
8
# kubectl get service
9
NAME CLUSTER-IP EXTERNAL-IP PORT(S)
10
example-etcd-cluster None <none> 2379/TCP,2380/TCP
11
example-etcd-cluster-client 10.105.90.190 <none> 2379/TCP
12
13
# kubectl get pod
14
NAME READY STATUS RESTARTS AGE
15
example-etcd-cluster-0002 1/1 Running 0 5h
16
example-etcd-cluster-0003 1/1 Running 0 4h
17
example-etcd-cluster-0004 1/1 Running 0 4h
Copied!

其他示例

与其他工具的关系

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

参考资料

最近更新 1mo ago