前言
為什麼寫作本書
毫無疑問,雲端平台已成為企業應用的主流支撐平臺,雲端原生作為可最大化雲端平台資源使用率的一套軟體設計原則備受業界推崇。談雲端原生就繞不開Kubernetes,它是雲端原生應用的底座:容器技術的普及加速了單體應用的微服務化,微服務化是實現雲端原生諸多原則的前提條件,而微服務化必須解決服務編排問題,Kubernetes 就是為了解決這個問題而生的。眾所皆知Kubernetes源自Google 內部產品,其前身已歷經大規模應用的實踐考驗,又有大廠做後盾,一經推出便勢如破竹,統一了容器編排領域,成為事實上的標準。從應用層面講解Kubernetes 的書籍與資料已經十分豐富,這使捲動更新、系統自動伸縮、系統自愈等曾經時髦的概念及在Kubernetes 上的配置方式現如今早已深入人心,但作為軟體工程師,不僅可得益於Kubernetes 提供的這些能力,同樣可受益於它內部實現這些能力的方式,理解其精髓可顯著提高工程師的業務水準,而這就鮮有除原始程式之外的優秀資料了,本書希望在一定程度上彌補這方面的缺憾。筆者選取Kubernetes 的核心元件——API Server 進行原始程式碼講解,從程式等級拆解控制器模式、認證控制機制、登入鑑權機制、API Server 聚合機制等,力爭涵蓋API Server 所有核心邏輯。為了緩解理解原始程式的枯燥感,筆者增加數章擴充開發的實踐內容,也使學習與應用相輔相成。
帶領讀者體驗Go 語言魅力是寫作本書的另一個目的。
Go 語言誕生於2007 年,靈感來自一場C++ 新特性佈道會議中發生的討論,現如今已經走過17 個年頭。Go 語言的創立者大名鼎鼎,一位是C 語言建立者Ken Thompson,另一位是UNIX 的開發者Rob Pike,可以說Go 語言的起點相當高。這門新語言確實不辱使命,主流的容器引擎均是用Go 語言開發的,Kubernetes 作為容器編排的事實標準也使用Go 語言開發,單憑這兩項成就就足以證明其價值。
Go 語言在伺服器端應用程式開發、命令列工具程式開發等領域應用越來越廣,作為開發語言界的後起之秀,Go 語言具有後發優勢。以Go 語言開發的應用被編譯為目標平臺的本地應用,所以在效率上相對依賴虛擬機器的應用有優勢;它在語法上比C 語言簡單,記憶體管理也更出眾,具有好用性,而相對C++,Go 語言更簡單,使用者也不用操心指標帶來的安全問題。如果只看語法,則Go 語言是相對簡單的一門程式語言。若有C 語言基礎,則上手速度幾乎可以用小時計,但要充分發揮Go 語言的強悍能力則需對其有較為深入的理解和實踐。為了幫助開發者更進一步地使用它,Go 語言團隊撰寫了Effective Go 一文,舉出諸多使用的最佳實踐,這些最佳實踐在Kubernetes 的原始程式中被廣泛應用,這就使學習Kubernetes 原始程式成為提升Go 語言能力的一條路徑。
目標讀者
本書內容圍繞Kubernetes API Server 原始程式碼展開,力圖型分析清楚它的設計想法,其內容可以幫助以下幾類讀者。
1. 希望提升系統設計能力的開發者
他山之石,可以攻錯。
入門軟體開發並非難事,但要成為高階人才去主導大型系統設計卻實屬不易。優秀架構師在能夠遊刃有餘地揮灑創意之前均進行了常年累積。除了不斷更新技術知識、學習經典設計理論、在實踐中不斷摸索外,從成功專案中汲取養料也是常用的進階之道。Kubernetes 專案足夠成功,其社區成員已是百萬計。它聚數十萬優秀軟體開發人員之力於一點,每個原始檔案、每個函數均經過認真思考與審核,其中考量耐人尋味。從原始程式分碼析Kubernetes 的設計正是本書的立足點。
API Server 所應用的諸多設計實現為開發者提供了有益參考。例如控制器模式、認證控制機制、各種Webhook 機制、登入認證策略、請求過濾的實現、OpenAPI 服務說明的生成、Go 程式生成機制、以Generic Server 為底座的子Server 建構方式等。上述每項設計想法均可應用到其他專案,特別是用Go 語言開發的專案中。
本書中包含大量原始程式碼的講解,需要讀者具有基本的Go 語言語法知識;同時,當涉及Kubernetes 的基本概念和操作時本書不會深入講解,故需要讀者具備Kubernetes 的基礎知識。不過讀者閱讀本書前不必成為這些方面的專家。
2. Kubernetes 運行維護團隊成員、擴充開發人員
知其然且知其所以然始終是做好軟體運行維護工作的有力保證。了解Kubernetes 功能的具體實現可讓運行維護人員對系統能力有更深刻的認識,提升對潛在問題的預判能力,對已出現的故障迅速定位。相較於軟體開發工程師,運行維護工程師一般不具備很強的開發能力,所以探究原始程式會比較吃力。本書有條理地帶領讀者厘清API Server 各個組件的設計,降低了原始程式閱讀的門檻。
筆者始終認為Kubernetes 最強的一面恰恰是它最被忽視的高擴充能力。根據公開報導,科技大廠(如Google、AWS、微軟、字節跳動等)均有利用這些擴充能力做適合自身平臺的客製化。目前講解API Server 客製化的資料並不系統。本書希望將API Server 的客製化途徑講解清楚:既介紹擴充機制的原始程式碼實現,又講解如何利用擴充機制進行客製化開發,希望為擴充開發人員提供相應參考。
3. 希望提升Kubernetes 知識水準的從業者
由表及裡是領會任何技術的自然過程。隨著最近三年線上辦公的火爆,雲端平台的普及大大加速,Kubernetes 作為雲端應用的重要支撐工具已被廣泛應用,一批優秀的系統管理員在成長過程中開始產生深入了解Kubernetes 功能背後原理的需求。拿眾所皆知的捲動更新機制舉例,透過文件可以了解到其幾個參數的含義,但很拗口,並且難記,有不明就裡的感覺,但透過查看Deployment控制器原始程式碼,將這些參數映射到程式的幾個判斷敘述後,一切也就簡單明朗了。
4. Go 語言的使用者
Go 語言的使用者完全可以利用Kubernetes 專案來快速提升自己的專案能力。作為Kubernetes 中最核心也是最複雜的元件,API Server 的原始程式充分表現了Go 語言的多種最佳實踐。讀者會看到管道(channel)如何編織出複雜的Server 狀態轉換網,會看到優雅應用程式碼協同(Go Routine)的方式,也會學習到如何利用函數物件,以及諸多技術的應用方式。透過閱讀API Server 原始程式來提升自身Go 語言水準一舉多得。
5. 期望了解開放原始碼專案的開發者
開放原始碼在過去30 年裡極大地加速了軟體行業的繁榮,在主要的應用領域開放原始碼產品有著頂樑柱的作用,例如Linux、Android、Kubernetes、Cloud Foundry、Eclipse、PostgreSQL 等。軟體開放原始碼早已超出程式共用的範圍,成為一種無私、共同進步的精神象徵。許多軟體從業者以參與開放原始碼專案為榮。
本書在介紹原始程式的同時也展示了Kubernetes 的社區治理,讀者會看到這樣一個百萬人等級的社區角色如何設定,任務怎麼劃分,程式提交流程,品質保證手段。透過這些簡介,讀者可以獲得對開放原始碼專案管理的基礎,為參與其中打下基礎。如果聚焦API Server 這一較小領域,則讀者在本書的幫助下將掌握專案結構和核心程式邏輯,輔以一定量的自我學習便可參與其中。
致謝
特別感謝讀者花時間閱讀本書。本書的撰寫歷經坎坷。準備工作從2022 年便已開始,為了保證嚴謹,筆者翻閱了API Server 的所有原始檔案,讓每個基礎知識都能落實到程式並經得起推敲。寫作則貫穿2023 年一整年,這幾乎佔去了筆者工作之餘、教育兒女之外的所有閒置時間。筆者水準有限,書中仍有可能存在疏漏之處,期望讀者能給予諒解並不吝指正,感激不盡!
筆者深知如果沒有外部的幫助,則很難走到出版這一步,在此感謝所有人的付出。
首先特別感恩筆者所在公司和團隊所提供的機會,讓筆者在過去的多年裡有機會接觸雲端與Kubernetes,並能有深挖的時間。2023 年筆者團隊痛失棟樑,困難時刻團隊成員勇於擔當,共渡難關,讓這本書的寫作得以繼續。謹以此書紀念那位已逝去的同事。
其次感謝家人的付出,作為兩個孩子的父親,沒有家人的分擔是無法從照顧孩子的重任中分出時間寫作的,這本書的問世得益於你們的支援。
感謝清華大學出版社趙佳霓編輯,謝謝您在寫作前的提點、審核協助及校稿過程中的辛勤付出。
張海龍