繁体   English   中英

如何在每个 pod 中获取所有 Kube.netes pod IP?

[英]How to get all Kubernetes pod IP in each pods?

我们有 Kube.netes 集群,其中每个服务都有 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 

我在谷歌上找到了这个,但看起来我们只得到 pod 本身的 IP,它不会让其他两个 pod 运行的 ip。

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

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

像您提到的那样使用 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是xyza和b.c.de

您应该能够在相应的语言(java)api 库中找到等效项

如果你可以让请求 go 到任何 pod,你可以看看Kube DNS

您可以获取端点的子集以获取所有 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你可以参考这个例子

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM