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