k8s kubebuilder系列开发 — 理解和剖析 Kubebuilder
原文轉自:微信公眾號云原生CTO
歡迎閱讀 Kubernetes Operator Dev的 N 部分系列的第二部分。
如果你想從理論上了解operator是什么以及它們是如何工作的,請參閱第一部分。
在這一部分,我們將探索如何使用Kubebuilder來簡化operator的編寫。所以,我們讓我們let's go!
Kubebuilder: https://github.com/kubernetes-sigs/kubebuilder
Kubebuilder是什么?
編寫Kubernetes operator涉及到處理Kubernetes API,如創建、觀察、列出對象等。為了解決這個問題,您可以使用像client-go和controller-runtime這樣的抽象庫在Kubernetes集群上執行CRUD操作。但是,即使從頭開始使用它們來編寫一個成熟的operator,最終也會涉及大量的復雜性、學習曲線和樣板代碼來處理。
因此,為了避免這種麻煩,有多種sdk可以幫助我們簡化和加快編寫operator的過程。其中一個是Kubebuilder。
client-go: https://github.com/kubernetes/client-go
controller-runtime: https://github.com/kubernetes-sigs/controller-runtime
Kubebuilder是一個由controller-runtime支持的出色SDK,它可以幫助您輕松快速地在 Go 中編寫Kubernetes operator,方法是處理多種忙碌的事情,例如以組織良好的方式引導大量樣板代碼,設置有用的 Makefile make,目標是構建、運行和部署operator、構建 CRD、設置相關的 Dockefile、RBAC、涉及部署operator的多個 YAML 等等。
在這篇文章中,我們將看到它的實際應用。
但在繼續之前!
我希望盡可能保持本系列文章的示例性和相關性。為了確保這一點,我將以項目優先的方式解釋所有概念和主題。在此過程中,我們將深入到operator的開發中,這樣你們就可以理解Kubernetes operator開發的所有概念以便你們能夠從絕對實用的角度理解和關聯 Kubernetes operator dev的所有概念。最后,一旦我們完成了本系列文章,我們最終會得到一個成熟的 Kubernetes operator,它是從我們經歷的所有概念中逐步誕生的產物
因此,讓我與大家分享我們將要構建的operator,最后,它會是什么樣子
PostgresWriter
我們將在本系列文章中構建的operator名為一個“PostgresWriter”的自定義資源。這個想法很簡單。比方說,我們在世界的某個角落有一個Postgres DB。
與“postgresqlwriter”資源相關的清單如下:
每當將這樣的清單應用/創建到 Kubernetes集群時,我們的operator將捕獲該事件并執行以下三件事:
- 解析spec傳入的“Postgres_writer”資源的創建和識別table,name,age和country`。
- 以<傳入postgres-writer資源的命名空間>/<傳入postgres-writer資源的名稱>的格式(default/sample-student 在本例中)形成與上述傳入“postgres-writer”資源對應的唯一id。
因為在 Kubernetes 中,對于某個資源類型(在我們的例子中是 PostgresWriter),命名空間/名稱組合在整個集群中始終是唯一的。在我們的 Postgres數據庫中插入一個新行,spec.table并相應地使用 spec.name,spec.age和spec.country字段,主鍵將是我們形成的上述唯一 id(命名空間/傳入資源的名稱)。
operator和自定義資源的高級流程
我們的operator在行動中稍微深入的流程
此外,每當PostgresWriter要刪除上述資源時,我們的operator都會DELETE相應地從 PostgresDB 中刪除與該資源對應的行,以保持 PostgresDB 的行和PostgresWriter集群上存在的資源彼此一致。
對于上面的例子,如果我們kubectl delete使用上面的sample-studentPostgresWriter 資源,那么我們的operater將因此刪除與 id對應的行default/sample-student。這將確保對于PostgresWriter我們集群中的每個資源,在我們的 PostgresDB 中只有一行,不多也不少。
所以,讓我們潛入吧!
安裝 Kubebuilder
為了設置我們的項目/operator,我們需要 Kubebuilder。為此,我們需要安裝它 請在您的計算機上安裝 Go。現在,在終端中運行以下幾行來安裝 Kubebuilder
# download kubebuilder and install locally. curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH) chmod +x kubebuilder && mv kubebuilder /usr/local/bin/引導我們的operator讓我們首先為我們的項目/operator創建一個目錄并進入其中。
mkdir -p postgres-writer-operator cd postgres-writer-operator現在是Kubebuilder的神奇部分。運行以下命令來引導我們的項目。
kubebuilder init \ --domain yash.com \ --repo github.com/yashvardhan-kukreja/postgres-writer-operator \ --project-name postgres-writer-operator \ --license apache2 \ --skip-go-version-check 隨意更改--repo``--domain根據您的意愿:)
此命令定義與我們的項目相關的基本通用文件并設置基本依賴項。基本上,它只是一些與您的項目相關的元信息。
但是,這還不夠,因為正如我在我們的operator的描述中提到的,我們的operator將監視一個名為PostgresWriter的自定義資源。由于它是一個自定義資源,我們必須定義它的 CRD,編寫等效的 Go 代碼,將它附加到我們的operator,我們將運行另一個神奇的命令來為我們引導它:)
kubebuilder create api \ --group demo \ --version v1 \ --kind PostgresWriter \ --resource true \ --controller true \ --namespaced true上面的命令將引導所有與PostgresWritercustom資源相關的所需文件和代碼,并將其附加到我們的operator中,使我們可以輕松開始編寫我們喜愛的operator。但像group,controller,namespaces,api這些可怕的術語是什么?
請不要擔心,讓我一步一步,或者逐字逐句地解釋這個命令
kubebuilder ——這是我們使用的引導工具。
create api ——這意味著在我們的項目中執行創建(引導)自定義資源的操作。但是為什么叫它“創建api”而不是“創建operator”呢?
這是因為Kubernetes本身就是一個API驅動的工具,即使通過創建/部署一個operator,我們也只是向Kubernetes添加了一些新的API端點。這就是為什么Kubernetes認為我們在“創建api”。
--group demo --version v1 --kind PostgresWriter ——Kubernetes 中的每種資源type/kind都通過其 group-version-kind(或 GVK)的組合進行唯一標識。因此,Kubernetes API以分層的方式組織資源,而且,GVK 旨在以有組織的方式在 Kubernetes API中放置和集成資源。
要在Kubernetes中識別任何資源的GVK,只需查看其YAML中的apiVersion和kind字段。例如,對于Kubernetes中的Deployment資源,apiVersion是apps/v1,表示它屬于apps組,它的Kind類型是Deployment,它的版本是v1。
在我們的例子中,如果你看下面與我們的PostgresWriterresource對應的樣例YAML,組是demo.yash.com(命令中的" group "參數+ " domain "參數),kind是PostgresWriter,version是v1
--resource true———通過這個,我們告訴 Kubebuilder 我們正在嘗試構建一個自定義資源 PostgresWriter,并且我們希望一些樣板代碼和文件也圍繞我們的自定義資源進行 boostrapped。
--controller true?—— 通過這種方式,我們告訴 Kubebuilder 我們希望我們的operator監視我們的PostgresWriter資源并通過controller協調它來對它采取行動。這將使 Kubebuilder 引導一些圍繞“Reconcile()”方法(協調循環)的樣板代碼,以及使用我們項目的controller runtime管理器設置我們的operator/controller的方法。
--namespaced true ——通過這種方式,我們告訴 Kubebuilder 考慮PostgresWriter將其用作命名空間資源,這與 ClusterRoles、ClusterRoleBindings 等集群范圍的資源不同。
有了上述所有參數和信息,Kubebuilder 將引導基本 CRD、RBAC、Makefile、Reconciliation Loop 周圍的代碼等等。
剖析項目目錄結構
現在,您可能會被執行我在上一節中提到的簡單命令生成的這么多文件嚇壞了。
但別擔心,讓我劇透一下,我們只需要處理兩個文件:controllers/postgreswriter_controller.go和api/v1/postgreswriter_types.go。寫出整個operator。
許多其他東西大多是自動生成的,你不需要弄亂它們。
然而,我仍然很樂意以一種超級快速和簡潔的方式向你們解釋一些在我們的項目中自動生成的重要文件。這是因為,將來您可能會遇到一些特殊情況或一些錯誤,您可能需要手動調整這些文件。這就是這些知識對您有用的地方。另外,當您下次引導operator時,您會知道自己在處理什么,這總是很酷
所以,讓我們剖析一下目錄結構的重要部分。我會自上而下:
api/v1/*.go ——此目錄包含與定義我們的PostgresWriter資源相關的所有文件。我們將相應地編輯postgreswriter_types.go并定義type PostgresWriter struct我們希望我們的PostgresWriter資源具有的結構/模式。由于api/v1/postgreswriter_types.go僅包含我們自定義資源的確切定義(通過各種結構),kubebuilder將PostgresWriter僅基于此文件生成CRD。
bin/* ——它只是包含了像其他一些工具的二進制文件controller-gen,并kustomize將于自舉代碼的某些部分和部署我們的操作是必需的。
config/* —— 此目錄包含圍繞我們的operator和自定義資源的所有 YAML相關內容。YAML 清單類似于roles、rolebindings、CRD、示例演示 YAML 等,都位于此目錄下。
controllers/* ——這是將包含我們的operator的源代碼的地方,即我們operator的協調循環背后的邏輯/代碼,關于觀察PostgresWriter資源和將我們的operator與“管理器”(稍后定義)連接的東西將在這里編程.
main.go ——這是我們運行operator的項目的入口點。這是我們的operator被實例化并附加到我們的“管理器”并執行的地方。
“Manager”是包裝一個或多個控制器/operator并將它們注冊到 Kubernetes集群的組件。在我們的例子中,它只是包裝和注冊一個operator/控制器,即 PostgresWriter。所以基本上,流程是:定義operator/控制器,將其附加/與管理器一起設置并執行管理器。“定義operator/控制器”和“定義與管理器一起設置的方法”在controllers/postgreswriter_controller.go文件中完成(分別查看Reconcile和SetupWithManager方法)。實例化oeprator,用管理器設置它并執行管理器在main.go
hack/* ——此目錄旨在存儲基本的shell腳本或任何其他類型的“hacky”腳本,以自動化我們oeprator周圍的任何類型的操作。例如,運行某些檢查背后的腳本、遞歸格式化/linting代碼的腳本、安裝和設置必備工具的腳本等都將放置在這里。
Makefile ——此文件包含make圍繞構建和部署我們的operator的所有相關目標以及其他內容,例如引導 CRD、實用程序代碼(如帶有控制器生成的 DeepCopy 方法等)。
Dockerfile —— 該文件包含 Dockerfile 腳本/指令,用于將我們的管理器(附有我們的operator并指示運行它)打包到一個 docker 鏡像中,該鏡像可以稍后部署在Kubernetes 集群上。
差不多就是這樣!
下一步是什么?
在下一部分中,我們將從對operator進行編程開始。我們將controllers/postgreswriter_controller.go深入了解其中引導的 Go代碼,我們將對其進行編輯以編程我們的operator的協調循環,即該Reconcile()文件中的方法。我們還將圍繞 Postgres 設置所有方法和客戶端,以使我們的operator與我們的 PostgresDB 對話。最后,我們還將在本地執行我們的operator并第一次看到它的運行情況
尾注!
非常感謝您到達這里。我希望您理解了這篇文章,并對 Kubebuilder 是什么以及它為何如此有用有了一個很好的了解。
我建議你再讀一遍這篇文章,因為我能理解你是否仍然對這么多信息和行話感到困惑。但相信我,一切都會變得更容易。
5.3 參考資料
參考地址 [1]
參考資料
[1]
參考地址: https://yash-kukreja-98.medium.com/develop-on-kubernetes-series-operator-dev-understanding-and-dissecting-kubebuilder-4321d3ecd7d6
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的k8s kubebuilder系列开发 — 理解和剖析 Kubebuilder的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea系列主题推荐:material
- 下一篇: k8s kubebuilder系列开发