繁体   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