TiDB Operator 源碼閱讀 (一) 序

隨着 TiDB Operator 社區的壯大,越來越多的開發者參與到了 TiDB Operator 的開發中。目前,TiDB Operator 的開發門檻比較高,需要開發者對 TiDB Operator 的代碼進行詳細閱讀之後才能瞭解到項目的全貌。有鑑於此,我們希望系統性地介紹一下 TiDB Operator 的代碼細節,爲剛入門的開發者提供指導,提供一份長期的查閱手冊。通過這一系列文章,我們希望能掃清 TiDB Operator 理解的障礙,讓更多的創意在社區中萌發。

TiDB Operator 的應用場景和能力定位

瞭解 TiDB Operator 處理的應用場景和專注的定位,有助於大家瞭解 TiDB Operator 代碼的功能邊界。

上圖是 TiDB Operator 的架構。其中,TidbCluster、TidbMonitor、TidbInitializer、Backup、Restore、BackupSchedule、TidbClusterAutoScaler 是由 CRD(CustomResourceDefinition)定義的自定義資源。這些 CRD 分別描述以下信息:

  • TidbCluster 用於描述用戶期望的 TiDB 集羣

  • TidbMonitor 用於描述用戶期望的 TiDB 集羣監控組件

  • TidbInitializer 用於描述用戶期望的 TiDB 集羣初始化 Job

  • Backup 用於描述用戶期望的 TiDB 集羣備份 Job

  • Restore 用於描述用戶期望的 TiDB 集羣恢復 Job

  • BackupSchedule 用於描述用戶期望的 TiDB 集羣週期性備份 Job

  • TidbClusterAutoScaler 用於描述用戶期望的 TiDB 集羣自動伸縮規則

TiDB 集羣的編排和調度邏輯則由下列組件負責:

  • tidb-controller-manager 是一組 Kubernetes 上的自定義控制器。這些控制器會不斷對比 TidbCluster 對象中記錄的期望狀態與 TiDB 集羣的實際狀態,並調整 Kubernetes 中的資源以驅動 TiDB 集羣滿足期望狀態,並根據其他 CR 完成相應的控制邏輯。

  • tidb-scheduler 是一個 Kubernetes 調度器擴展,它爲 Kubernetes 調度器注入了 TiDB 集羣拓撲特有的調度邏輯。

  • tidb-admission-webhook 是一個 Kubernetes 動態准入控制器,完成 Pod、StatefulSet 等相關資源的修改、驗證與運維。

TiDB 在 Kubernetes 上運行,藉助了 Deployment,Statefulset,Service,PVC,ConfigMap 等 Kubernetes 原生的資源定義,通過對這些資源的配合使用來運維 TiDB。在 TiDB Operator 的幫助下,用戶只需要描述 TiDB 集羣的規格,如版本,實例數量等,而不需要考慮如何使用 Kubernetes 的資源。 用戶可以使用 YAML 部署 Tidbcluster CR 和 TidbMonitor CR,TiDB Operator 會根據這些 CR 對象的配置要求,驅動 Kubernetes 內相應的資源滿足用戶的期望,最後在滿足用戶要求的狀態下使得 TiDB 正常運行,對外提供正常服務。

TiDB Operator 是從什麼角度給用戶的運維操作帶來了簡化的呢? 舉例來說,用戶需要 3 個 PD 實例,但從配置角度,第一個 PD 實例需要初始化,第二個和第三個 PD 實例則需要加入剛初始化的實例,這樣啓動參數爲 --initial-cluster 和 --join,這個配置就可以由 TiDB Operator 自動生成。

同時,運維中需要通過滾動更新實現 PD 在線升級,如果手工操作,既繁瑣,又難以保證升級過程中不影響在線 PD 業務,在 Kubernetes 中需要使用 Statefulsets 的 UpdateStrategy.Partition 選項控制滾動更新的進度,結合對 PD 服務的監控逐個更新 PD 實例。TiDB Operator 則可以通過 PD API 自動遷移 Leader 並監控更新後的 Pod 是否能正常服務,自動化在線滾動更新流程。這些操作如果通過手動完成,既繁瑣又極易出錯,而我們將這些 TiDB 的運維邏輯編排進 TiDB Operator,幫助用戶簡化 TiDB 運維流程。

從實現上看,TiDB Operator 需要具備與兩個系統交互的能力:一個是與 Kubernetes 交互,使 Kubernetes 側的資源配置和操作能夠滿足 TiDB 正常運行的需求;另一個是 TiDB 組件的 API,即 Operator 需要從 PD 獲取到集羣內部的狀態變化,完成 Kubernetes 這一側相應的資源管理,也要能夠根據用戶需求調用 TiDB 集羣的 API 來完成運維操作。許多小夥伴在已有的 Kubernetes 運維繫統上集成 TiDB 運維能力時,希望獲得一種從 TiDB 系統的視角與這兩個系統交互的運維能力,TiDB Operator 便很好的完成了這一工作。

通過這一系列文檔,我們也希望能幫你瞭解到 TiDB Operator 中的技術細節,方便你將 TiDB Operator 整合進你的業務系統。

內容概要

我們希望在源碼閱讀系列文章中討論以下內容:

  • TiDB Operator 簡介 - 討論 TiDB Operator 需要解決的問題;

  • Operator 模式 - 討論 TiDB Operator 的代碼入口,運行邏輯,Reconcile 循環的觸發;

  • TiDB Operator 的組件 Reconcile Loop 設計 - 討論 TiDB 組件的 Reconcile Loop 的通用設計,並介紹可能的拓展點;

  • TiDB Operator 的 Feature 設計 - 討論備份、Auto-Scaling,、Webhook、Advanced Statefulset、TiDB Scheduler、監控等特性的設計與實現;

  • TiDB Operator 的質量管理 - 討論 TiDB Operator 的質量保證措施,如單元測試、E2E測試。

讀者可以收穫什麼

我們希望在以下場景對你提供幫助:

  1. 幫助你“知其然,且知其所以然”,瞭解功能背後的實現,掃清對 TiDB Operator 的認知盲區,增進你的使用體驗;

  2. 在你希望爲社區貢獻新的功能時,我們希望能幫你找到研究相關問題的入口,瞭解要修改或新增的功能在哪些地方可以着手切入,實現你的需求;

  3. 在你希望將 TiDB Operator 集成到自己的以 Kubernetes 爲基礎的運維繫統時,我們希望通過介紹我們怎樣管理 Kubernetes 資源,怎樣與 TiDB 交互,方便你將 TiDB Operator 接入系統;

  4. 學習 Operator 框架時,TiDB Operator 是很好的範本。目前 Kubernetes 社區有 Kubebuilder、Operator framework 等 Operator 框架,也有 controller-runtime 等封裝較好的 controller 運行時,這些實現方法本質上都是利用 Kubernetes 已有的模塊來封裝複雜的運維邏輯。瞭解 TiDB Operator 的運行邏輯,可以幫你掌握基於 Declaritive API,藉助 Kubernetes 的優秀實現設計更強大且更易於實現的資源管理系統。

小結

這篇文章中,我們主要討論了 TiDB Operator 需要解決的問題以及接下來系列文章的規劃。 在接下來的系列文章中,我們會深入到 TiDB Operator 代碼設計之中,介紹 TiDB Operator 的代碼結構、TiDB Operator 的運行邏輯、TiDB Operator 的功能實現細節、TiDB Operator 的質量管理,以及 TiDB Operator 在 Kubernetes 的 Operator 模式下的編寫的經驗。歡迎你通過 #sig-k8spingcap/tidb-operator 與 TiDB Operator 社區交流互動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章