作者 | 王思宇(酒祝)
來源 | 阿里巴巴雲原生公眾號
背景
OpenKruise 是阿里雲開源的雲原生應用自動化管理套件,也是當前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 項目。它來自阿里巴巴多年來容器化、雲原生的技術沉淀,是阿里內部生產環境大規模應用的基於 Kubernetes 之上的標准擴展組件,緊貼上游社區標准、適應互聯網規模化場景的技術理念與最佳實踐。
新版本概覽
Kruise 在 2021 年 3 月 4 日發布了最新的 v0.8.0 版本(ChangeLog),本文以下對新版本做一個整體的概覽介紹。
1. 新增 kruise-daemon 組件
過去已經使用過 OpenKruise 的同學一定知道,Kruise 安裝之后運行的組件是 kruise-manager,它是一個中心化部署的 Operator 組件,包含了一系列 controller 控制器以及 webhook。
而從 v0.8.0 開始,我們又增加了 kruise-daemon 這個節點組件,通過 DaemonSet 部署到每個節點上。這樣,一直以來社區小伙伴們提的類似鏡像預熱、容器重啟等需求,就有途徑去實現啦!
Tips:
-
目前 kruise 提供的官方鏡像支持 Linux 的 amd64(x86)、arm64、arm/v7 架構,如果你的集群中存在非以上架構的節點,暫時是無法正常運行 kruise-daemon 的,有這類需求的同學可以提issue 說明你的需求。
-
如果你存在上述情況,或者你不希望在某些節點上安裝 kruise-daemon,可以在 helm 安裝的時候通過
daemon.affinity
參數來指定 kruise-daemon 部署的親和性規則。
2. 規模化鏡像預熱能力
在 Kubernetes 生態中,過去並沒有一個成熟的鏡像預熱開源解決方案,可能更多的是一些公司在內部會落地一些適配於本地場景的預熱,這其中也包括阿里巴巴。不過從 v0.8.0 開始,我們將阿里巴巴所做的鏡像預熱能力完全通用化輸出到 OpenKruise 中,並且阿里內部的鏡像預熱也完全統一到這套開源的實現上來了。
OpenKruise 鏡像預熱的具體實現原理,我們會在后續的專項文章中做詳細介紹,這里只以一個最簡單的例子演示下如何做一個鏡像的預熱:
apiVersion: apps.kruise.io/v1alpha1
kind: ImagePullJob
metadata:
name: job-nginx
spec:
image: nginx:1.9.1 # [required] 完整的鏡像名 name:tag
parallelism: 10 # [optional] 最大並發拉取的節點梳理, 默認為 1
selector: # [optional] 指定節點的 名字列表 或 標簽選擇器 (只能設置其中一種),不設置表示全部節點
names:
- node-1
- node-2
matchLabels:
node-type: xxx
completionPolicy:
type: Always # [optional] 默認為 Always
activeDeadlineSeconds: 1200 # [optional] 無默認值, 只對 Alway 類型生效
ttlSecondsAfterFinished: 300 # [optional] 無默認值, 只對 Alway 類型生效
pullPolicy: # [optional] 每個節點上拉鏡像的側臉,默認 backoffLimit=3, timeoutSeconds=600
backoffLimit: 3
timeoutSeconds: 300
ImagePullJob 有兩種 completionPolicy 類型:
Always
表示這個 job 是一次性預熱,不管成功、失敗都會結束activeDeadlineSeconds
:整個 job 的 deadline 結束時間ttlSecondsAfterFinished
:結束后超過這個時間,自動清理刪除 job
Never
表示這個 job 是長期運行、不會結束,並且會每天都會在匹配的節點上重新預熱一次指定的鏡像
詳細信息參考官網文檔:https://openkruise.io/zh-cn/docs/imagepulljob.html
3. SidecarSet 全新重構實現
SidecarSet 是一個用於管理 sidecar 容器的控制器。在用戶創建了 SidecarSet 之后,Kruise 能為后續創建的符合規定條件的 Pod 中自動注入用戶定義的 sidecar 容器,以及對已注入的 sidecar 容器做原地升級同時不影響業務容器的運行。
在過去版本中,SidecarSet 的局限性較多,比如用戶無法聲明只對某個 namespace 生效、sidecar 原地升級時灰度能力較弱等。在 v0.8.0 中,我們全新重構了 SidecarSet 的 controller 和 webhook,並且在 CRD 定義上新增了一些更多能力的策略字段。舉一些例子:
- spec.namespace:指定只管理具體某個命名空間的 sidecar 注入和升級
- 多種注入策略:
- podInjectPolicy:指定 sidecar 容器注入到 Pod 原 containers 列表的前面還是后面
- shareVolumePolicy:與 Pod 中原容器共享卷策略
- transferEnv:從原 Pod 中哪些容器里共享哪些環境變量
- 多種原地升級策略:
- maxUnavailable:升級過程中最大不可用數量
- partition:保留舊版本的數量(灰度/分批發布)
- selector:只升級符合 selector 條件 Pod 中的 sidecar(金絲雀發布)
- scatter:按標簽打散發布
詳細信息參考官網文檔:https://openkruise.io/zh-cn/docs/sidecarset.html
4. 新的 feature-gate 機制
過去 OpenKruise 中的 CRD 以及 controller/webhook 開關,主要配置在 CUSTOM_RESOURCE_ENABLE 環境變量中,而其他一些可配置開關則集中在命令行參數中,帶來的問題一來是較為分散,二來一些關聯多個 CRD 的功能開關其實很難用 CRD 開關來控制。
因此,目前新增的 feature-gate 機制已經代替了 CUSTOM_RESOURCE_ENABLE 環境變量,聚焦於功能層面。
在 v0.8.0 提供了 PodWebhook、KruiseDaemon 兩個開關,前者關閉后 kruise 不會對 pod creation 做 webhook 攔截,但同時也會關閉 SidecarSet 功能,后者關閉后不會部署 kruise-daemon 組件,但同時也會關閉鏡像預熱功能。后續版本中個,我們會逐漸把過去的開關參數統一到 feature-gate 中。
5. 其余一些變化點
其余部分優化:
- CloneSet、Advanced StatefulSet 部分邏輯優化。
- 在官方 DockerHub 之外新增阿里雲托管鏡像,國內用戶可以選擇使用阿里雲鏡像源來安裝/升級 Kruise。
- 調用 apiserver 的 user-agent 細化到控制器。
- clientset 中為支持 scale 子資源的 CRD 新增 GetScale/UpdateScale 方法。
總結
OpenKruise v0.8.0 新版本,可以說是 Kubernetes 社區中首個提供開源的規模化鏡像預熱功能的產品了。而在今年后續的版本里,我們還計划提供利用鏡像預熱來加速應用發布、應用安全防護、Controller 灰度/分片管控等能力,預計在年中將推出 v1.0 大版本。
OpenKruise 是一個成熟的 CNCF 沙箱項目,除了在阿里巴巴內大規模應用之外,在行業內也有着廣泛的用戶案例:
- 基於原地升級、灰度發布等需求,攜程在生產環境使用 CloneSet、AdvancedStatefulSet 來分別管理無狀態、有狀態應用,單集群 Kruise workload 數量達到萬級別。
- OPPO 公司不僅大規模使用了 OpenKruise,還在下游配合其定制化的 Kubernetes 進一步加強了原地升級,廣泛應用在多個業務的后端運行服務中,通過原地更新覆蓋了 87% 左右的升級部署需求。
- 此外,國內的用戶還有斗魚 TV、有贊、蘇寧、比心、Boss 直聘、申通、小紅書、火花思維、VIPKID、掌門教育、杭銀消費、萬翼科技、多點 Dmall、佐疆科技、享住智慧、艾佳生活、永輝科技中心、跟誰學、Deepexi,國外的用戶有 Lyft、Bringg、Arkane Systems、Spectro Cloud 等。
我們歡迎每一位雲原生愛好者共同參與 OpenKruise 的建設,共同打造業界頂尖的雲原生應用自動化引擎!
最后的開源要聞
近期,阿里雲 DADI (Data Accelerator for Disaggregated Infrastructure) 產品開源了!這是一個容器鏡像加速器項目,已經在阿里巴巴內部有了大規模場景的應用。
它的主要原理是消除 image 的下載和解壓縮過程,代之以實現細粒度數據塊的按需拉取。這樣可以削減絕大多數的數據下載工作,同時將計算延遲與數據傳輸延遲相互隱藏,最終達到大幅削減啟動延遲的作用。
DADI 將容器 image 的分層特性與虛擬機 image 的塊設備接口相結合,形成全新的分層塊設備 image,稱為 overlaybd。由於使用了塊設備接口,DADI 可以支持原生文件系統,如 ext4、xfs、甚至 ntfs;塊設備接口也可以自然地支持虛擬化的安全容器,並且只暴露最小的 attack surface。此外由於塊設備 image 簡單高效的特性,overlaybd 可以為用戶提供更好的 I/O 性能。
有興趣的同學可以參考論文看一下 Github 項目哦:
如果大家對 OpenKruise 項目感興趣,有任何希望交流的話題,歡迎大家訪問 OpenKruise 官網、GitHub,以及釘釘搜索群號:23330762,加入交流群!