[英]In kubernetes, is there a way to make statefulset pods linger to finish requests on rolling update?
在 Kubernetes 中,我有一個包含多個副本的狀態集。 我已將 updateStrategy 設置為 RollingUpdate。 我已將 podManagementPolicy 設置為並行。 我的 statefulset 實例沒有持久卷聲明——我使用 statefulset 作為一種以確定性方式將序號 0..(N-1) 分配給 pod 的方法。
在進行滾動更新時,我想要的行為是讓之前的 statefulset pod 在它們上仍有長時間運行的請求處理時停留,但我希望新流量進入 statefulset 中的新 pod。
不幸的是,我看不到這樣做的方法——我錯過了什么?
因為我不使用卷聲明,您可能認為我可以使用部署來代替,但我確實需要每個 pod 都有一個確定性的序號,即:
我能想到的第二好的選擇是使用像 zookeeper 或 etcd 這樣的東西來單獨管理這個屬性,使用一些傳統的長輪詢或領導選舉機制,但考慮到 kubernetes 已經知道(或可以知道)所有必要的位,並且 kubernetes 服務映射知道如何將傳入請求從舊實例引導到新實例,這似乎比必要的更冗余和復雜,所以我想避免這種情況。
我假設您需要這個用於有狀態的工作負載,例如需要寫入的工作負載。 否則,您可以為您的分片在線使用具有多個 pod 的 Deployments。 StatefulSet 的一個關鍵特性是它們為實例提供唯一穩定的網絡身份。
在進行滾動更新時,我想要的行為是讓之前的 statefulset pod 在它們上仍有長時間運行的請求處理時停留,但我希望新流量進入 statefulset 中的新 pod。
Kubernetes pod 支持此行為。 但是您還需要在您的應用程序中實現對它的支持。
SIGTERM
信號將發送到 pod - 您的應用程序可能想要收聽此信號並執行一些操作。有關 pod 終止的更多信息,請參閱Kubernetes 最佳實踐:優雅終止。
請注意,您應該連接到服務而不是直接連接到pod才能正常工作。 例如,您需要為StatefulSet中的副本創建無頭服務。
如果您的客戶端正在連接到特定的無頭服務,例如N
,這意味着它在升級期間的某些時候將不可用。 您需要決定您的客戶是否應該在此時間段內重試連接,或者如果N
不可用,他們是否應該連接到另一個無頭服務。
如果您處於需要的情況下:
那么您需要一種分布式系統形式來執行某種形式的復制/同步,例如使用raft或實現此功能的產品。 這樣的系統最容易部署為 StatefulSet。
您可以使用Container Lifecycle Hooks來執行此操作,特別是preStop
掛鈎。
我們使用它來在 Varnish 服務終止之前耗盡連接。
但是,您需要實施(或找到)一個腳本來執行耗盡操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.