我有以下{@ {1}}和hello-abc
豆荚。
我想将数据从hello-def
发送到hello-abc
。
pod hello-def
怎么知道hello-abc
的IP地址?
我想以编程方式执行此操作。
hello-def
最容易找到hello-abc
位置的方法是什么?
hello-def
答案 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
入口
要从外部获得服务,您应该实施一个入口服务,例如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-dns
或CoreDNS
,然后才能在您的集群中使用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所述。