2015-05-13 34 views
2

我使用谷歌容器引擎,我可以在我的群集中创建Pod和服务。但是当我尝试使用DNS功能(skydns)来查找我的服务时,没有发现任何东西。如果我登录到非主节点,则可以看到DNS容器,并可以使用'host'命令执行DNS查找(使用apt-get安装)。但是我无法通过它的名字找到我的服务。它将kubernetes.local与服务的IP关联。其实它将kubernetes.local与我的每一项服务(我有9)的知识产权相关联。但它不关联服务名称“my-service-name”。skydns麻烦 - 我不能'得到它'?

任何人都知道让这个工作的诀窍?无论是创建服务都不会导致skydns创建DNS条目(也许有一些魔法可以使其工作)......或者我只是完全无知(不太神奇,也许更有可能)。

我不知道哪个。

b

+0

你运行的是哪个版本的GKE?你可以在dns pod(特别是kube2sky)中的容器上运行kubectl日志,看看它们是否显示任何持久性错误? –

回答

4

有神奇的一点点涉及一种旨在使DNS在Kubernetes从豆荚中更加方便。让我试着解释一下。

在Kubernetes内构建DNS名称的方式是<service-name>.<namespace>.kubernetes.local。这就是为什么kubernetes.local正在从您的节点解决,但my-service-name不是。假设你的服务是在默认的命名空间中定义的(除非你明确地在不同的命名空间中创建它),你应该可以在my-service-name.default.kubernetes.local上解决它。

围绕DNS的文档假定您关心如何解析服务器名称,而不是直接在主机上解析服务器名称。在您的pod中,DNS应设置为首先搜索您指定的相对于default.kubernetes.localkubernetes.local的名称,这意味着从群集中不是kube-dns的任何群集(专门处理它)中,您应该能够解决您的问题服务使用my-service-namemy-service-name.default.kubernetes.local

如果您想尝试一下,请使用docker exec将其附加到群集的一个fluentd pod上,然后尝试从容器中查找您的服务。

注意,命名空间从kubernetes.local变更为0.17.0或更新版本0.18.0之间cluster.local,因此,请检查您的群集的版本(使用kubectl version),如果你的第一次尝试是行不通的。

+0

真棒,谢谢 –

+0

没问题!作为警告,这将很快改变为'<服务名称>。 .cluster.local',但该格式将成为1.0版本的一部分,并因此长时间保持稳定。 –