关于k8s的DNS的详细信息请参考官方文档地址。修复K8s中Pod外域名解析错误的问题。
1.k8s默认DNS策略
k8s提供了5种DNS策略,如下:
:Pod 从它们运行的节点继承名称解析配置。 :任何与配置的集群域后缀(例如“”)不匹配的DNS查询将被转发到从该节点继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。 Net:对于作为 Net 运行的 Pod,应显式设置其 DNS 策略。 None:此设置允许 Pod 忽略环境中的 DNS 设置。 Pod 将使用其字段提供的 DNS 设置。 k8s默认使用的DNS策略是,这个需要注意,也就是说域名解析会优先使用集群的DNS(kube-DNS)进行查询。如果k8s的DNS解析失败,会转发到主机的DNS进行解析。
2.k8s容器的.conf
k8s上运行的容器的域名解析与一般Linux相同。根据/etc/.conf文件来解决。我们看一下开发环境下某个pod的.conf内容:
nameserver 10.96.0.10
search jplat.svc.cluster.local svc.cluster.local cluster.local localhost
options ndots:5
以上内容是k8s集群中kube-dns的IP。集群中容器的IP都是kube-dns的IP。
下面就和ndots一起来聊聊吧。首先,我们需要了解FQDN(Fully name)的概念,即完整的域名。一般来说,如果域名以.结尾,则表示一个完整的域名。例如,它是 FQDN,但它不是 FQDN。理解了这个概念之后,我们再看一下和ndots。
如果我们的Pod使用的是默认的DNS策略,即如果某个域名是FQDN,那么这个域名将会被转发到DNS服务器进行解析。如果域名不是 FQDN,则将搜索并解析该域名。这是一个例子。例如,如果访问域名abc.xyz,因为它不是FQDN,所以它会与域中的值组合成为FQDN。以上面的.conf为例,域名将这样组合:
abx.xyz.jplat.svc.cluster.local.
abc.xyz.svc.cluster.local.
abc.xyz.cluster.local.
然后这些域名首先由kube-DNS解析。如果解析不成功,则由主机的 DNS 服务器进行解析。
而ndots则用来表示.的个数。如果域名中的值不小于该值,则将被视为 FQDN。简单来说,该属性用于确定不以.结尾的域名在什么条件下生效。将被识别为 FQDN。我们以另一个pod的.conf为例,如下:
nameserver 10.96.0.10
search oms-dev.svc.cluster.local svc.cluster.local cluster.local localhost
options ndots:2 edns0
在这个.conf中,ndots为2,这意味着如果.conf的数量。域名中的 大于或等于 2,即使域名不以 . 结尾,也会被识别为 FQDN。例如:域名为abc.xyz.xxx。该域名是 FQDN,但 abc.xyz 不是 FQDN。
之所以有域,主要是为了方便k8s内部服务之间的访问。例如:k8s可以通过同一服务器下的服务名直接访问。其原理就是在域内进行搜索。例如上面的.conf中,jplat和oms-dev实际上是两个pod的名称。 。因此,通过服务名访问时,会与域名结合起来,这样最终的域名就会结合成..svc..local。而如果是交叉访问的话,可以使用这种形式。当与域名结合时,您仍然可以获得..svc..local。
3.解决问题
了解了k8s的DNS相关知识后,我们项目组在开发过程中遇到了一个问题:某个应用的pod调用外部接口失败。错误的原因是主机。一开始我以为是因为外部应用不在同一个网段。问题,但是可以直接通过服务器访问。当时 pod 使用的是默认的 DNS 策略,即 ndots 也有默认值,是 5。这就出现了一个问题。我请求的域名是域名只有2个点,所以会和域名的域名结合在一起。当然,结果是无法解决的。考虑到我们的pod访问都是在同一个目录下,即使是跨的,也是通过.来访问的,所以最终选择将ndots改为2。修改应用程序的yaml文件如下:
dnsConfig:
options:
- name: ndots
value: "2"
修改完成后重新部署项目
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。