天天看點

OpenKruise:阿裡巴巴 雙11 全鍊路應用的雲原生部署基座

Kruise 是 Cruise 的諧音,'K' for Kubernetes,寓意 Kubernetes 上應用的航行和自動巡行,它滿載着阿裡巴巴多年在大規模應用部署、釋出與管理最佳實踐,以及阿裡雲 Kubernetes 服務數千客戶的需求沉澱。

來源 | 阿裡巴巴雲原生公衆号

作者 | 王思宇(酒祝)

OpenKruise 是由阿裡雲于 2019 年 6 月開源的雲原生應用自動化引擎,本質是基于 Kubernetes 标準擴充出來一個的應用負載項目,它可以配合原生 Kubernetes 使用,并為管理應用容器、sidecar、鏡像分發等方面提供更加強大和高效的能力,進而在不同次元上通過自動化的方式解決 Kubernetes 之上應用的規模化運維和規模化建站問題,包括部署、更新、彈性擴縮容、Qos 調節、健康檢查、遷移修複等等。

OpenKruise:阿裡巴巴 雙11 全鍊路應用的雲原生部署基座

  • OpenKruise 官網:https://openkruise.io/
  • GitHub 項目位址:https://github.com/openkruise/kruise

OpenKruise: 阿裡巴巴 雙11 全鍊路應用的雲原生部署基座

在阿裡巴巴經濟體的整體雲原生化過程當中,阿裡的技術團隊逐漸沉澱出了一套緊貼上遊社群标準、适應網際網路規模化場景的技術理念與最佳實踐。這其中,最重要的無疑是如何對應用進行自動化的釋出、運作和管理。于是,阿裡雲容器團隊将這些能力通過  OpenKruise 反哺社群,以期指引業界雲原生化最佳實踐,少走彎路。

今年 雙11,阿裡巴巴實作了核心系統的全面雲原生化。截至 2020 年 雙11,阿裡巴巴内部已運作近十萬 OpenKruise 的 workload、管理着上百萬容器。

1. 内部運作的 OpenKruise 版本代碼超 95% 來自社群倉庫

下圖展示了阿裡巴巴内部運作的 OpenKruise 版本與開源版本之間的關系:

OpenKruise:阿裡巴巴 雙11 全鍊路應用的雲原生部署基座

從上圖可以看出:Github 上的 OpenKruise 就是我們主體的上遊倉庫,而内部的下遊倉庫隻基于公共接口實作了極少數内部耦合功能(這部分代碼隻占據了不到 5%),也就是說阿裡巴巴内部運作的 OpenKruise 其中 95% 以上的代碼完全來自于社群倉庫。

有兩點值得說明:

  • 所有通用能力,我們都會直接基于開源倉庫開發和送出,然後再同步到内部環境。
  • 社群成員為 OpenKruise 貢獻的每一行代碼,都将運作在阿裡内部環境中。

2. 在 Kubernetes 上自動化應用程式工作負載管理

做上層業務的同學可能對 “應用負載(workload)” 缺乏概念,這裡先簡單做個介紹。不知道你是否有好奇過,每一次應用擴縮容、釋出操作的背後是如何實作的呢?在雲原生的環境下,我們都是通過面向終态的方式去描述應用的部署需求(需要的機器數、鏡像版本等等),見下圖:

OpenKruise:阿裡巴巴 雙11 全鍊路應用的雲原生部署基座

應用負載(workload)主要指的就是這個 YAML 定義和對應的控制器:

當應用擴縮容時,PaaS(運維平台)會修改上述 YAML 對象中的需求機器數(比如擴容 10 台改為 110,再縮容 5 台則改為 105),然後控制器就會按照 workload 期望的數量來調整實際運作的 Pod(容器)數量。當應用觸發釋出或復原時,PaaS(運維平台)則會修改上述 YAML 對象中的鏡像版本和釋出政策,控制器就會按照給指定的釋出政策來将所有管理的 Pod(容器)重建為期望版本(這隻是一些便于了解的簡化描述,實際工作機制會複雜得多)。

也就是說,應用負載(workload)管理着應用所有容器的生命周期。不僅應用擴容、縮容、釋出都依賴于 workload 的工作,workload 還負責持續維持應用運作時的 Pod(容器)數量,來保證持續有符合期望數量的執行個體在跑着。如果有主控端發生故障、上面的應用執行個體被驅逐,那麼 workload 會立即再為應用擴出新的容器。

3. 雙11 核心應用全面基于 OpenKruise 部署

随着阿裡巴巴經濟體上雲,雙11 主體相關的電商類業務、以及中間件等應用都遷移到了雲原生環境下,統一使用 OpenKruise 的應用負載能力做部署。OpenKruise 提供了多種不同類型的 workload 來支援不同的部署方式:

OpenKruise:阿裡巴巴 雙11 全鍊路應用的雲原生部署基座
  • CloneSet:(無狀态應用)這是規模最大的部分,絕大部分泛電商業務都是通過 CloneSet 來部署釋出。
  • Advanced StatefulSet:(有狀态應用)目前主要是用于中間件在雲原生環境的部署。
  • SidecarSet:(sidecar 生命周期管理)可以将定義好的 sidecar 容器動态注入到建立的 Pod 中,雲上的運維容器、 mesh 容器都是通過這種機制加入到業務 Pod 中。
  • Advanced DaemonSet:将主控端級别的守護程序部署到所有節點上,包括各種用于給業務容器配置網絡、存儲的基礎元件。

是以,我們看到從上層電商業務到中間件,再到運維容器、基礎元件,整個上下遊鍊路都是依賴于 OpenKruise 提供的 workload 做部署和運作。不管是應用運作時的機器數量、版本管理,還是緊急擴容、釋出等操作,都有 OpenKruise 無時無刻在維護着。

可以想象,如果 OpenKruise 出現了故障會發生什麼?

  • 如果隻是控制器挂了,則應用擴縮容、釋出操作全量失敗。
  • 而如果控制器邏輯存在重大 bug,比如數量或版本号計算錯誤,甚至可能引起業務容器大規模誤删或是更新為錯誤的版本。

當然,針對以上高危情況,我們做了很多重的防護措施,務必保障業務的穩定可用。

這就是阿裡巴巴的雲上部署基座,OpenKruise 幾乎承載了全量 雙11 業務的部署管理與運維職責。

4. 主要能力

OpenKruise 從何而來?或者說什麼問題或需求促使了 OpenKruise 的誕生呢?

當上雲成為大勢、當雲原生逐漸成為标準,我們卻發現 Kubernetes 原生提供的 workload 能力根本無法滿足阿裡巴巴超大規模業務場景的需求:

  • 應用釋出時,所有容器都要飄移重建:對于我們來說幾乎無法接受,在釋出高峰期如果阿裡巴巴的大規模應用都在大規模重建,這是不管對于業務自身還是其他排程器、中間件、網絡/存儲元件都是一種災難性的壓力。
  • 無狀态應用負載(Deployment)無法灰階更新容器。
  • 有狀态應用負載(StatefulSet)無法并行更新容器。
  • 還有很多,這裡不一一列舉......

在這種背景下,OpenKruise 出現了。我們通過或是全新開發(CloneSet、SidecarSet),或是相容性增強(Advanced StatefulSet、Advanced DaemonSet),來使得上層業務終于可以順利落地雲原生。

OpenKruise 首推的功能就是“原地更新”。通過這種能力,我們終于可以使應用釋出不需要将容器飄移重建,而是在原地、原 Pod 上隻更新需要更新的鏡像。這樣帶來的好處太多了:

  • 釋出效率大大提升。根據不完全統計資料,在大部分業務場景下原地更新至少比完全重建更新提升了 80% 以上的釋出速度:不僅省去了排程、配置設定網絡、配置設定遠端盤的耗時,連拉取新版本鏡像的時候都得益于 node 上已有舊鏡像、隻需要拉取較少的增量 layer。
  • 釋出前後 IP 不變、更新過程 Pod 網絡不斷,并且 Pod 中除了正在更新容器之外的其他容器都一直保持正常運作。
  • Volume 不變,完全複用原容器的挂載裝置。
  • 確定了叢集确定性,使全鍊路壓測通過後的叢集拓撲為大促提供保障。

當然,除此之外我們還增強了許多其他的進階能力,滿足了許多種面向大規模場景下的業務訴求,本文不做一一介紹,但下圖可以看到 OpenKruise 與 Kubernetes 原生應用負載針對無狀态、有狀态應用的功能對比:

OpenKruise:阿裡巴巴 雙11 全鍊路應用的雲原生部署基座

OpenKruise 已正式進入 CNCF Sandbox

2020 年 11 月 11 日,在這個特殊的時點,阿裡巴巴技術人又迎來一件大事:經 CNCF 技術監督委員會全體成員投票,一緻同意将阿裡雲開源的 OpenKruise 正式晉級為 CNCF 托管項目。

正如開篇所說,OpenKruise 已經完成了社群開源,并且内外的版本做到幾乎完全一緻。除此之外,我們還将 OpenKruise 提供到了阿裡雲容器服務的應用目錄中,公有雲上的任意客戶都可以一鍵安裝和使用 OpenKruise,真正實作 OpenKruise 在阿裡集團内部業務、雲産品、開源社群中的“三位一體”。目前在 ACK 上使用 OpenKruise 的客戶主要包括鬥魚 TV、申通、有贊等,而開源社群中攜程、Lyft 等公司也都是 OpenKruise 的使用者和貢獻者。

OpenKruise 将基于阿裡巴巴超大規模場景錘煉出的雲原生應用負載能力開放出來,不僅在雲原生社群中補充了擴充應用負載的重要闆塊,還為雲上客戶提供了阿裡巴巴多年應用部署的管理經驗和雲原生化曆程的最佳實踐成果。從正式開源之日起,OpenKruise 項目已經建立多個關鍵裡程碑:

  • **Maintainer 5 位成員來自阿裡巴巴、騰訊、Lyft **
  • 44 位貢獻者
    • 國内:阿裡雲、螞蟻集團、攜程、騰訊、拼多多...
    • 國外:微軟、Lyft、Spectro Cloud、Dsicord...
  • 1900+ GitHub Stars
  • 300+ Forks

後續,OpenKruise 的重點包括但不限于以下幾個目标:

  • 繼續将阿裡巴巴内部沉澱的通用雲原生應用自動化能力輸出,走可持續的三位一體發展戰略。
  • 深度挖掘細分領域的應用負載需求,比如我們正在探索針對 FaaS 場景的池化能力。
  • 與其他相關領域的開源産品做更緊密的結合,如 OAM/KubeVela 等,打造更完整的雲原生應用體系。

歡迎加入 OpenKruise 大家庭

如果你對 OpenKruise 的發展有任何建議,歡迎發表在下方評論區。另外,你可以通過搜尋釘釘群号:23330762 進入 “OpenKruise 社群交流釘釘群”,我們衷心歡迎每一位開源愛好者來參與 OpenKruise 的建設,共同打造雲原生領域最成熟、面向最大規模的應用自動化引擎。