[英]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 消息(以及 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.