簡體   English   中英

在 kubernetes 中,有沒有辦法讓 statefulset pods 逗留以完成滾動更新的請求?

[英]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 都有一個確定性的序號,即:

  • 在調度新服務請求(傳入的 HTTP 請求)時是唯一的
  • 在 Pod 生命周期內持續存在
  • 從 0.. (N-1) 連續

我能想到的第二好的選擇是使用像 zookeeper 或 etcd 這樣的東西來單獨管理這個屬性,使用一些傳統的長輪詢或領導選舉機制,但考慮到 kubernetes 已經知道(或可以知道)所有必要的位,並且 kubernetes 服務映射知道如何將傳入請求從舊實例引導到新實例,這似乎比必要的更冗余和復雜,所以我想避免這種情況。

我假設您需要這個用於有狀態的工作負載,例如需要寫入的工作負載。 否則,您可以為您的分片在線使用具有多個 pod 的 Deployments。 StatefulSet 的一個關鍵特性是它們為實例提供唯一穩定的網絡身份

在進行滾動更新時,我想要的行為是讓之前的 statefulset pod 在它們上仍有長時間運行的請求處理時停留,但我希望新流量進入 statefulset 中的新 pod。

Kubernetes pod 支持此行為。 但是您還需要在您的應用程序中實現對它的支持。

  • 新流量不會發送到您的“舊”廣告連播。
  • SIGTERM信號將發送到 pod - 您的應用程序可能想要收聽此信號並執行一些操作。
  • 在可配置的“終止寬限期”之后,您的 Pod 將被殺死。

有關 pod 終止的更多信息,請參閱Kubernetes 最佳實踐:優雅終止。

請注意,您應該連接到服務而不是直接連接到pod才能正常工作。 例如,您需要為StatefulSet中的副本創建無頭服務

如果您的客戶端正在連接到特定的無頭服務,例如N ,這意味着它在升級期間的某些時候將不可用。 您需要決定您的客戶是否應該在此時間段內重試連接,或者如果N不可用,他們是否應該連接到另一個無頭服務

如果您處於需要的情況下:

  • 有狀態工作負載(例如支持寫操作)
  • 希望您的實例具有高可用性

那么您需要一種分布式系統形式來執行某種形式的復制/同步,例如使用raft或實現此功能的產品。 這樣的系統最容易部署為 StatefulSet。

您可以使用Container Lifecycle Hooks來執行此操作,特別是preStop掛鈎。

我們使用它來在 Varnish 服務終止之前耗盡連接。

但是,您需要實施(或找到)一個腳本來執行耗盡操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM