在名称空间A中,我正在运行服务nginx
。在命名空间B中,我可以使用nginx.A
或nginx.A.svc.cluster.local
来访问命名空间A中的nginx
。
那么这两者有什么区别?哪个更推荐?为什么?
答案 0 :(得分:1)
这些是等效的。如果您查看注入到每个容器中的默认resolv.conf:
search mynamespace.svc.cluster.local svc.cluster.local cluster.local mydomain
options ndots:5
您会看到它会自动为您查询链。假设您使用的是默认的Linux DNS客户端行为。如果您有自己的自定义解析器,则尽管大多数人都会检查resolv.conf,但它可能无法理解部分查找语法。
答案 1 :(得分:1)
两种形式都被认为是正确的(与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>
,它将解析为服务 它是名称空间的本地名称。这对于使用相同的功能很有用 跨多个名称空间(例如开发,暂存)进行配置 和生产。如果要跨命名空间访问,则需要 使用完全限定域名(FQDN)。
在我看来,坚持FQDN (fully qualified domain name)标准要好得多,而且经常明确地被认为比隐性更好。