如何在Google Container Engine [GKE]的所有pod中添加名称服务器?

Jak*_*ake 8 kubernetes google-kubernetes-engine

我正在尝试将我的内部群集迁移到GKE.为了促进这种转变,我需要能够解析遗留服务的名称.

假设网络/ VPN是一个已解决的问题.

目前GKE有办法做到这一点吗?

实际上我正在尝试为每个/etc/resolv.conf添加一个NS

Tim*_*kin 3

我想补充埃里克所说的内容,并稍微修改一下。

我们在 kubernetes 1.1“稳定期”期间的认识之一是,对于 resolv.conf 和解析器行为等内容并没有真正的规范。不同的解析器库做不同的事情,这给我们的用户带来了痛苦。

具体来说,一些常见的解析器假设所有nameservers 都是可替换的,并且如果您有处理 DNS 名称空间不同部分的名称服务器,则会中断。我们决定,对于 kube 1.2,我们不会将多行传递nameserver到容器中。相反,我们仅传递 kube-dns 服务器,该服务器处理cluster.local查询并将任何其他查询转发到“上游”名称服务器。

我们如何知道什么是“上游”?我们使用nameservers节点的。每个 pod 有一个 dnsPolicy 字段来控制此选择。最终结果是容器nameserver在 resolv.conf 中看到一个我们拥有的名称服务器,并且该名称服务器处理整个 DNS 名称空间。

这实际上意味着没有一个很好的钩子让你插入你自己的域名服务器。您可以将--cluster-dns标志更改为 kubelet 以指向您自己的 DNS 服务器,然后该服务器将转发到 kube-dns,然后 kube-dns 将转发到“上游”。问题是 GKE 并不真正支持以这种方式更改标志。如果/当节点更新时,该标志将消失以支持默认值。

可能的解决方案:

  • 让 kubelet 从集群内配置中读取它们的标志。这已经是记录计划,但不在 v1.2 中

  • 让 kube-dns 带有一个标志来指示什么是“上游”。Kube-dns 是一个“集群插件”,因此最终用户并不真正可变(我们将使用您的集群更新它并丢失您的更改)。

  • 让 kube-dns 从集群内配置中读取其标志,并获取一个指示“上游”是什么的标志。这是一个可行的想法,但可能不适用于 v1.2(太晚了)。也许可以将其修补到 v1.2.x 中,但这并不是真正的错误修复,而是一个功能。

  • 将您自己的 DNS 服务器放入每个节点上的 resolv.conf 中,以便 kube-dns 将您用作上游。我认为 GKE 没有办法配置它,并且不会在节点升级时丢失。您可以编写一个控制器,定期通过 SSH 连接到虚拟机并将其写出,然后检查 kube-dns 容器的正确性。布莱赫。

我认为正确的答案是使用集群内配置映射来通知 kubelet 或 DNS(或两者)。如果您认为这些可能是可行的答案(尽管存在时间框架问题),那么如果您打开 GitHub 问题进行讨论,那就太好了。它将在那里获得更多的知名度。