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