Operator-sdk 在 KaiwuDB 容器雲中的使用
一、使用背景
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在騰訊雲容器服務 TKE 中實踐 DevOpsdev
- [Docker]在Ubuntu容器中建立sudo使用者DockerUbuntu
- Docker容器雲在金融行業的應用Docker行業
- Angular HTTPClient API 在 SAP 電商雲中的使用AngularHTTPclientAPI
- 在Openjdk 8 中如何合理使用容器 memory 資源JDK
- 在OpenShift中執行容器
- 在騰訊雲容器服務 TKE 中利用 HPA 實現業務的彈性伸縮
- .Net 在容器中操作宿主機
- 教你在 Ubuntu 上使用 LXC 容器Ubuntu
- 在echarts3中使用字元雲EchartsS3字元
- 在Linux中,如何使用Docker和Kubernetes管理容器?LinuxDocker
- 在 docker 容器中捕獲訊號Docker
- 隔離 docker 容器中的使用者Docker
- C++BUILDER中幾種容器的使用C++UI
- 在Docker中,如何停止所有正在執行的容器?Docker
- 在Docker中,如何清理批次後臺停止的容器?Docker
- Docker在脈衝雲的使用中帶來了哪些優勢?Docker
- 在Linux中,如何在Linux中使用LXD進行容器管理?Linux
- 如何使用阿里雲容器服務保障容器的記憶體資源質量阿里記憶體
- 使用容器快速在阿里雲 ECS 多節點上搭建 Citus 12.1 叢集阿里
- 容器雲對接持久化儲存並使用持久化
- 使用 Rootless Linux 容器保護您的 .NET 雲應用Linux
- 求助,容器雲更新
- 容器雲新手求助
- 從雲端計算到容器到容器雲
- 雲容器雲引擎:容器化微服務,Istio佔C位出道微服務
- 在非容器環境中實現DevOpsdev
- 多容器動態化方案在遊戲SDK中的實踐遊戲
- 在Linux中,如何進行容器技術的應用?Linux
- 使用騰訊雲容器服務玩轉 Nginx IngressNginx
- iota 在 Go 中的使用Go
- REST 在 Java 中的使用RESTJava
- Portworx: 多雲成為使用容器技術的主要驅動力
- 微服務上 AWS 雲, 在使用ALB 的情況下, Eurek 中如何配置微服務
- 3種在雲中利用開源的方法
- Docker命令-docker exec-在執行的容器中執行命令Docker
- Google 計劃在 Chromebook 中增加容器化的 Linux 應用GoChromeLinux
- ConfigMap掛載與Subpath在Nginx容器中的應用Nginx