Operator-sdk 在 KaiwuDB 容器雲中的使用

KaiwuDB發表於2023-03-14


一、使用背景

KaiwuDB Operator 是一個自動運維部署工具,可以在 Kubernetes 環境上部署 KaiwuDB叢集,藉助 Operator 可實現無縫執行在公有云廠商提供的 Kubernetes 平臺上,讓 KaiwuDB 成為真正的 Cloud-Native 資料庫。


使用傳統的自動化工具會帶來了很高的部署和運維成本,部分自動化部署和運維工具如 Puppet/Chef/SaltStack/Ansible,由於缺乏全域性狀態管理,不能及時對各種異常情況做自動故障轉移,並且很難發揮分散式系統的彈性伸縮能力。除外還需要寫大量的 DSL ,甚至出現與 Shell 指令碼一起混合使用的情況,這將帶來可移植性較差,維護成本比較高等問題。


在雲時代,各大廠商都會提供託管的 Kubernets 叢集,越來越多的應用跑在了 Kubernetes 管理的容器中,傳統部署在 Kubernetes 平臺的應用可以不用繫結在特定雲平臺,也能輕鬆實現在各種雲平臺之間的遷移,其容器化打包和釋出方式也避免了對作業系統環境的依賴。


二、什麼是 Operator

Operator 是由 CoreOS 開發的,用來擴充套件 Kubernetes api,是一個特定的應用程式控制器,它用來建立、配置和管理複雜的有狀態應用,如資料庫、快取和監控系統。Operator 基於 Kubernetes 的資源和控制器的概念構建,但同時又涵蓋了應用程式特定的領域知識。在 Kubernetes 官方文件中,對 Operator 的定義如下:


Operators are software extensions to Kubernetes that make use of custom resources to manage applications and their components. Operators follow Kubernetes principles, notably the control loop.


簡單來說:Operator = 定製資源(CRD) + 控制器。


1. 定製資源(CRD)

Kubernetes 提供了一系列的資源,包括 Statefulset、Service、Configmap 等。但是這些資源並不能完全滿足使用需求,例如在 K8s 中部署 Kaiwu 應用時,需定製一個 Kaiwu 應用資源,CRD(Custom Resource Definition)就承擔了一個說明書的角色,讓 Kubernetes 來認識這個自定義資源 CR。有了 CRD 之後,我們可以自由地增加各種與 Pod 平級的資源。


2. Controller

Controller 的作用就是監聽指定物件的新增、刪除、修改等變化,並針對這些變化做出相應的響應。



三、如何使用Operator-sdk

Operator-sdk 由 CoreOS 開源,它是用於構建 Kubernetes 原生應用的 SDK,它提供更高等級的 api、抽象和專案腳手架。使用 Kubernetes 中原生的物件來部署和管理複雜的應用程式不是那麼容易,尤其是要管理整個應用的生命週期、元件的擴縮容,我們之前通常是編寫各種指令碼,透過呼叫 Kubernetes 的命令列工具來管理 Kubernetes 上的應用。


現在可以透過 CRD(CustomResourceDefinition)來自定義這些複雜操作,透過將運維的知識封裝在自定義 api 裡來減輕運維人員的負擔。同時,我們還可以像操作 Kubernetes 的原生資源物件一樣,使用 kubectl 來操作 CRD。


1. 初始化專案

operator-sdk init --domain inspur.com --repo github.com/inspur/kaiwu-operator

--domain 表示 api 組的字尾;

--repo 表示本工程的 golang 包名。


生成的目錄結構如下:



其中,config 目錄下是所有的 yaml 配置檔案,Dockerfile 用於生成 docker 映象,Makefile 是編譯控制檔案,main.go 是程式入口檔案。


2. 新增 CRD 和 Controller

operator-sdk create api --group kaiwu --version v1 --kind KaiwuCluster --resource=true --controller=true


透過腳手架生成一個 CRD 和 Controller 的 api, 生成了一個目錄包含 api 的結構體定義和Controller 程式碼。在 api/v1 目錄下新增了 3 個 go 檔案,其中最主要檔案是 kaiwucluster_types.go,是對新增 CRD 的定義。



同時增加了一些配置檔案和 Controller:



其中,CRD 目錄下的檔案是對 CRD 的定義,rbac 目錄下的檔案是新增的角色定義,samples目錄下的檔案是建立 CR 的示例檔案。


在新生成的 controllers 資料夾下,kaiwucluster_controller.go 中定義了主要的業務邏輯,主要實現在 Reconcile 函式中:



開發過程中使用的 api 介面包:


  • corev1 “k8s.io/api/core/v1” 核心api,提供核心結構和介面,yaml中常用的 Spec 定義在此。

  • metav1 “k8s.io/apimachinery/pkg/apis/meta/v1” yaml 中常用的 metadata 定義,ObjectMeta,LabelSelector 等基本在此。

  • appsv1 “k8s.io/api/apps/v1” 常用的建立的 CRD 或者已經存在的rd等都在此,比如 Deployments,Pod,Service 等等。


3. 部署執行

方式一:本地執行,主要用於研發和測試階段,在專案根目錄執行:

make generate && make manifests && make install && make run


方式二:叢集部署:

(1)make

$ make generate && make manifests && make install


(2)構建映象

$ make docker-build IMG=inspur/kaiwu-operator:v1
$ docker images |grep kaiwu
inspur/kaiwu-operator v1 d15d88ddd113 About a minute ago 965MB


(3)執行

$ make deploy IMG = inspur/kaiwu-operator:v1


(4)CRD 確認

$ kubectl get crdNAME CREATED ATkaiwuclusters.kaiwu.inspur.com 2022-10-25T08:49:35Z


(5)檢視狀態

$ kubectl get po –n kaiwu-operator-system
NAME READY STATUS RESTARTS AGE
kaiwu-operator-controller-manager-6bb7b666f-2v4nq 1/1 Running 0 12m


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027415/viewspace-2939639/,如需轉載,請註明出處,否則將追究法律責任。

相關文章