本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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