对于Pod到Pod的通信,应使用什么IP?服务的ClusterIP或端点

时间:2018-12-28 11:21:18

标签: kubernetes

我已将Rancher Helm图表部署到我的Kubernetes集群,并希望从另一个Pod(即运行入口控制器的Pod)访问Rancher API / UI。

当我列出服务和端点时。 IP地址不同:

$ kubectl get ep | grep rancher
release-name-rancher                         10.200.23.13:80                    18h

$ kubectl get services | grep rancher 
release-name-rancher                         ClusterIP   10.100.200.253   <none>        80/TCP                       18h

在客户端容器(即入口控制器)中,我看到了由服务的ClusterIP表示的服务蜂:

$ env | grep RELEASE_NAME_RANCHER_SERVICE_HOST
RELEASE_NAME_RANCHER_SERVICE_HOST=10.100.200.253

尝试通过Env中的IP地址到达后端是行不通的(curl 10.100.200.253只会传递任何响应并永远阻止)。

尝试通过端点地址到达后端是可行的:

$ curl 10.200.23.13
<a href="https://10.200.23.13/">Found</a>.

我很困惑为什么端点IP地址和ClusterIP地址不同,以及为什么无法连接到ClusterIP地址。有什么提示可以增进我的理解吗?

1 个答案:

答案 0 :(得分:3)

在Kubernetes中,每个Pod和Service都有自己的IP地址。 kubectl get services IP地址是服务的Kubernetes内部地址;其后面Pod的get ep地址。该服务实际上就像一个负载平衡器,并且可以连接多个Pod。 Kubernetes Service documentation详细介绍了这里发生的事情。

Kubernetes还提供了可以解析服务名称的internal DNS service。通常,您不应该直接使用这些IP地址中的任何一个;而是使用主机名release-name-rancher.default.svc.cluster.local(如果在其他Kubernetes命名空间中运行,则替换为“默认”)。

虽然支持并记录了您引用的..._SERVICE_HOST环境变量,但我还是避免使用它。特别要注意的是,如果您一次helm installkubectl apply大量资源并且在服务之前创建了Pod,则您将处于一致状态,只是Pod实际上没有此环境变量。在服务没有固定名称的Helm区域中,环境变量名称也不会固定。首选DNS名称。