本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.25:兩項應用程式發布功能升級為穩定版
本部落格說明 SIG Apps 很高興在 Kubernetes 1.25 中升級至穩定的兩項功能,即 StatefulSets 的 minReadySeconds
和 DaemonSets 的 maxSurge
。
當在 .spec.updateStrategy
欄位中使用 RollingUpdate
值時,指定 minReadySeconds
會減慢 StatefulSet 的推出速度,方法是等待每個 pod 達到所需的時間。此時間可用於初始化 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
Kubernetes 系統級元件(如 CNI、CSI)通常作為 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 名稱> -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 與我們聯絡。