如何从 kubernetes 节点的角度将服务名称解析为 IP?
How to resolve a service's name to IP from a kubernetes node's perspective?
我在 GCE 上有一个 kubernetes 集群 运行。
我创建了一个设置,其中有 2 个 pods glusterfs-server-1
和 glusterfs-server-2
是我的 gluster 服务器。
2 glusterfsd
守护程序正确通信,我能够创建复制的卷,将文件写入它们并看到文件在两个 pods.
上正确复制
我还有 1 个名为 glusterfs-server
的 service,它会自动平衡我的 2 个 glusterfs pods.
之间的流量
从另一个 pod 中,我可以发出 mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume
并且一切正常。
现在,我真正想要的是在创建容器时能够在我的 .yaml 文件中使用 glusterfs
卷类型:
...truncated...
spec:
volumes:
- name: myvolume
glusterfs:
endpoints: glusterfs-server
path: myvolume
...truncated...
不幸的是,这不起作用。我能够找出它不起作用的原因:
当直接连接到 kubernetes node 时,发出 mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume
不起作用,这是因为从我的节点的角度来看 glusterfs-server
没有解析到任何 IP 地址。 (也就是getent hosts glusterfs-server
returns什么都没有)
而且,由于 glusterfs 的工作方式,即使直接使用服务的 IP 也会失败,因为 glusterfs 最终仍会尝试解析名称 glusterfs-server
(并失败)。
现在,为了好玩并验证这是问题所在,我编辑了节点的 resolv.conf
(通过输入我的 kube-dns IP 地址和搜索域),以便它可以正确解析我的 pods 和服务 ip 地址。然后我终于能够在节点上成功发出 mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume
。然后我还能够使用 glusterfs 卷创建一个 pod(使用上面的 PodSpec)。
现在,我相当确定修改节点的 resolv.conf
是一个糟糕的主意:kubernetes 具有命名空间的概念,如果 2 个不同命名空间中的 2 个服务共享相同的名称(例如,glusterfs-service) ,getent hosts glusterfs-service
将解析为位于 2 个不同命名空间中的 2 个不同 IP。
所以我的问题是:
我该怎么做才能让我的节点解析我的 pods/services IP 地址?
您可以修改resolv.conf
并使用完整的服务名称以避免冲突。通常是这样的:service_name.default.svc.cluster.local
和 service_name.kube-system.svc.cluster.local
或任何命名空间。
我在 GCE 上有一个 kubernetes 集群 运行。
我创建了一个设置,其中有 2 个 pods glusterfs-server-1
和 glusterfs-server-2
是我的 gluster 服务器。
2 glusterfsd
守护程序正确通信,我能够创建复制的卷,将文件写入它们并看到文件在两个 pods.
我还有 1 个名为 glusterfs-server
的 service,它会自动平衡我的 2 个 glusterfs pods.
从另一个 pod 中,我可以发出 mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume
并且一切正常。
现在,我真正想要的是在创建容器时能够在我的 .yaml 文件中使用 glusterfs
卷类型:
...truncated...
spec:
volumes:
- name: myvolume
glusterfs:
endpoints: glusterfs-server
path: myvolume
...truncated...
不幸的是,这不起作用。我能够找出它不起作用的原因:
当直接连接到 kubernetes node 时,发出 mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume
不起作用,这是因为从我的节点的角度来看 glusterfs-server
没有解析到任何 IP 地址。 (也就是getent hosts glusterfs-server
returns什么都没有)
而且,由于 glusterfs 的工作方式,即使直接使用服务的 IP 也会失败,因为 glusterfs 最终仍会尝试解析名称 glusterfs-server
(并失败)。
现在,为了好玩并验证这是问题所在,我编辑了节点的 resolv.conf
(通过输入我的 kube-dns IP 地址和搜索域),以便它可以正确解析我的 pods 和服务 ip 地址。然后我终于能够在节点上成功发出 mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume
。然后我还能够使用 glusterfs 卷创建一个 pod(使用上面的 PodSpec)。
现在,我相当确定修改节点的 resolv.conf
是一个糟糕的主意:kubernetes 具有命名空间的概念,如果 2 个不同命名空间中的 2 个服务共享相同的名称(例如,glusterfs-service) ,getent hosts glusterfs-service
将解析为位于 2 个不同命名空间中的 2 个不同 IP。
所以我的问题是:
我该怎么做才能让我的节点解析我的 pods/services IP 地址?
您可以修改resolv.conf
并使用完整的服务名称以避免冲突。通常是这样的:service_name.default.svc.cluster.local
和 service_name.kube-system.svc.cluster.local
或任何命名空间。