【发布时间】:2020-03-17 07:12:36
【问题描述】:
我有一个应用程序,它为 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) 其余api无法访问。
我假设如果 pod 的就绪探测失败,应用程序既不能接收 kafka 消息也不能接收 rest 请求。但是为什么在我的测试中,REST 请求和 Kafka 消息的处理方式不同。
根据 Kubernetes 文档:
The kubelet uses readiness probes to know when a Container is ready to start accepting traffic
但它并没有明确说明它真正意味着什么样的流量。 如果就绪探测失败,kubernetes 是否只限制到 pod 的 http 流量,但不限制 tcp 流量(因为 Kafka 正在通过 tcp 工作)?
我的实际意图是让我的服务应用程序(kafka 消费者)能够控制何时接收 kafka 消息(以及 REST 请求)。例如。如果操作繁重,我的服务将删除 /tmp/healthy 文件,从而使 pod 无法准备好接收 kafka 消息和 Rest 请求。繁重的操作完成后,app 会写入健康文件,让 pod 准备好接收消息。
更多信息,在我的测试中,kubernetes 版本是 v1.14.3,并且 kafka broker 运行在 kubernetes 之外的一个单独的虚拟机中。
【问题讨论】:
-
1. kafka 消息已被我的应用程序使用并保存到数据库> 你是如何发送消息的?如果您的 pod 前面有 k8s 服务(例如 kafka.kafka.svc.cluster.local),则失败的就绪探测会导致端点控制器从平衡中删除 pod
-
@KonstantinVustin,我使用另一个运行在同一个 kubernetes 中的生产者应用程序将 kafka 消息发送到主题。在 UI 中单击一个按钮后,它将使用 kafka producer lib 将 kafka 消息发送到主题。 kafka broker 和 zookeeper 安装在 kubernetes 集群之外的一个单独的 VM 中。如何检查我的 pod 前面是否运行了 k8s 服务?运行
kubectl get services显示有集群 IP 类型的 kubernetes。 -
您使用哪个 URL 发送?
-
Kafka Producer
对象使用“bootstrap.servers”属性向 kafka 主题发送消息。这些值类似于 ip_of_service_vm:9092。服务 vm 的 ip 只是普通的 IPV4 地址。我的消费者应用程序使用相同的格式进行 kafka 消费者配置。生产者应用和消费者应用在不同的 Pod 中运行。
标签: kubernetes apache-kafka readinessprobe