簡體   English   中英

即使 Kubernetes 就緒探測失敗,Pod 也會收到流量

[英]Pod receives traffic even Kubernetes readiness probe fails

我有一個應用程序,它為 REST 請求提供服務器,並且還在監聽 Kafka 主題。 我將應用程序部署到 Kubernetes 並像這樣配置就緒探針

readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5

基本上遵循[configure-liveness-readiness-startup-probes]的說明

部署完成后,我可以看到 Pod 就緒探測失敗

Readiness probe failed: cat: can't open '/tmp/healthy': No such file or directory

這是意料之中的。 然后我向該主題發送了一條kafka消息。 我觀察到

1)我的應用程序已使用 kafka 消息並保存到數據庫。
2)無法訪問rest api。

我假設如果 pod 的就緒探測失敗,應用程序既不能接收 kafka 消息,也不能接收 rest 請求。 但是為什么在我的測試中,REST 請求和 Kafka 消息的處理方式不同。

根據 Kubernetes 文檔:

The kubelet uses readiness probes to know when a Container is ready to start accepting traffic

但它並沒有明確說明它真正意味着什么樣的流量。 如果就緒探測失敗,kubernetes 是否僅將 http 流量限制到 pod,但不限制 tcp 流量(因為 Kafka 在 tcp 上工作)?

我的實際意圖是讓我的服務應用程序(kafka 消費者)能夠控制何時接收 kafka 消息(以及 REST 請求)。 例如,如果操作繁重,我的服務將刪除 /tmp/healthy 文件,從而使 pod 無法准備好接收 kafka 消息和 Rest 請求。 當繁重的操作完成后,應用程序會寫入健康文件以使 pod 准備好接收消息。

更多信息,在我的測試中,kubernetes 版本是 v1.14.3,並且 kafka 代理在 kubernetes 之外的單獨虛擬機中運行。

這是兩個非常不同的事情:

  • 接收請求外部服務正在發送請求並期待響應。
  • 發送請求:您的服務正在發送請求並等待響應。

就緒探針

當 ReadinessProbe 失敗時,不會有新的請求被路由到 pod

卡夫卡消費者

如果您的 pod 是Kafka 消費者,那么您的pod 正在初始化對 Kafka 的請求,以從主題中檢索消息。

檢查所需目錄

無法打開“/tmp/healthy”:沒有這樣的文件或目錄

如果您的服務需要目錄/tmp/healthy才能正常工作,您的服務應在啟動時檢查它,如果所需目錄不可用,則exit(1) (崩潰並顯示錯誤消息)。 這應該在連接到 Kafka 之前完成。 如果您的應用程序持續使用該目錄,例如寫入該目錄,則應檢查並正確處理任何操作錯誤代碼- 根據您的情況記錄和崩潰。

消費 Kafka 消息

我的實際意圖是讓我的服務應用程序(kafka 消費者)能夠控制何時接收 kafka 消息(以及 REST 請求)。 例如,如果操作繁重,我的服務將刪除 /tmp/healthy 文件,從而使 pod 無法准備好接收 kafka 消息和 Rest 請求。

每當消費者需要時,Kafka 消費者都會輪詢Kafka 以獲取更多數據。 換句話說,當 Kafka 消費者准備好接收更多數據時,它就會請求更多數據。

示例消費者代碼:

 while (true) {
     ConsumerRecords<String, String> records = consumer.poll(100);
     for (ConsumerRecord<String, String> record : records) {
         // process your records
     }
 }

請記住commit您已處理的記錄,以便消息不會被多次處理,例如在崩潰之后。

暫無
暫無

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

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