Operator 是 CoreOS 推出的旨在簡化複雜有狀態應用管理的框架,它是一個感知應用狀態的控制器,通過擴展 Kubernetes API 來自動創建、管理和配置應用實例。
你可以在 OperatorHub.io 上查看 Kubernetes 社區推薦的一些 Operator 範例。
Operator 原理
Operator 基於 CustomResourceDefinition(CRD) 擴展了新的應用資源,並通過控制器來保證應用處於預期狀態。比如 etcd operator 通過下面的三個步驟模擬了管理 etcd 集群的行爲:
通過 Kubernetes API 觀察集群的當前狀態;
調用 etcd 集群管理 API 或 Kubernetes API 消除這些差別。
如何創建 Operator
Operator 是一個感知應用狀態的控制器,所以實現一個 Operator 最關鍵的就是把管理應用狀態的所有操作封裝到配置資源和控制器中。通常來說 Operator 需要包括以下功能:
Operator 自身以 Deployment 的方式部署
Operator 自動創建一個 CustomResourceDefinition(CRD) 資源類型,用戶可以用該類型創建應用實例
Operator 應該利用 Kubernetes 內置的 Serivce/Deployment 等管理應用
Operator 應該向後兼容,並且在 Operator 自身退出或刪除時不影響應用的狀態
Operator 應該測試 Pod 失效、配置錯誤、網絡錯誤等異常情況
要創建一個新的 Operator,最簡單的方法使用 Operator Framework 。比如,要創建一個最簡單的 Operator,需要以下幾個步驟:
(1)安裝 operator-sdk 工具:
Copy $ mkdir -p $GOPATH/src/github.com/operator-framework
$ cd $GOPATH/src/github.com/operator-framework
$ git clone https://github.com/operator-framework/operator-sdk
$ cd operator-sdk
$ git checkout master
$ make dep
$ make install
(2)初始化項目:
Copy $ mkdir memcached-operator
$ cd memcached-operator
$ operator-sdk init --domain example.com --repo github.com/example/memcached-operator
(3)添加 CRD 定義和控制器:
Copy $ operator-sdk create api --group cache --version v1alpha1 --kind Memcached --resource --controller
(4)實現 Controller、Reconciler 等控制邏輯。
(5)部署 Operator 到 Kubernetes 集群中,並通過自定義的 CRD 創建資源。
完整的示例可以參考 這裏 。
如何使用 Operator
爲了方便描述,以 Etcd Operator 爲例,具體的鏈接可以參考 -Etcd Operator 。
在 Kubernetes 部署 Operator: 通過在 Kubernetes 集群中創建一個 Deploymet 實例,來部署對應的 Operator。具體的 Yaml 示例如下:
Copy apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: default
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1alpha1
metadata:
name: admin
subjects:
- kind: ServiceAccount
name: admin
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: etcd-operator
spec:
replicas: 1
template:
metadata:
labels:
name: etcd-operator
spec:
serviceAccountName: admin
containers:
- name: etcd-operator
image: quay.io/coreos/etcd-operator:v0.4.2
env:
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
Copy # kubectl create -f deployment.yaml
serviceaccount "admin" created
clusterrolebinding "admin" created
deployment "etcd-operator" created
# kubectl get pod
NAME READY STATUS RESTARTS AGE
etcd-operator-334633986-3nzk1 1/1 Running 0 31s
查看 operator 是否部署成功:
Copy # kubectl get thirdpartyresources
NAME DESCRIPTION VERSION(S)
cluster.etcd.coreos.com Managed etcd clusters v1beta1
對應的有狀態服務 yaml 文件示例如下:
Copy apiVersion: "etcd.coreos.com/v1beta1"
kind: "Cluster"
metadata:
name: "example-etcd-cluster"
spec:
size: 3
version: "3.1.8"
部署對應的有狀態服務:
Copy # kubectl create -f example-etcd-cluster.yaml
Cluster "example-etcd-cluster" created
# kubectl get cluster
NAME KIND
example-etcd-cluster Cluster.v1beta1.etcd.coreos.com
# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S)
example-etcd-cluster None <none> 2379/TCP,2380/TCP
example-etcd-cluster-client 10.105.90.190 <none> 2379/TCP
# kubectl get pod
NAME READY STATUS RESTARTS AGE
example-etcd-cluster-0002 1/1 Running 0 5h
example-etcd-cluster-0003 1/1 Running 0 4h
example-etcd-cluster-0004 1/1 Running 0 4h
其他示例
與其他工具的關係
StatefulSets:StatefulSets 爲有狀態服務提供了 DNS、持久化存儲等,而 Operator 可以自動處理服務失效、備份、重配置等複雜的場景。
Puppet:Puppet 是一個靜態配置工具,而 Operator 則可以實時、動態地保證應用處於預期狀態
Helm:Helm 是一個打包工具,可以將多個應用打包到一起部署,而 Operator 則可以認爲是 Helm 的補充,用來動態保證這些應用的正常運行
參考資料