本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
StatefulSet 的 Minimum Ready Seconds
這篇部落格介紹了 StatefulSet
工作負載的可用性概念,以及 Kubernetes 1.22 中一項新的 alpha 功能,該功能為 StatefulSet
添加了 minReadySeconds
配置。
這解決了什麼問題?
在 Kubernetes 1.22 版本之前,一旦 StatefulSet
的 Pod
進入 Ready
狀態,就被認為可以接收流量。對於某些 StatefulSet
工作負載來說,情況並非如此。例如,像 Prometheus 這樣具有多個 Alertmanager 例項的工作負載,它只有在 Alertmanager 的狀態傳輸完成後才應被視為 Available
,而不是在 Pod
進入 Ready
狀態時。由於 minReadySeconds
增加了緩衝時間,狀態傳輸可能在 Pod
變為 Available
之前完成。雖然這不是一種萬無一失的識別狀態傳輸是否完成的方法,但它為終端使用者提供了一種表達意圖的方式,即在 Pod
被視為 Available
並準備好服務請求之前等待一段時間。
另一個 minReadySeconds
有幫助的場景是與雲提供商一起使用 LoadBalancer
Services
時。由於 minReadySeconds
在 Pod
準備就緒後增加了延遲,它提供了緩衝時間,以防止在新 Pod 出現之前殺死輪換中的 Pod。想象一下負載均衡器在非正常情況下需要 10-15 秒才能傳播。如果你有兩個副本,那麼你只會在第一個副本啟動後才殺死第二個副本,但實際上,第一個副本無法被看到,因為它尚未準備好服務請求。
因此,總的來說,StatefulSet
中的 可用性
概念非常有用,此功能有助於解決上述問題。這是 Deployments
和 DaemonSets
已有的功能,現在 StatefulSet
也擁有此功能,以提供使用者一致的工作負載體驗。
它是如何工作的?
StatefulSet 控制器會同時監視 StatefulSet
和與之關聯的 Pod
。當與此功能關聯的功能門啟用時,StatefulSet 控制器會識別與 StatefulSet
關聯的特定 Pod
處於 Running
狀態的時長。
如果此值大於或等於終端使用者在 .spec.minReadySeconds
欄位中指定的時間,StatefulSet 控制器會更新 StatefulSet
狀態子資源中名為 availableReplicas
的欄位以包含此 Pod
。StatefulSet
狀態中的 status.availableReplicas
是一個整數字段,用於跟蹤 Available
的 Pod 數量。
我該如何使用它?
您需要準備以下事項才能嘗試該功能
- 下載並安裝 v1.22.0 版本以上的 kubectl
- 在
kube-apiserver
和kube-controller-manager
上使用命令列標誌--feature-gates=StatefulSetMinReadySeconds=true
開啟功能門
成功啟動 kube-apiserver
和 kube-controller-manager
後,您將在狀態中看到 AvailableReplicas
,並在 spec 中看到 minReadySeconds
(預設值為 0)。
為任何 StatefulSet 指定 minReadySeconds
的值,您可以透過使用以下命令檢查 AvailableReplicas
欄位來檢視 Pod 是否可用:kubectl get statefulset/<statefulset_名稱> -o yaml
我如何瞭解更多資訊?
- 閱讀 KEP:StatefulSet 的 minReadySeconds
- 閱讀文件:StatefulSet 的最小就緒秒數
- 查閱 StatefulSet 的API 定義
我如何參與?
請透過 Slack 上的 #sig-apps 頻道與我們聯絡(如果需要邀請,請訪問 https://slack.k8s.io/),或透過 SIG Apps 郵件列表聯絡:kubernetes-sig-apps@googlegroups.com