本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.25:兩個用於應用釋出的特性進階至穩定版
本部落格描述了 SIG Apps 很高興在 Kubernetes 1.25 中釋出為穩定版的兩個特性,即 StatefulSets 的 minReadySeconds
和 DaemonSets 的 maxSurge
。
當在 .spec.updateStrategy
欄位中使用 RollingUpdate
值時,指定 minReadySeconds
可以透過為每個 Pod 等待所需時間來減慢 StatefulSet 的釋出速度。這段時間可用於初始化 Pod(例如,預熱快取)或作為確認 Pod 之前的延遲。
當在 .spec.updateStrategy
欄位中使用 RollingUpdate
值時,maxSurge
允許 DaemonSet 工作負載在釋出期間在節點上運行同一 Pod 的多個例項。這有助於最大限度地減少 DaemonSet 對消費者的停機時間。
這些特性已經在 Deployment 和其他工作負載中可用。這次升級有助於在所有工作負載中統一此功能。
這些特性解決了什麼問題?
StatefulSets 的 minReadySeconds
minReadySeconds
確保 StatefulSet 工作負載在報告 Pod 為 Available
(可用)之前,已經 Ready
(就緒)了給定的秒數。Ready
和 Available
的概念對於工作負載非常重要。例如,某些工作負載,如具有多個 Alertmanager 例項的 Prometheus,只有在 Alertmanager 的狀態轉移完成後才應被視為 Available
。minReadySeconds
在使用雲提供商的負載均衡器時也很有幫助。由於 Pod 應 Ready
給定的秒數,它提供了緩衝時間,以防止在新 Pod 出現之前殺死輪換中的 Pod。
DaemonSets 的 maxSurge
像 CNI、CSI 這樣的 Kubernetes 系統級元件通常作為 DaemonSet 執行。如果這些 DaemonSet 在升級過程中瞬間中斷,可能會影響工作負載的可用性。該特性允許 DaemonSet Pod 臨時增加其數量,從而確保 DaemonSet 的零停機時間。
請注意,不允許在 DaemonSet 中將 hostPort
與 maxSurge
結合使用,因為 DaemonSet Pod 繫結到單個節點,兩個活動的 Pod 不能在同一節點上共享相同的埠。
它是如何工作的?
StatefulSets 的 minReadySeconds
StatefulSet 控制器監視 StatefulSet 的 Pod,並計算特定 Pod 處於 Running
狀態的時長,如果該值大於或等於 StatefulSet 的 .spec.minReadySeconds
欄位中指定的時間,StatefulSet 控制器會更新 StatefulSet 狀態中的 AvailableReplicas
欄位。
DaemonSets 的 maxSurge
DaemonSet 控制器根據 .spec.strategy.rollingUpdate.maxSurge
中給定的值建立額外的 Pod(超出 DaemonSet 規約中期望的數量)。額外的 Pod 將在舊的 DaemonSet Pod 所在的同一節點上執行,直到舊 Pod 被殺死。
- 預設值為 0。
- 當
MaxUnavailable
為 0 時,該值不能為0
。 - 該值可以指定為 Pod 的絕對數量,或期望 Pod 數量的百分比(向上取整)。
我該如何使用它?
StatefulSets 的 minReadySeconds
為任何 StatefulSet 指定一個 minReadySeconds
的值,並使用以下命令檢查 AvailableReplicas
欄位,以檢視 Pod 是否可用
kubectl get statefulset/<statefulset_name> -o yaml
請注意,minReadySeconds
的預設值為 0。
DaemonSets 的 maxSurge
為 .spec.updateStrategy.rollingUpdate.maxSurge
指定一個值,並將 .spec.updateStrategy.rollingUpdate.maxUnavailable
設定為 0
。
然後在下一次釋出中觀察到更快的釋出速度和同時執行的更多 Pod。
kubectl rollout restart daemonset <name_of_the_daemonset>
kubectl get pods -w
我如何瞭解更多資訊?
StatefulSets 的 minReadySeconds
- 文件:https://k8s.io/docs/concepts/workloads/controllers/statefulset/#minimum-ready-seconds
- KEP:https://github.com/kubernetes/enhancements/issues/2599
- API 變更:https://github.com/kubernetes/kubernetes/pull/100842
DaemonSets 的 maxSurge
- 文件:https://k8s.io/docs/tasks/manage-daemon/update-daemon-set/
- KEP:https://github.com/kubernetes/enhancements/issues/1591
- API 變更:https://github.com/kubernetes/kubernetes/pull/96375
我如何參與?
請透過 Slack 上的 #sig-apps 頻道或 SIG Apps 郵件列表 kubernetes-sig-apps@googlegroups.com 與我們聯絡。