- Kubernetes源碼剖析
- 鄭東旭
- 735字
- 2020-07-23 17:12:15
1.4 Kubernetes Project Layout設計
Kubernetes項目由Go語言編寫。Go語言官方對項目的結構設計沒有強制要求,早期的Go語言開發者都喜歡將包文件代碼放置在項目的src/目錄下,如nsqio開源項目,開發者喜歡將入口文件放入apps/目錄。不同開發者的喜好不同,這導致開源項目的結構設計沒有統一標準。
后來Go語言社區提出Standard Go Project Layout方案,以對Go語言項目目錄結構進行劃分。目前該標準已經成為眾多Go語言開源項目的選擇。
根據Standard Go Project Layout方案,我們對標一下Kubernetes的Project Layout設計,Kubernetes Project Layout結構說明如表1-1所示。
表1-1 Kubernetes Project Layout結構說明

由于Kubernetes項目全球開發者眾多,這導致早期的代碼包較多,尤其是kube-apiserver項目,其內部所引用的代碼包特別多。隨著Kubernetes系統版本的迭代,逐漸將部分包進行了合并,其中staging/目錄為核心包暫存目錄,該目錄下的核心包多以軟連接的方式鏈接到vendor/k8s.io目錄。
Kubernetes系統組件較多,各組件的代碼入口main結構設計風格高度一致,我們以核心組件為例,命令示例如下:

從代碼入口main結構來看,各組件的目錄結構、文件命名都保持高度一致。假設需要新增一個組件,我們甚至可以復制原有的組件代碼,只需簡單修改一下就可以將其運行起來。每個組件的初始化過程也非常類似,初始化過程示意圖如圖1-3所示。

圖1-3 初始化過程示意圖
main結構中定義了進程運行的周期,包括從進程啟動、運行到退出的過程。以kube-apiserver組件為例,kube-apiserver初始化過程如圖1-4所示。

圖1-4 kube-apiserver初始化過程
(1)rand.Seed:組件中的全局隨機數生成對象。
(2)app.NewCommand:實例化命令行參數。通過flags對命令行參數進行解析并存儲至Options對象中。
(3)logs.InitLogs:實例化日志對象,用于日志管理。
(4)command.Execute:組件進程運行的邏輯。運行前通過Complete函數填充默認參數,通過Validate函數驗證所有參數,最后通過Run函數持久運行。只有當進程收到退出信號時,進程才會退出。
Kubernetes其他組件的cmd設計與之類似,故不再重復描述,后續章節會針對每個組件詳細描述其啟動過程。