如何从kubernetes节点的角度将服务的名称解析为IP?

时间:2016-08-23 00:38:54

标签: dns kubernetes kube-dns

我在GCE上运行了一个kubernetes集群。

我创建了一个设置,其中有2个 pods glusterfs-server-1glusterfs-server-2,这些是我的gluster服务器。

2 glusterfsd守护进程正确通信,我能够创建复制卷,向它们写入文件,并查看在两个pod上正确复制的文件。

我还有一个名为glusterfs-server服务,它会自动平衡我的2个glusterfs pod之间的流量。

从另一个广告连播中,我可以发出mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume,一切正常。

现在,我真正想要的是在创建容器时能够在我的.yaml文件中使用glusterfs卷类型:

...truncated... spec: volumes: - name: myvolume glusterfs: endpoints: glusterfs-server path: myvolume ...truncated...

不幸的是,这不起作用。我能够找出它不起作用的原因:

直接连接到kubernetes 节点时,发出mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume不起作用,这是因为从我的节点的角度来看glusterfs-server无法解决任何问题IP地址。 (即getent hosts glusterfs-server不返回任何内容)

而且,由于glusterfs如何工作,即使直接使用服务的IP也会失败,因为glusterfs最终仍将尝试解析名称glusterfs-server(并失败)。

现在,只是为了好玩并验证这是问题,我编辑了我的节点resolv.conf(通过我的kube-dns IP地址和搜索域),以便它能正确解析我的问题pod和服务ip地址。然后我终于能够在节点上成功发出mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume。然后我还能够使用glusterfs卷创建一个pod(使用上面的PodSpec)。

现在,我相当肯定修改我的节点resolv.conf是一个可怕的想法:kubernetes具有命名空间的概念,如果2个不同命名空间中的2个服务共享相同的名称(例如, glusterfs-service),getent hosts glusterfs-service将解析为2个不同的IP,它们位于2个不同的名称空间中。

所以我的问题是:

如果我的节点能够解析我的pod /服务IP地址,我该怎么办?

1 个答案:

答案 0 :(得分:1)

您可以修改resolv.conf并使用完整的服务名称来避免冲突。通常是这样的:service_name.default.svc.cluster.localservice_name.kube-system.svc.cluster.local或任何命名空间。