Airbnb 如何簡化 1000 多位工程師的 Kubernetes 工作流程?
Melanie Cebula 談到,Airbnb 採用了內部工具和策略以支援 1000 多位工程師同時為 Kubernetes 配置和部署 250 多個關鍵服務。一個關鍵的推動因素是,使用標準化的環境和名稱空間(以及儘可能的自動驗證)從更高階的原語中抽象和生成 Kubernetes 配置層。
Airbnb 的架構工程師 Melanie Cebula 在倫敦 QCon 大會上做了演講,她談到 Airbnb 採用了內部工具和策略以支援 1000 多位工程師(以每天平均大約 500 個部署的頻率)併發配置和部署 250 多個關鍵服務給 Kubernetes。一個關鍵的推動因素是,使用標準化的環境和名稱空間(以及儘可能的自動驗證)從更高階的原語中抽象和生成 Kubernetes 配置層。
kube-gen 是 Airbnb 的內部工具,其可以獲取服務的引數(在單個 YAML 檔案中定義),並通過新增所有必要的樣板配置來生成完整的 Kubernetes 服務配置。過去,Airbnb 使用檔案繼承機制來進行配置(就像 Chef cookbooks),這導致了級聯基礎設施故障影響。因此,目標之一是,通過使用 YAML 模板進行服務配置來減少潛在錯誤的影響範圍。
kube-gen 的另一個主要目標是,抽象出 Kubernetes 配置和工具複雜性,以便使工程團隊能夠保留其服務部署的所有權,並具備必要的隔離級別(部分基於標準化環境名字,由自動生成的名稱空間保證),但是沒有過長的學習曲線。儘管 kube-gen 因為解決的是 Airbnb 的具體情況而還未公開,但 Cebula 指出有一些開源替代品,如 helm(包管理),kustomize(通過檔案繼承配置)和 Kapitan(通過模板配置)。
圖片:https://uploader.shimo.im/f/I8Uuf5cdF5cPpj7z.png
圖:在自定義 YAML 中,服務配置檔案被轉換成 Kubernetes 所需的配置檔案(每個環境在自定義 YAML 中定義一個配置檔案集),然後應用於 Kubernetes 叢集(來源:Airbnb 的 Melanie Cebula)
促進同質並易於發展的服務配置的進一步策略包括:在一個命令中建立一個新的服務框架儲存庫,在構建和部署配置檔案時驗證(不僅包括語法,還有所提供的值中的已知問題,如:無效的專案名字或所有者),並且對(生成的)服務配置進行版本控制。
一個新建立的服務 git 儲存庫包括應用程式和基礎設施樣板檔案(包括 CI/CD),自動填充合理的預設值和良好實踐(如預設的自動擴充套件或文件生成)。版本控制服務配置(在 YAML 檔案中有個特定欄位)允許標記有問題的版本(因而它們不會被重新部署),這些可以是 kube-gen 自身的問題或特定於服務的問題,也可以是在不同的渠道上分發的不同的版本(例如,穩定版或測試版)。
圖片:https://uploader.shimo.im/f/Sa34d9vW7B0GvhL2.png
圖:Airbnb 服務配置 YAML 檔案示例,包括一個版本欄位(來源:Airbnb 的 Melanie Cebula)
k 是 Airbnb 的另一個內部工具。k 主要是 kubectl 的自用包裝器,它還過濾掉了 kubectl 的一些冗長輸出。k 還支援一些額外功能,像包裝之前提到的 kube-gen 工具,構建 / 推送 Docker 映象。
該工具的目標是自動化通用工作流,從而通過抽象一些 Kubernetes 工具的複雜性來簡化和標準化工程工作。但是,它還讓開發人員和基礎設施工程師們使用一種共同的語言,並使用相同工具增強協作,Cebula 如此說道。
一個典型的工作流程從 k generate 生成 Kubernetes 檔案開始,然後,k build 來構建 Docker 映象並推送到私有倉庫,最後,k deploy 來建立 Kubernetes 名稱空間並應用 Kubernetes 檔案,等待最終部署狀態。無論哪種環境(即本地計算機、CI、階段或生產),服務的構建和部署都是採用同樣的方式。它還可以執行 k diagnose,其依賴於一些 Airbnb 建立的外掛:kubectl diagnose 和 kubectl pod events。目的是,在除錯部署問題時,自動執行常見的手動操作步驟:收集未滿容器上的資訊,查詢相關的 pod events 並針對這些容器獲取日誌。
最後,Cebula 提到了 Airbnb 的 Kubernetes 採用過程中一些仍然存在的挑戰,特別是與數千現有服務的遷移相關的,這些服務要求更好的多叢集支援和擴充套件(一些服務要用多達數百個副本),處理更多具有高記憶體需求的有狀態服務,以及用自定義控制器將所有配置移至 GitOps 工作流模型。