2

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

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

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

我还调用了 1 个服务glusterfs-server来自动平衡我的 2 个 glusterfs pod 之间的流量。

从另一个 pod 内部,我可以发出mount -t glusterfs glusterfs-server:/myvolume /mnt/myvolume并且一切正常。

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

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

不幸的是,这不起作用。我能够找出为什么它不起作用:

直接连接到 kubernetes节点时,发出 amount -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 卷(使用上面的 PodSpec)创建一个 pod。

现在,我相当肯定修改我的节点resolv.conf是一个糟糕的主意:kubernetes 具有命名空间的概念,如果 2 个不同命名空间中的 2 个服务共享相同的名称(例如 glusterfs-service),agetent hosts glusterfs-service将解析为 2 个不同的 IP 2个不同的命名空间。

所以我的问题是:

我可以做些什么让我的节点能够解析我的 Pod/服务 IP 地址?

4

1 回答 1

2

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

于 2016-08-23T06:37:01.120 回答