天天看點

OpenKruise v0.8.0 版本釋出:K8s 社群首個規模化鏡像預熱能力背景新版本概覽總結最後的開源要聞

OpenKruise v0.8.0 版本釋出:K8s 社群首個規模化鏡像預熱能力背景新版本概覽總結最後的開源要聞

作者 | 王思宇(酒祝)

來源 |

阿裡巴巴雲原生公衆号

背景

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 部署到每個節點上。這樣,一直以來社群小夥伴們提的類似鏡像預熱、容器重新開機等需求,就有途徑去實作啦!

OpenKruise v0.8.0 版本釋出:K8s 社群首個規模化鏡像預熱能力背景新版本概覽總結最後的開源要聞

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 定義上新增了一些更多能力的政策字段。舉一些例子:

  1. spec.namespace:指定隻管理具體某個命名空間的 sidecar 注入和更新
  2. 多種注入政策:
    1. podInjectPolicy:指定 sidecar 容器注入到 Pod 原 containers 清單的前面還是後面
    2. shareVolumePolicy:與 Pod 中原容器共享卷政策
    3. transferEnv:從原 Pod 中哪些容器裡共享哪些環境變量
  3. 多種原地更新政策:
    1. maxUnavailable:更新過程中最大不可用數量
    2. partition:保留舊版本的數量(灰階/分批釋出)
    3. selector:隻更新符合 selector 條件 Pod 中的 sidecar(金絲雀釋出)
    4. 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,加入交流群!

繼續閱讀