Kubernetes
  • 序言
  • 基礎入門
    • Kubernetes 簡介
    • Kubernetes 基本概念
    • Kubernetes 101
    • Kubernetes 201
    • Kubernetes 集群
  • 核心原理
    • 核心原理
    • 架構原理
    • 設計理念
    • 核心組件
      • etcd
      • kube-apiserver
      • kube-scheduler
      • kube-controller-manager
      • kubelet
      • kube-proxy
      • kube-dns
      • Federation
      • kubeadm
      • hyperkube
      • kubectl
    • 資源對象
      • Autoscaling
      • ConfigMap
      • CronJob
      • CustomResourceDefinition
      • DaemonSet
      • Deployment
      • Ingress
      • Job
      • LocalVolume
      • Namespace
      • NetworkPolicy
      • Node
      • PersistentVolume
      • Pod
      • PodPreset
      • ReplicaSet
      • Resource Quota
      • Secret
      • SecurityContext
      • Service
      • ServiceAccount
      • StatefulSet
      • Volume
  • 部署配置
    • 部署指南
    • kubectl 安裝
    • 單機部署
    • 特性開關
    • 最佳配置
    • 版本支持
    • 集群部署
      • kubeadm
      • kops
      • Kubespray
      • Azure
      • Windows
      • LinuxKit
      • kubeasz
    • 附加組件
      • Addon-manager
      • DNS
      • Dashboard
      • 監控
      • 日誌
      • Metrics
      • GPU
      • Cluster Autoscaler
      • ip-masq-agent
    • Kubernetes-The-Hard-Way
      • 準備部署環境
      • 安裝必要工具
      • 創建計算資源
      • 配置創建證書
      • 配置生成配置
      • 配置生成密鑰
      • 部署 Etcd 群集
      • 部署控制節點
      • 部署計算節點
      • 配置 Kubectl
      • 配置網絡路由
      • 部署 DNS 擴展
      • 煙霧測試
      • 刪除集群
  • 插件擴展
    • API 擴展
      • Aggregation
      • CustomResourceDefinition
    • 訪問控制
      • 認證
      • RBAC 授權
      • 准入控制
    • Scheduler 擴展
    • 網絡插件
      • CNI
      • Flannel
      • Calico
      • Weave
      • Cilium
      • OVN
      • Contiv
      • SR-IOV
      • Romana
      • OpenContrail
      • Kuryr
    • 運行時插件 CRI
      • CRI-tools
      • Frakti
    • 存儲插件
      • 容器存儲接口 CSI
      • FlexVolume
      • glusterfs
    • 網絡策略
    • Ingress Controller
      • Ingress + Letsencrypt
      • minikube Ingress
      • Traefik Ingress
      • Keepalived-VIP
    • Cloud Provider 擴展
    • Device 插件
  • 服務治理
    • 服務治理
      • 一般準則
      • 滾動升級
      • Helm
      • Operator
      • Service Mesh
      • Linkerd
      • Linkerd2
    • Istio
      • 安裝
      • 流量管理
      • 安全管理
      • 策略管理
      • 度量管理
      • 排錯
      • 社區
    • Devops
      • Draft
      • Jenkins X
      • Spinnaker
      • Kompose
      • Skaffold
      • Argo
      • Flux GitOps
  • 實踐案例
    • 實踐概覽
    • 資源控制
    • 集群高可用
    • 應用高可用
    • 調試
    • 端口映射
    • 端口轉發
    • 用戶管理
    • GPU
    • HugePage
    • 安全
    • 審計
    • 備份恢復
    • 證書輪換
    • 大規模集群
    • 大數據與機器學習
      • Spark
      • Tensorflow
    • Serverless
  • 排錯指南
    • 排錯概覽
    • 集群排錯
    • Pod 排錯
    • 網絡排錯
    • PV 排錯
      • AzureDisk
      • AzureFile
    • Windows 排錯
    • 雲平臺排錯
      • Azure
    • 排錯工具
  • 社區貢獻
    • 開發指南
    • 單元測試和集成測試
    • 社區貢獻
  • 附錄
    • 生態圈
    • 學習資源
    • 國內鏡像
    • 如何貢獻
    • 參考文檔
Powered by GitBook
On this page
  • Operator 原理
  • 如何創建 Operator
  • 如何使用 Operator
  • 其他示例
  • 與其他工具的關係
  • 參考資料
  1. 服務治理
  2. 服務治理

Operator

PreviousHelmNextService Mesh

Last updated 1 year ago

Operator 是 CoreOS 推出的旨在簡化複雜有狀態應用管理的框架,它是一個感知應用狀態的控制器,通過擴展 Kubernetes API 來自動創建、管理和配置應用實例。

你可以在 上查看 Kubernetes 社區推薦的一些 Operator 範例。

Operator 原理

Operator 基於 CustomResourceDefinition(CRD) 擴展了新的應用資源,並通過控制器來保證應用處於預期狀態。比如 etcd operator 通過下面的三個步驟模擬了管理 etcd 集群的行爲:

  1. 通過 Kubernetes API 觀察集群的當前狀態;

  2. 分析當前狀態與期望狀態的差別;

  3. 調用 etcd 集群管理 API 或 Kubernetes API 消除這些差別。

如何創建 Operator

Operator 是一個感知應用狀態的控制器,所以實現一個 Operator 最關鍵的就是把管理應用狀態的所有操作封裝到配置資源和控制器中。通常來說 Operator 需要包括以下功能:

  • Operator 自身以 Deployment 的方式部署

  • Operator 自動創建一個 CustomResourceDefinition(CRD) 資源類型,用戶可以用該類型創建應用實例

  • Operator 應該利用 Kubernetes 內置的 Serivce/Deployment 等管理應用

  • Operator 應該向後兼容,並且在 Operator 自身退出或刪除時不影響應用的狀態

  • Operator 應該支持應用版本更新

  • Operator 應該測試 Pod 失效、配置錯誤、網絡錯誤等異常情況

(1)安裝 operator-sdk 工具:

$ 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)初始化項目:

$ mkdir memcached-operator
$ cd memcached-operator
$ operator-sdk init --domain example.com --repo github.com/example/memcached-operator

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

$ operator-sdk create api --group cache --version v1alpha1 --kind Memcached --resource --controller

(4)實現 Controller、Reconciler 等控制邏輯。

(5)部署 Operator 到 Kubernetes 集群中,並通過自定義的 CRD 創建資源。

如何使用 Operator

在 Kubernetes 部署 Operator: 通過在 Kubernetes 集群中創建一個 Deploymet 實例,來部署對應的 Operator。具體的 Yaml 示例如下:

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
# 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 是否部署成功:

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

對應的有狀態服務 yaml 文件示例如下:

apiVersion: "etcd.coreos.com/v1beta1"
kind: "Cluster"
metadata:
  name: "example-etcd-cluster"
spec:
  size: 3
  version: "3.1.8"

部署對應的有狀態服務:

# 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 的補充,用來動態保證這些應用的正常運行

參考資料

要創建一個新的 Operator,最簡單的方法使用 。比如,要創建一個最簡單的 Operator,需要以下幾個步驟:

完整的示例可以參考 。

爲了方便描述,以 Etcd Operator 爲例,具體的鏈接可以參考 -。

: cloud-native storage orchestrator

Operator Framework
這裏
Etcd Operator
Prometheus Operator
Rook Operator
Tectonic Operators
https://github.com/sapcc/kubernetes-operators
https://github.com/kbst/memcached
https://github.com/Yolean/kubernetes-kafka
https://github.com/krallistic/kafka-operator
https://github.com/huawei-cloudfederation/redis-operator
https://github.com/upmc-enterprises/elasticsearch-operator
https://github.com/pires/nats-operator
https://github.com/rosskukulinski/rethinkdb-operator
https://github.com/jxlwqq/wordpress-operator
https://github.com/jxlwqq/guestbook-operator
https://github.com/jxlwqq/visitors-operator
https://istio.io/
Kubernetes Operators
Operator Framework
OperatorHub.io
KubeDB: Run production-grade databases easily on Kubernetes
OperatorHub.io
etcd