1

在我的 Kubernetes 设置中,我有 2 个服务 - A 和 B。
服务 B 依赖于完全启动的服务 A。我现在想在服务 B 的 Pod 中设置一个 TCP 就绪探测,以便他们测试服务 A 的任何 Pod 是否完全运行。

服务 B 中部署的 ReadinessProbe 部分如下所示:

readinessProbe:
  tcpSocket:
    host: serviceA.mynamespace.svc.cluster.local
    port: 1101 # same port of Service A Readiness Check

我可以应用这些更改,但 Readiness Probe 失败并显示:

Readiness probe failed: dial tcp: lookup serviceB.mynamespace.svc.cluster.local: no such host

我在其他地方使用相同的主机名(例如,我将它作为 ENV 传递给容器)并且它可以工作并得到解决。

有没有人有想法准备好为其他服务工作或在服务之间进行其他类型的依赖检查?谢谢 :)

4

2 回答 2

3

由于 Readiness 和 Liveness探针完全由kubelet节点代理管理,并且kubelet从特定节点配置继承 DNS 发现服务,因此您无法解析 K8s 内部名称服务器DNS记录:

对于探针,kubelet 在node上而不是在pod中进行探针连接,这意味着您不能在 host 参数中使用服务名称,因为 kubelet 无法解析它。

您可以考虑源Pod AhostNetwork: true通过传播参数消耗节点 IP 地址的情况,从而可以从Pod Bkubelet内到达并成功进行就绪探测,如官方 k8s文档中所述:

tcpSocket:
  host: Node Hostname or IP address where Pod A residing
  port: 1101

但是,我找到了 Stack thread,您可以在其中获得更有效的解决方案,如何通过Init Containers实现相同的结果。

于 2019-07-18T13:55:53.597 回答
0

除了 Nick_Kh 的回答之外,另一种解决方法是使用probe by command,它在容器中执行。

为了执行探测,kubelet 在目标容器中执行命令 cat /tmp/healthy。如果命令成功,则返回 0,并且 kubelet 认为容器处于活动状态且健康。

一个例子:

readinessProbe:
  exec:
    command:
     - sh
     - -c
     - wget -T2 -O- http://service
于 2022-02-12T03:38:59.393 回答