Kubernetes:本書的參照平台#
Kubernetes 是一套容器編排(container orchestration)平台,源頭可以追溯到 Google 資料中心內部的容器編排系統 Borg。Google 用 Borg 跑自家應用多年,2014 年決定把這些經驗轉化成一個新的開源專案,命名為 Kubernetes(希臘文的「舵手」或「領航員」);2015 年,它成為新成立的雲原生運算基金會(Cloud Native Computing Foundation,CNCF)接收的第一個捐贈專案。
從一開始,Kubernetes 就聚集了龐大的使用者社群,貢獻者數量以驚人的速度成長,如今是 GitHub 上最活躍的專案之一。它不只是目前最常被使用、功能最豐富的容器編排平台,也成為其他平台的地基——其中最具代表性的 PaaS 系統是 Red Hat OpenShift,它在 Kubernetes 之上提供了額外能力,包括在平台內建置應用程式的機制。這些都是本書選擇 Kubernetes 作為雲原生模式參照平台的理由。
本書假設讀者已具備 Kubernetes 的基本知識。第 1 章會重述核心概念,為後續的模式打好基礎。
什麼是設計模式#
設計模式(design pattern)的概念可追溯到 1970 年代的建築領域。建築師與系統理論家亞歷山大(Christopher Alexander)與其團隊在 1977 年出版了開創性的《A Pattern Language》(Oxford University Press),描述了建造城鎮、建築與各類營造工程的架構模式。這個想法稍後被新興的軟體業採納,其中最著名的是 Gamma、Helm、Johnson 與 Vlissides——四人幫(Gang of Four)——所著的《Design Patterns—Elements of Reusable Object-Oriented Software》(Addison-Wesley)。我們今天談單例(Singleton)、工廠(Factory)、委派(Delegation),都源自這部奠基之作。此後各領域陸續出現了不同粒度的模式書,例如 Hohpe 與 Woolf 的《Enterprise Integration Patterns》、Fowler(Martin Fowler)的《Patterns of Enterprise Application Architecture》。
簡言之,模式描述的是某個問題的可重複解法。它與食譜(recipe)不同:食譜給你逐步的操作指令,模式則提供一份藍圖,用來解決一整類相似的問題。以亞歷山大的「啤酒廳」(Beer Hall)模式為例,它描述公共飲酒場所應如何建造,使其成為「陌生人與朋友共飲之處」,而非「孤獨者的錨點」。依循這個模式蓋出來的廳堂外觀各不相同,卻共享相同特徵:可容納四到八人的開放式壁龕、以及一個能讓上百人帶著飲料、音樂與活動聚集的空間。
但模式的價值不只在於提供解法,更在於形成一種語言。獨特的模式名稱構成一套密度極高、以名詞為中心的語言。當這套語言被建立起來,名稱本身就會在人們談論時自動喚起相似的心智圖像。就像說到「桌子」,任何懂中文的人都會假設那是有四隻腳與一個檯面、可以放東西的木製物件;軟體工程裡談到「工廠」,在物件導向的脈絡下我們立刻聯想到「生產其他物件的物件」。因為模式背後的解法已經是共識,我們才能把心力挪去處理尚未解決的問題。
亞歷山大團隊對模式的原始定義是:「每個模式描述一個在我們環境中反覆出現的問題,接著描述該問題解法的核心,其方式使你能將這個解法運用上百萬次,卻不必重複做出一模一樣的東西。」(《A Pattern Language》, 1977, p. x)這個定義同樣適用於本書的模式,只是本書解法的變異程度大概沒那麼高。
模式語言還有其他特性。模式之間彼此連結、可以重疊,合起來覆蓋大部分的問題空間。此外,正如《A Pattern Language》所指出的,模式的粒度與範圍並不一致:較通用的模式覆蓋廣大的問題空間,只能給出粗略指引;較細緻的模式有非常具體的解法提案,適用面卻較窄。本書兩種都有,而且許多模式會引用其他模式,甚至把其他模式納入自身解法的一部分。
模式的另一個特徵是遵循固定格式,但每位作者定義的格式都不同,業界並沒有共通標準。Fowler 在《Writing Software Patterns》中對模式語言的各種格式有精采的整理。
本書的結構#
本書採用一套簡單的模式格式,不特別遵循任何既有的模式描述語言。每個模式都以下列結構呈現:
- 名稱(Name):即章節標題。名稱是模式語言的核心。
- 問題(Problem):交代更寬廣的脈絡,詳述問題空間。
- 解法(Solution):說明此模式如何以 Kubernetes 特有的方式解決問題,並交叉引用相關的、或構成本解法一部分的其他模式。
- 討論(Discussion):在給定脈絡下,討論此解法的優點與缺點。
- 更多資訊(More Information):與該模式相關的延伸資料來源。
全書模式的分部組織如下:
- 第一部・基礎模式(Foundational Patterns):涵蓋 Kubernetes 的核心概念,是建構容器化雲原生應用的底層原則與實踐。
- 第二部・行為模式(Behavioral Patterns):座落於基礎模式之上,為各類容器與平台互動加上更細緻的概念。
- 第三部・結構模式(Structural Patterns):關於如何在 Pod——Kubernetes 平台的原子單位——之內組織容器。
- 第四部・組態模式(Configuration Patterns):說明在 Kubernetes 中處理應用組態的各種方式。這些模式粒度很細,包含把應用連接到其組態的具體配方。
- 第五部・進階模式(Advanced Patterns):進階概念的集合,例如如何擴充平台本身、如何在叢集內直接建置容器映像檔。
一個模式未必只屬於一個分類;依脈絡不同,同一模式可能落在數個分類裡。每個模式章節都是自足的,可以單獨閱讀,也可以任意順序閱讀。
本書寫給誰#
本書寫給想為 Kubernetes 平台設計與開發雲原生應用的開發者。最適合的讀者是已對容器與 Kubernetes 概念有基本認識、想更上一層樓的人。你不需要懂 Kubernetes 的底層細節,也能理解書中的使用案例與模式。架構師、技術顧問與開發者都能從這些可重複套用的模式中獲益。
本書的內容建立在真實專案的使用案例與教訓之上。目標是幫助你寫出更好的雲原生應用——而不是重新發明輪子。
你會學到什麼(以及本書不是什麼)#
書中有些模式乍看像是 Kubernetes 手冊的節錄,但仔細讀會發現這些模式是從概念視角切入,這是同類書籍少見的角度。另一些模式則採取不同取徑,針對非常具體的問題給出詳細指引,例如第四部的組態模式。無論粒度粗細,你都會學到 Kubernetes 針對該模式所提供的一切,並有大量範例佐證。
在開始之前,先說清楚本書不是什麼:
- 不是架設 Kubernetes 叢集的指南。 每個模式與範例都假設你已有可運作的 Kubernetes。若想學如何架設叢集,可參考 Burns 與 Tracey 的《Managing Kubernetes》(O’Reilly),或 Hausenblas 與 Goasguen 的《Kubernetes Cookbook》(O’Reilly)。
- 不是 Kubernetes 入門書,也不是參考手冊。 書中會觸及並詳述許多 Kubernetes 功能,但焦點放在功能背後的概念。第 1 章提供基礎概念的簡短複習。若想找一本全面的 Kubernetes 使用指南,推薦 Lukša(Marko Lukša)的《Kubernetes in Action》(Manning)。
本書以輕鬆的筆調書寫,形式接近一系列可獨立閱讀的隨筆。
本書的排版慣例
模式構成一種簡單而互相連結的語言。為了凸顯這張模式網絡,每個模式在原文中以斜體呈現(例如 Sidecar)。當模式名稱與 Kubernetes 核心概念同名時(如 Init Container 或 Controller),只有在直接指涉該模式本身時才使用這種格式。
其他慣例:
- 所有可以輸入到 shell 或編輯器的內容,都以等寬字型呈現。
- Kubernetes 資源名稱一律以大寫開頭呈現(例如 Pod)。若為複合名稱如 ConfigMap,則保持原樣而不寫成較自然的「config map」,以明確標示這是 Kubernetes 概念。
- 當資源名稱與一般名詞相同(如 service、node)時,只有在指涉資源本身時才使用資源名稱格式。
範例程式碼與授權
每個模式都附有完全可執行的範例,可在本書配套網頁取得;各模式的範例連結列在該章的「更多資訊」一節。該節也收錄大量延伸資料連結,這些清單會在範例儲存庫中持續更新。
所有範例原始碼放在 GitHub。儲存庫與網站也提供如何取得 Kubernetes 叢集來試跑範例的指引。閱讀範例時,也請一併查看提供的資源檔案,裡面有許多有助於理解的註解。
許多範例使用一個叫 random-generator 的 REST 服務,呼叫時會回傳亂數,是專為本書範例設計的。其原始碼同樣在 GitHub,容器映像檔 k8spatterns/random-generator 託管於 Docker Hub。
描述資源欄位時,本書採用 JSON path 記法,例如 .spec.replicas 指向資源 spec 區段中的 replicas 欄位。
所有範例程式碼以 Creative Commons Attribution 4.0(CC BY 4.0)授權散布,可自由用於商業與非商業專案,但複製或再散布時應標註來源出處。