[英]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.