【问题标题】:How to get all Kubernetes pod IP in each pods?如何获取每个 pod 中的所有 Kubernetes pod IP?
【发布时间】:2020-09-23 13:27:00
【问题描述】:

我们有 Kubernetes 集群,其中每个服务运行 3 个 pod。 我们有一个用例,我希望每个 pod 都知道其他 pod 的 ip。

For Example:
P1 --> this pod should know ip of itself, p2, p3 pod ip's 
P2 --> this pod should know ip of itself, p1, p3 pod ip's 
p3 --> this pod should know ip of itself, p2, p3 pod ip's 

我在 google 上找到了这个,但看起来我们只获取 pod 本身的 IP,它不会提供其他两个 pod 运行的 ip。

          - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP

有没有办法在我的 java 代码中获取这些信息?

【问题讨论】:

  • 必须询问 Kubernetes API 或将您的部署转换为 StatefulSet。 Kubernetes getting sibling-pod IP/properties from the same deployment/replicaset 极其相似; Message-passing between all pods in a replica set 有更具体的建议。
  • 为什么一个 POD 需要知道其他 POD 的 IP?
  • 是的,“我们有一个用例,我希望每个 pod 都知道其他 pod 的 ip”,你能解释一下为什么需要这样做吗? IP地址会改变,例如在部署或重新安排期间。
  • 我们有 3 个 pod 正在运行,我们希望在不重启应用程序的情况下动态更改日志级别。所以我们有一个 Spring Boot 应用程序,将服务名称(svc)名称作为输入,并使用此名称将找到 pod ip 并使用带有 ip 地址的 call rest 控制器对日志级别进行更改

标签: java spring spring-boot kubernetes


【解决方案1】:

使用您提到的 env 可能不够,因为 pod 应该是临时资源并被添加和删除。

但是下面的命令可以获取你的值

$kubectl get pods -o=jsonpath="{range .items[*]}{.status.podIP}{','}{end}"

您没有提到 pod 是否属于同一个服务,但如果是这种情况(我认为),您可以使用 Selectors

$kubectl get pods -l="app=my-service" -o=jsonpath="{range .items[*]}{.status.podIP}{','}{end}"
x.y.z.a,b.c.d.e,

这里的两个IP是x.y.z.a和b.c.d.e

你应该可以在相应的语言(java)api库中找到等价物

如果你可以让请求去任何一个pod,你可以看看Kube DNS

【讨论】:

    【解决方案2】:

    您可以获取端点的子集以获取所有 pod 的 IP。端点与您的 svc 具有相同的名称。 详情请使用kubectl get ep ep-name -n your-ns -o yaml

    Java代码可以使用k8s java客户端(Officail/fabric lib)或者k8s API访问。


    更新:

    kubectl get ep ep-name -n your-ns -o jsonpath='{range .subsets[*]}{range .addresses[*]}{.ip}{"\t"}{end}'
    

    可以获取所有 pod 的 IP。使用fabric8 lib你可以参考这个example

    Endpoints endpoints = client.endpoints().inNamespace(namespace).withName("ep-name").get();
    endpoints.getSubsets().getAddresses().forEach(endpointAddress -> log.info(endpointAddress.getIp()));
    

    如果你的控制器是 StatefulSet,可以使用 headless service 连接其他 StatefulSet pod。

    【讨论】:

    【解决方案3】:

    如果您正在寻找具有确定性目标地址的 pod 副本的解决方案,我可能会选择使用无头服务部署的 statefulset。 这样的设置将为您提供集群内 DNS 地址,例如 pod-[1,2,3].svc-name.default.cluster.local 然后,您可以使用这些 DNS 地址使 pod 相互通信。 https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#stable-network-id

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2019-05-24
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      相关资源
      最近更新 更多