spring 如何获取每个Pod中的所有Kubernetes Pod IP?

vom3gejh  于 2023-06-21  发布在  Spring
关注(0)|答案(4)|浏览(215)

我们有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

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

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

有没有一种方法可以在我的Java代码中获得这些信息?

lf3rwulv

lf3rwulv1#

使用你提到的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

g0czyy6m

g0czyy6m2#

您可以获取端点的子集以获取所有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。使用fabric 8 lib,您可以引用此示例

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

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

bnl4lu3b

bnl4lu3b3#

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

vulvrdjw

vulvrdjw4#

如果你需要很多关于豆荚的信息...
kubectl get pods -n <namespace> --output=wide
包括IP、状态、主机节点等

相关问题