即使Kubernetes准备就绪调查失败,Pod也会收到流量

时间:2019-11-21 11:06:06

标签: kubernetes apache-kafka readinessprobe

我有一个应用程序,该服务器可以处理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之外的单独虚拟机中运行。

1 个答案:

答案 0 :(得分:1)

这是两个非常不同的东西:

  • 正在接收请求外部服务正在发送请求并期望得到响应。
  • 发送请求:您的服务正在发送请求并等待响应。

ReadinessProbe

当ReadinessProbe失败时,没有新的请求将被路由到Pod

Kafka消费者

如果您的Pod是 Kafka使用者,则您的 pod正在向Kafka初始化请求,以从 topic 中检索消息。

检查所需目录

  

无法打开'/ tmp / healthy':没有这样的文件或目录

如果服务正常运行需要目录/tmp/healthy,则服务应在启动时进行检查;如果所需目录不可用,则服务应exit(1)(错误消息崩溃)进行检查。 。这应该在连接到Kafka之前完成。如果您的应用程序连续使用目录,例如对其进行写入,所有操作错误代码应得到检查并正确处理-根据您的情况记录日志并崩溃。

正在使用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您已处理过的记录,以便消息不会被多次处理,例如崩溃之后。