日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenKruise v0.9.0】新增 Pod 重启、删除防护等重磅功能

發布時間:2024/9/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenKruise v0.9.0】新增 Pod 重启、删除防护等重磅功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介:OpenKruise 是阿里云開源的云原生應用自動化管理套件,也是當前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 項目。它來自阿里巴巴多年來容器化、云原生的技術沉淀,是阿里內部生產環境大規模應用的基于 Kubernetes 之上的標準擴展組件,也是緊貼上游社區標準、適應互聯網規?;瘓鼍暗募夹g理念與最佳實踐。

作者 | 王思宇(酒祝)
Photo Creidt@ 王思宇(酒祝)

背景

?
OpenKruise 是阿里云開源的云原生應用自動化管理套件,也是當前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 項目。它來自阿里巴巴多年來容器化、云原生的技術沉淀,是阿里內部生產環境大規模應用的基于 Kubernetes 之上的標準擴展組件,也是緊貼上游社區標準、適應互聯網規?;瘓鼍暗募夹g理念與最佳實踐。
?
OpenKruise 在 2021 年 5 月 20 日發布了最新的 v0.9.0 版本(ChangeLog?),新增了 Pod 容器重啟、資源級聯刪除防護等重磅功能,本文以下對新版本做整體的概覽介紹。
?

Pod 容器重啟/重建

?
“重啟” 是一個很樸素的需求,即使日常運維的訴求,也是技術領域較為常見的 “恢復手段”。而在原生的 Kubernetes 中,并沒有提供任何對容器粒度的操作能力,Pod 作為最小操作單元也只有創建、刪除兩種操作方式。
?
有的同學可能會問,在云原生時代,為什么用戶還要關注容器重啟這種運維操作呢?在理想的 Serverless 模式下,業務只需要關心服務自身就好吧?
?
這來自于云原生架構和過去傳統基礎基礎設施的差異性。在傳統的物理機、虛擬機時代,一臺機器上往往會部署和運行多個應用的實例,并且機器和應用的生命周期是不同的;在這種情況下,應用實例的重啟可能僅僅是一條 systemctl 或 supervisor 之類的指令,而無需將整個機器重啟。然而,在容器與云原生模式下,應用的生命周期是和 Pod 容器綁定的;即常規情況下,一個容器只運行一個應用進程,一個 Pod 也只提供一個應用實例的服務。
?
基于上述的限制,目前原生 Kubernetes 之下是沒有 API 來為上層業務提供容器(應用)重啟能力的。而 Kruise v0.9.0 版本提供了一種單 Pod 維度的容器重啟能力,兼容 1.16 及以上版本的標準 Kubernetes 集群。在安裝或升級 Kruise? 之后,只需要創建 ContainerRecreateRequest(簡稱 CRR) 對象來指定重啟,最簡單的 YAML 如下:

apiVersion: apps.kruise.io/v1alpha1 kind: ContainerRecreateRequest metadata:namespace: pod-namespacename: xxx spec:podName: pod-namecontainers:- name: app- name: sidecar

?
其中,namespace 需要與要操作的 Pod 在同一個命名空間,name 可自選。spec 中 podName 是 Pod 名字,containers 列表則可以指定 Pod 中一個或多個容器名來執行重啟。
?
除了上述必選字段外,CRR 還提供了多種可選的重啟策略:
?

spec:# ...strategy:failurePolicy: FailorderedRecreate: falseterminationGracePeriodSeconds: 30unreadyGracePeriodSeconds: 3minStartedSeconds: 10activeDeadlineSeconds: 300ttlSecondsAfterFinished: 1800
  • failurePolicy:Fail 或 Ignore,默認 Fail;表示一旦有某個容器停止或重建失敗,CRR 立即結束。
  • orderedRecreate:默認 false;true 表示列表有多個容器時,等前一個容器重建完成了,再開始重建下一個。
  • terminationGracePeriodSeconds:等待容器優雅退出的時間,不填默認用 Pod 中定義的時間。
  • unreadyGracePeriodSeconds:在重建之前先把 Pod 設為 not ready,并等待這段時間后再開始執行重建。

    • 注:該功能依賴于 KruisePodReadinessGate 這個 feature-gate 要打開,后者會在每個 Pod 創建的時候注入一個 readinessGate。否則,默認只會給 Kruise workload 創建的 Pod 注入 readinessGate,也就是說只有這些 Pod 才能在 CRR 重建時使用 unreadyGracePeriodSeconds。
  • minStartedSeconds:重建后新容器至少保持運行這段時間,才認為該容器重建成功。
  • activeDeadlineSeconds:如果 CRR 執行超過這個時間,則直接標記為結束(未完成的容器標記為失敗)。
  • ttlSecondsAfterFinished:CRR 結束后,過了這段時間自動被刪除掉。

實現原理:當用戶創建了 CRR 后,經過了 kruise-manager 中心端的初步處理,會被 Pod 所在節點上的 kruise-daemon 收到并開始執行。執行的過程如下:
?

  • 如果 Pod 容器定義了 preStop,kruise-daemon 會先走 CRI 運行時 exec 到容器中執行 preStop。
  • 如果沒有 preStop 或執行完成,kruise-daemon 調用 CRI 接口將容器停止。
  • kubelet 感知到容器退出,則會新建一個 “序號” 遞增的新容器,并開始啟動(以及執行 postStart)。
  • kruise-daemon 感知到新容器啟動成功,上報 CRR 重啟完成。
  • 上述的容器 “序號” 其實就對應了 Pod status 中 kubelet 上報的 restartCount。因此,在容器重啟后會看到 Pod 的 restartCount 增加。另外,因為容器發生了重建,之前臨時寫到舊容器 rootfs 中的文件會丟失,但是 volume mount 掛載卷中的數據仍然存在。
    ?

    級聯刪除防護

    ?
    Kubernetes 的面向終態自動化是一把 “雙刃劍”,它既為應用帶來了聲明式的部署能力,同時也潛在地會將一些誤操作行為被終態化放大。例如它的 “級聯刪除” 機制,即正常情況(非 orphan 刪除)下一旦父類資源被刪除,則所有子類資源都會被關聯刪除:
    ?

  • 刪除一個 CRD,其所有對應的 CR 都被清理掉。
  • 刪除一個 namespace,這個命名空間下包括 Pod 在內所有資源都被一起刪除。
  • 刪除一個 workload(Deployment/StatefulSet/...),則下屬所有 Pod 被刪除。
  • 類似這種 “級聯刪除” 帶來的故障,我們已經聽到不少社區 K8s 用戶和開發者帶來的抱怨。對于任何一家企業來說,其生產環境發生這種規模誤刪除都是不可承受之痛,阿里巴巴也不例外。
    ?
    因此,在 Kruise v0.9.0 版本中,我們將阿里內部所做的防級聯刪除能力輸出到社區,期望能為更多的用戶帶來穩定性保障。在當前版本中如果需要使用該功能,則在安裝或升級 Kruise 的時候需要顯式打開 ResourcesDeletionProtection 這個 feature-gate。
    ?
    對于需要防護刪除的資源對象,用戶可以給其打上 policy.kruise.io/delete-protection 標簽,value 可以有兩種:
    ?

    • Always: 表示這個對象禁止被刪除,除非上述 label 被去掉。
    • Cascading:這個對象如果還有可用的下屬資源,則禁止被刪除。

    目前支持的資源類型、以及 cascading 級聯關系如下:
    ?

    CloneSet 新增功能

    ?

    1. 刪除優先級

    ?
    controller.kubernetes.io/pod-deletion-cost? 是從 Kubernetes 1.21 版本后加入的 annotation,ReplicaSet 在縮容時會參考這個 cost 數值來排序。CloneSet 從 Kruise v0.9.0 版本后也同樣支持了這個功能。
    ?
    用戶可以把這個 annotation 配置到 pod 上,它的 value 數值是 int 類型,表示這個 pod 相較于同個 CloneSet 下其他 pod 的 "刪除代價",代價越小的 pod 刪除優先級相對越高。沒有設置這個 annotation 的 pod 默認 deletion cost 是 0。
    ?
    注意這個刪除順序并不是強制保證的,因為真實的 pod 的刪除類似于下述順序:
    ?

  • 未調度 < 已調度
  • PodPending < PodUnknown < PodRunning
  • Not ready < ready
  • 較小 pod-deletion cost < 較大 pod-deletion cost
  • 處于 Ready 時間較短 < 較長
  • 容器重啟次數較多 < 較少
  • 創建時間較短 < 較長
  • 2. 配合原地升級的鏡像預熱

    ?
    當使用 CloneSet 做應用原地升級時,只會升級容器鏡像、而 Pod 不會發生重建。這就保證了 Pod 升級前后所在 node 不會發生變化,從而在原地升級的過程中,如果 CloneSet 提前在所有 Pod 節點上先把新版本鏡像拉取好,則在后續的發布批次中 Pod 原地升級速度會得到大幅度提高。
    ?
    在當前版本中如果需要使用該功能,則在安裝或升級 Kruise 的時候需要顯式打開 PreDownloadImageForInPlaceUpdate 這個 feature-gate。打開后,當用戶更新了 CloneSet template 中的鏡像、且發布策略支持原地升級,則 CloneSet 會自動為這個新鏡像創建 ImagePullJob 對象(OpenKruise 提供的批量鏡像預熱功能),來提前在 Pod 所在節點上預熱新鏡像。
    ?
    默認情況下 CloneSet 給 ImagePullJob 配置的并發度是 1,也就是一個個節點拉鏡像。如果需要調整,你可以在 CloneSet annotation 上設置其鏡像預熱時的并發度:
    ?

    apiVersion: apps.kruise.io/v1alpha1 kind: CloneSet metadata:annotations:apps.kruise.io/image-predownload-parallelism: "5"

    ?

    3. 先擴再縮的 Pod 置換方式

    ?
    在過去版本中,CloneSet 的 maxUnavailable、maxSurge 策略只對應用發布過程生效。而從 Kruise v0.9.0 版本開始,這兩個策略同樣會對 Pod 指定刪除生效。
    ?
    也就是說,當用戶通過 podsToDelete 或 apps.kruise.io/specified-delete: true 方式(具體見官網文檔)來指定一個或多個 Pod 期望刪除時,CloneSet 只會在當前不可用 Pod 數量(相對于 replicas 總數)小于 maxUnavailable 的時候才執行刪除。同時,如果用戶配置了 maxSurge 策略,則 CloneSet 有可能會先創建一個新 Pod、等待新 Pod ready、再刪除指定的舊 Pod。
    ?
    具體采用什么樣的置換方式,取決于當時的 maxUnavailable 和實際不可用 Pod 數量。比如:
    ?

    • 對于一個 CloneSet maxUnavailable=2, maxSurge=1 且有一個 pod-a 處于不可用狀態, 如果你對另一個 pod-b 指定刪除, 那么 CloneSet 會立即刪除它,然后創建一個新 Pod。
    • 對于一個 CloneSet maxUnavailable=1, maxSurge=1 且有一個 pod-a 處于不可用狀態, 如果你對另一個 pod-b 指定刪除, 那么 CloneSet 會先新建一個 Pod、等待它 ready,最后再刪除 pod-b。
    • 對于一個 CloneSet maxUnavailable=1, maxSurge=1 且有一個 pod-a 處于不可用狀態, 如果你對這個 pod-a 指定刪除, 那么 CloneSet 會立即刪除它,然后創建一個新 Pod。
    • ...

    4. 基于 partition 終態的高效回滾

    ?
    在原生的 workload 中,Deployment 自身發布不支持灰度發布,StatefulSet 有 partition 語義來允許用戶控制灰度升級的數量;而 Kruise workload 如 CloneSet、Advanced StatefulSet,也都提供了 partition 來支持灰度分批。
    ?
    對于 CloneSet,Partition 的語義是保留舊版本 Pod 的數量或百分比。比如說一個 100 個副本的 CloneSet,在升級鏡像時將 partition 數值階段性改為 80 -> 60 -> 40 -> 20 -> 0,則完成了分 5 批次發布。
    ?
    但過去,不管是 Deployment、StatefulSet 還是 CloneSet,在發布的過程中如果想要回滾,都必須將 template 信息(鏡像)重新改回老版本。后兩者在灰度的過程中,將 partition 調小會觸發舊版本升級為新版本,但再次 partition 調大則不會處理。
    ?
    從 v0.9.0 版本開始,CloneSet 的 partition 支持了 “終態回滾” 功能。如果在安裝或升級 Kruise 的時候打開了 CloneSetPartitionRollback 這個 feature-gate,則當用戶將 partition 調大時,CloneSet 會將對應數量的新版本 Pod 重新回滾到老版本。
    ?
    這樣帶來的好處是顯而易見的:在灰度發布的過程中,只需要前后調節 partition 數值,就能靈活得控制新舊版本的比例數量。但需要注意的是,CloneSet 所依據的 “新舊版本” 對應的是其 status 中的 updateRevision 和 currentRevision:
    ?

    • updateRevision:對應當前 CloneSet 所定義的 template 版本。
    • currentRevision:該 CloneSet 前一次全量發布成功的 template 版本。

    5. 短 hash

    ?
    默認情況下,CloneSet 在 Pod label 中設置的 controller-revision-hash 值為 ControllerRevision 的完整名字,比如:

    apiVersion: v1 kind: Pod metadata:labels:controller-revision-hash: demo-cloneset-956df7994

    它是通過 CloneSet 名字和 ControllerRevision hash 值拼接而成。通常 hash 值長度為 8~10 個字符,而 Kubernetes 中的 label 值不能超過 63 個字符。因此 CloneSet 的名字一般是不能超過 52 個字符的,如果超過了,則無法成功創建出 Pod。
    ?
    在 v0.9.0 版本引入了 CloneSetShortHash 新的 feature-gate。如果它被打開,CloneSet 只會將 Pod 中的 controller-revision-hash 的值只設置為 hash 值,比如 956df7994,因此 CloneSet 名字的長度不會有任何限制了。(即使啟用該功能,CloneSet 仍然會識別和管理過去存量的 revision label 為完整格式的 Pod。)
    ?

    SidecarSet

    ?

    sidecar 熱升級功能

    ?
    SidecarSet 是 Kruise 提供的獨立管理 sidecar 容器的 workload。用戶可以通過 SidecarSet,來在一定范圍的 Pod 中注入和升級指定的 sidecar 容器。
    ?
    默認情況下,sidecar 的獨立原地升級是先停止舊版本的容器,然后創建新版本的容器。這種方式更加適合不影響Pod服務可用性的sidecar容器,比如說日志收集 agent,但是對于很多代理或運行時的 sidecar 容器,例如 Istio Envoy,這種升級方法就有問題了。Envoy 作為 Pod 中的一個代理容器,代理了所有的流量,如果直接重啟升級,Pod 服務的可用性會受到影響。如果需要單獨升級 envoy sidecar,就需要復雜的 grace 終止和協調機制。所以我們為這種 sidecar 容器的升級提供了一種新的解決方案,即熱升級(hot upgrade)。
    ?

    apiVersion: apps.kruise.io/v1alpha1 kind: SidecarSet spec:# ...containers:- name: nginx-sidecarimage: nginx:1.18lifecycle:postStart:exec:command:- /bin/bash- -c- /usr/local/bin/nginx-agent migrateupgradeStrategy:upgradeType: HotUpgradehotUpgradeEmptyImage: empty:1.0.0
    • upgradeType: HotUpgrade代表該sidecar容器的類型是hot upgrade,將執行熱升級方案hotUpgradeEmptyImage: 當熱升級sidecar容器時,業務必須要提供一個empty容器用于熱升級過程中的容器切換。empty容器同sidecar容器具有相同的配置(除了鏡像地址),例如:command, lifecycle, probe等,但是它不做任何工作。
    • lifecycle.postStart: 狀態遷移,該過程完成熱升級過程中的狀態遷移,該腳本需要由業務根據自身的特點自行實現,例如:nginx熱升級需要完成Listen FD共享以及流量排水(reload)。

    具體 sidecar 注入和熱升級流程,請參考官網文檔。

    最后

    ?
    了解上述能力的更多信息,可以訪問官網文檔。對 OpenKruise 感興趣的同學歡迎參與我們的社區建設,已經使用了 OpenKruise 項目的用戶請在 issue? 中登記。
    ?

    釘釘搜索群號 23330762 加入釘釘交流群!

    原文鏈接:https://developer.aliyun.com/article/784453?

    版權聲明:本文內容由阿里云實名注冊用戶自發貢獻,版權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻刪除涉嫌侵權內容。

    總結

    以上是生活随笔為你收集整理的【OpenKruise v0.9.0】新增 Pod 重启、删除防护等重磅功能的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。