Kubernetes从另一个Pod中查找Pod IP

时间:2018-08-30 14:40:10

标签: kubernetes kubernetes-ingress

我有以下{@ {1}}和hello-abc豆荚。

我想将数据从hello-def发送到hello-abc

pod hello-def怎么知道hello-abc的IP地址?

我想以编程方式执行此操作。

hello-def最容易找到hello-abc位置的方法是什么?

hello-def

2 个答案:

答案 0 :(得分:4)

序言

由于已经定义了路由到每个部署的服务,因此,如果您已将服务和部署都部署到了相同的名称空间,则在许多现代kubernetes集群中,您可以利用kube-dns并简单地按名称引用该服务。

不幸的是,如果群集中未配置kube-dns(尽管不太可能),则无法按名称引用它。

您可以阅读有关服务here的DNS记录的更多信息

此外,Kubernetes具有“服务发现”功能,该功能可将服务的端口和ips公开到部署到相同名称空间的任何容器中。

解决方案

这意味着,要达到hello-def,您可以像这样

curl http://hello-def-service:${HELLO_DEF_SERVICE_PORT}

基于服务发现https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables

注意事项:很有可能,如果服务端口发生更改,则只有在相同名称空间中更改后创建的Pod才会收到新的环境变量。

外部访问权限

此外,只要您可以从外部访问NodePort范围,就可以使用NodePort功能从外部获得此服务。

这将要求您通过node-ip:nodePort访问服务

您可以找到通过kubectl describe svc/hello-def-service

随机分配给您的服务的NodePort。

入口

要从外部获得服务,您应该实施一个入口服务,例如nginx-ingress

https://github.com/helm/charts/tree/master/stable/nginx-ingress https://github.com/kubernetes/ingress-nginx

侧车

如果您的2个服务紧密结合,则可以使用Kubernetes Sidecar功能将这两个服务都包含在同一个容器中。在这种情况下,pod中的两个容器将共享同一个虚拟网络适配器,并且可以通过localhost:$port

访问

https://kubernetes.io/docs/concepts/workloads/pods/pod/#uses-of-pods


服务发现

  

在节点上运行Pod时,kubelet将添加一组环境   每个活动服务的变量。它支持两个Docker链接   兼容变量(请参见makeLinkVariables)且更简单   {SVCNAME} _SERVICE_HOST和{SVCNAME} _SERVICE_PORT变量,其中   服务名称为大写,破折号转换为下划线。

在此处阅读有关服务发现的更多信息: https://kubernetes.io/docs/concepts/services-networking/service/#environment-variables

答案 1 :(得分:2)

您应该能够通过https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services

通过DNS从hello-def-service中的pod到达hello-abc

但是,必须先在您的k8s集群中配置/安装kube-dnsCoreDNS,然后才能在您的集群中使用DNS记录。

具体来说,应该通过DNS记录hello-def-service到达http://hello-def-service,以获取与hello-abc-service相同名称空间中运行的服务的信息

您应该能够通过DNS记录hello-def-service到达运行在另一个命名空间ohter_namespace中的hello-def-service.other_namespace.svc.cluster.local

如果由于某种原因而没有在群集中安装DNS附加组件,则仍可以通过hello-def-service窗格中的环境变量找到hello-abc的虚拟IP。如here所述。