【发布时间】:2019-10-14 07:57:20
【问题描述】:
在命名空间 A 中,我有一个服务 nginx 正在运行。在命名空间 B 中,我可以使用 nginx.A 或 nginx.A.svc.cluster.local 来访问命名空间 A 中的 nginx。
那么这两者有什么区别呢?哪个更推荐?为什么?
【问题讨论】:
标签: kubernetes dns fqdn
在命名空间 A 中,我有一个服务 nginx 正在运行。在命名空间 B 中,我可以使用 nginx.A 或 nginx.A.svc.cluster.local 来访问命名空间 A 中的 nginx。
那么这两者有什么区别呢?哪个更推荐?为什么?
【问题讨论】:
标签: kubernetes dns fqdn
这两种形式都被认为是正确的(与 this 文章相比)并且在大多数情况下都可以正常工作,但是当人们在 github 上发现一些问题时遇到了一些仅与短名称解析相关的问题,例如:
https://github.com/kubernetes/dns/issues/109
https://github.com/kubernetes/kubernetes/issues/10014
正如您在 Kubernetes 官方文档(ref1、ref2)中看到的那样,它建议使用长格式以防跨命名空间访问服务:
当您创建服务时,它会创建相应的 DNS 条目。这个 条目的形式
<service-name>.<namespace-name>.svc.cluster.local,表示如果 容器只使用<service-name>,它会解析到服务 这是命名空间的本地。这对于使用相同的 跨多个命名空间的配置,例如 Development、Staging 和生产。如果你想跨命名空间,你需要 使用完全限定域名 (FQDN)。
在我看来,坚持FQDN (fully qualified domain name) 标准要好得多,而且通常认为明确比含蓄更好。
【讨论】:
这些是等价的。如果您查看注入到每个容器中的默认 resolv.conf:
search mynamespace.svc.cluster.local svc.cluster.local cluster.local mydomain
options ndots:5
你可以看到它会自动为你向上查询链。这假设您使用的是默认的 Linux DNS 客户端行为。如果您有自己的自定义解析器,那么它可能无法理解部分查找语法,尽管大多数都检查 resolv.conf。
【讨论】: