我有一个应用程序,该服务器可以处理REST请求,并且还在侦听Kafka主题。 我将应用程序部署到了Kubernetes并配置了就绪探针,像这样
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
基本上遵循[configure-liveness-readiness-startup-probes]的指示
部署完成后,我可以看到Pod Readiness探针失败
Readiness probe failed: cat: can't open '/tmp/healthy': No such file or directory
这是预期的。然后,我向该主题发送了kafka消息。我观察到
1)kafka消息已被我的应用程序占用并保存到数据库。
2)其余的api无法访问。
我假设,如果Pod的准备就绪探针失败,则该应用程序既不会收到kafka消息,也不会收到其余请求。但是为什么在我的测试中,REST请求和Kafka消息的处理方式不同。
根据Kubernete文档:
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 broker在kubernetes之外的单独虚拟机中运行。
答案 0 :(得分:1)
这是两个非常不同的东西:
当ReadinessProbe失败时,没有新的请求将被路由到Pod 。
如果您的Pod是 Kafka使用者,则您的 pod正在向Kafka初始化请求,以从 topic 中检索消息。
检查所需目录
无法打开'/ tmp / healthy':没有这样的文件或目录
如果服务正常运行需要目录/tmp/healthy
,则服务应在启动时进行检查;如果所需目录不可用,则服务应exit(1)
(错误消息崩溃)进行检查。 。这应该在连接到Kafka之前完成。如果您的应用程序连续使用目录,例如对其进行写入,所有操作错误代码应得到检查并正确处理-根据您的情况记录日志并崩溃。
我的实际目的是使我的服务应用程序(kafka使用者)能够控制何时接收kafka消息(以及REST请求)。例如。如果操作繁重,我的服务将删除/ tmp / healthy文件,从而使pod无法准备好接收kafka消息和Rest请求。
Kafka消费者投票只要有消费者需要,Kafka即可提供更多数据。换句话说,卡夫卡使用者要求随时准备获取更多数据。
示例消费者代码:
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records) {
// process your records
}
}
请记住commit
您已处理过的记录,以便消息不会被多次处理,例如崩溃之后。