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

标签 dns kubernetes kube-dns

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

我创建了一个设置,其中有 2 个 pod glusterfs-server-1glusterfs-server-2 作为我的 gluster 服务器.

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

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

从另一个 Pod 内部,我可以发出 mount -t glusterfs glusterfs-server:/myvolume/mnt/myvolume 并且一切都运行良好。

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

...被截断... 规范: 卷: - 名称:我的卷 glusterfs: 端点:glusterfs-server 路径:我的卷 ...被截断...

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

当直接连接到 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 主机 glusterfs-service 将解析为位于 2 个不同命名空间中的 2 个不同 IP。

所以我的问题是:

我该怎么做才能让我的节点能够解析我的 Pod/服务 IP 地址?

最佳答案

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

关于dns - 如何从 kubernetes 节点的角度将服务名称解析为 IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39090660/

相关文章:

php - 添加 www 和 URL 显示 Wix.com 页面

amazon-web-services - S3 上的静态网站,路由为 53 - 无法访问网站

kubernetes - 如何更改使用 kubeadm 部署的 kubernetes 1.9 上的 cluster.local 默认域?

rest - 理解 Go 中 Kubernetes API 框架的逻辑

Python Flask-Restful 应用程序与 Kubernetes - 连接被拒绝

kubernetes - nslookup : can't resolve kubernetes. 默认

docker - 配置 kubernetes 从注册服务中拉取

python - 如何使用 boto 在 Route53 中的 DNS 记录上设置地理位置

linux - 如何通过ip访问Linux服务器?

kubernetes - 在Kafka中,随着分区之间的整体滞后时间减少,您是否应该减少一组消费者的数量?