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

StatefulSet 的 Minimum Ready Seconds

這篇部落格介紹了 StatefulSet 工作負載的可用性概念,以及 Kubernetes 1.22 中一項新的 alpha 功能,該功能為 StatefulSet 添加了 minReadySeconds 配置。

這解決了什麼問題?

在 Kubernetes 1.22 版本之前,一旦 StatefulSetPod 進入 Ready 狀態,就被認為可以接收流量。對於某些 StatefulSet 工作負載來說,情況並非如此。例如,像 Prometheus 這樣具有多個 Alertmanager 例項的工作負載,它只有在 Alertmanager 的狀態傳輸完成後才應被視為 Available,而不是在 Pod 進入 Ready 狀態時。由於 minReadySeconds 增加了緩衝時間,狀態傳輸可能在 Pod 變為 Available 之前完成。雖然這不是一種萬無一失的識別狀態傳輸是否完成的方法,但它為終端使用者提供了一種表達意圖的方式,即在 Pod 被視為 Available 並準備好服務請求之前等待一段時間。

另一個 minReadySeconds 有幫助的場景是與雲提供商一起使用 LoadBalancer Services 時。由於 minReadySecondsPod 準備就緒後增加了延遲,它提供了緩衝時間,以防止在新 Pod 出現之前殺死輪換中的 Pod。想象一下負載均衡器在非正常情況下需要 10-15 秒才能傳播。如果你有兩個副本,那麼你只會在第一個副本啟動後才殺死第二個副本,但實際上,第一個副本無法被看到,因為它尚未準備好服務請求。

因此,總的來說,StatefulSet 中的 可用性 概念非常有用,此功能有助於解決上述問題。這是 DeploymentsDaemonSets 已有的功能,現在 StatefulSet 也擁有此功能,以提供使用者一致的工作負載體驗。

它是如何工作的?

StatefulSet 控制器會同時監視 StatefulSet 和與之關聯的 Pod。當與此功能關聯的功能門啟用時,StatefulSet 控制器會識別與 StatefulSet 關聯的特定 Pod 處於 Running 狀態的時長。

如果此值大於或等於終端使用者在 .spec.minReadySeconds 欄位中指定的時間,StatefulSet 控制器會更新 StatefulSet 狀態子資源中名為 availableReplicas 的欄位以包含此 PodStatefulSet 狀態中的 status.availableReplicas 是一個整數字段,用於跟蹤 Available 的 Pod 數量。

我該如何使用它?

您需要準備以下事項才能嘗試該功能

  • 下載並安裝 v1.22.0 版本以上的 kubectl
  • kube-apiserverkube-controller-manager 上使用命令列標誌 --feature-gates=StatefulSetMinReadySeconds=true 開啟功能門

成功啟動 kube-apiserverkube-controller-manager 後,您將在狀態中看到 AvailableReplicas,並在 spec 中看到 minReadySeconds(預設值為 0)。

為任何 StatefulSet 指定 minReadySeconds 的值,您可以透過使用以下命令檢查 AvailableReplicas 欄位來檢視 Pod 是否可用:kubectl get statefulset/<statefulset_名稱> -o yaml

我如何瞭解更多資訊?

我如何參與?

請透過 Slack 上的 #sig-apps 頻道與我們聯絡(如果需要邀請,請訪問 https://slack.k8s.io/),或透過 SIG Apps 郵件列表聯絡:kubernetes-sig-apps@googlegroups.com