She*_*Liu 5 apache-kafka kubernetes readinessprobe
我有一个应用程序,它负责 REST 请求,并且正在侦听 Kafka 主题。我将应用程序部署到 Kubernetes 并像这样配置就绪探针
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
Run Code Online (Sandbox Code Playgroud)
基本上遵循[configure-liveness-readiness-startup-probes]的说明
部署完成后,我可以看到 pod readiness 探测失败
Readiness probe failed: cat: can't open '/tmp/healthy': No such file or directory
Run Code Online (Sandbox Code Playgroud)
这是预期的。然后我向该主题发送了一条kafka消息。我观察到
1)kafka消息已被我的应用程序使用并保存到数据库。
2)其余api无法访问。
我假设如果 pod 的就绪探针失败,应用程序既无法接收 kafka 消息,也无法接收其余请求。但为什么在我的测试中,REST请求和Kafka消息的处理方式不同。
根据 Kubernetes 文档:
The kubelet uses readiness probes to know when a Container is ready to start accepting traffic
Run Code Online (Sandbox Code Playgroud)
但它并没有明确说明它真正意味着什么样的流量。如果就绪探测失败,kubernetes 是否仅限制到 pod 的 http 流量,但不限制 tcp 流量(因为 Kafka 通过 tcp 工作)?
我的实际意图是让我的服务应用程序(kafka 消费者)能够控制何时接收 kafka 消息(以及 REST 请求)。例如,如果有繁重的操作,我的服务将删除 /tmp/healthy 文件,从而使 pod 未准备好接收 kafka 消息和 Rest 请求。当繁重的操作完成后,应用程序会写入健康文件以使 pod 准备好接收消息。
更多信息,在我的测试中,kubernetes 版本是 v1.14.3,kafka Broker 运行在 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
}
}
Run Code Online (Sandbox Code Playgroud)
请记住您已处理的commit记录,以便消息不会被多次处理,例如在崩溃后。
| 归档时间: |
|
| 查看次数: |
1896 次 |
| 最近记录: |