我在GCE上运行了一个kubernetes集群。
我创建了一个设置,其中有2个 pods glusterfs-server-1
和glusterfs-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地址,我该怎么办?
答案 0 :(得分:1)
您可以修改resolv.conf
并使用完整的服务名称来避免冲突。通常是这样的:service_name.default.svc.cluster.local
和service_name.kube-system.svc.cluster.local
或任何命名空间。