本文同步刊登於個人技術部落格,有興趣關注更多 Kubernetes、DevOps 相關資源的讀者,請務必追蹤從零開始的軟體工程師之旅,喜歡的話幫我按讚分享、歡迎留言、或是許願想要看的文章。
如果有技術問題也可透過粉絲專頁 討論,技術方面諮詢免錢、需要動手做另計 XD。
這是原文完整版本。好讀版請見 Borg Omega and Kubernetes 前世今生摘要
完整英文原文請見 Borg, Omega, and Kubernetes - Lessons learned from three containermanagement systems over a decade
Borg 的初衷只是分配不同的工作附載 (workload) 到相同的機器上,來提升資源使用率。然而 Borg 生態系中,支援系統的快速演化,表明容器管理系統本身只是一個起點:通往一個新的分散式系統開發與管理環境。許多新的系統在 Borg 上打造、嵌入 Borg、或是圍繞 Borg 打造,提升 Borg 的基本容器管理服務,底下是部分服務清單:
這些服務都是用來處理開發團隊面臨的問題,Google 選出成功的服務並廣泛的應用,讓工程師工作更加輕鬆。
然而這些工具大多各自需要特別的 (idiosyncratic) API,例如需要知道檔案的位置,也需要 Borg 的深度整合。產生一個不好的副作用,就是部屬 Borg 生態系變得更複雜了。
Kubernetes 試圖降低這些複雜度,因此導入一致性設計的 API (consistent API),例如每個 Kubernetes 物件都會有三個基礎內容:
所有物件的 ObjectMetadata 都是一樣的,包含
Spec 與 Status 的內容因物件型別有所不同,但核心概念一致:
統一 API 帶來很多好處,從系統獲取資訊更加簡單:
從 Borg 與 Omega 中的經驗學習,所以 Kubernetes 是一堆組合的區塊打造而成,使用者還可以自行擴展。有統一的 API 以及 object-metadata 結構讓這件事更簡單。例如
一致性的促成也仰賴 Kubernetes 自身 API 的解藕。把各自元件的面向拆開,讓更高階的服務共享相同的底層基礎實作。例如
API 解藕也讓許多關聯,但是不盡相同的元件構成近似。例如 Kubernetes 有三個形式的副本 Pod:
雖然有各自的執行政策 (policy) ,三個控制器都有相同的 Pod 物件,描述希望執行的容器。
一致性也仰賴 Kubernetes 內部元件的相同設計模式 (design patterns)。控制器調和迴圈 (reconciliation controller loop) 是 Borg、Omega、Kubernetes 都共享的設計理念,為了提升系統的彈性:
Kubernetes 設計成一堆微服務 (microservice) 的組合,並透過各個小型的控制迴圈 (control loop),來達成整體的編排結果 (choreography) 單一個期望的狀態,由各個分散的自動元件,協作達成。這個意識的設計選擇,對比中心化協調管理系統 (centralized orchestration),後者更容易建構,但面對不可預期的錯誤與變更時,更顯脆弱與僵化。
明日待續:Google 十餘年的容器化技術,前車之鑑 (Things to avoid)