一、为什么CCE集群的容器无法通过DNS解析?
问题描述
某客户在DNS服务中做内网解析,将自有的域名绑定到DNS服务中的内网域名中,并绑定到特定的VPC中,发现本VPC内的节点(ECS)可以正常解析内网域名的记录,而VPC内的容器则无法解析。
适用场景
VPC内的容器无法进行正常DNS解析的情况。
解决方案
由于本案例涉及的是内网域名解析,按照内网域名解析的规则,需要确保VPC内的子网DNS设置成的云上DNS,具体以内网DNS服务的控制台界面提示为准。
本案例的子网中已经完成该设置,其中用户可以在该VPC子网内的节点(ECS)进行域名解析,也说明已完成该设置,如下图:
但是在容器内进行解析却提示bad address无法解析域名返回地址,如下图:
登录CCE控制台查看该集群的插件安装情况。
如果已安装插件列表中没有coredns插件,可能是用户卸载了该插件等原因导致。
安装coredns插件,并添加相应的域名及对应的DNS服务地址,即可进行域名解析。
二、如何设置容器内的DNS策略?
CCE支持通过dnsPolicy标记每个Pod配置不同的DNS策略:
- None: 表示空的DNS设置,这种方式一般用于想要自定义DNS配置的场景,而且,往往需要和dnsConfig配合一起使用达到自定义DNS的目的。
- Default: 有人说Default的方式,是使用宿主机的方式,这种说法并不准确。
这种方式其实是让kubelet来决定使用何种DNS策略。而kubelet默认的方式,就是使用宿主机的 /etc/resolv.conf,但是kubelet是可以灵活来配置使用什么文件来进行DNS策略的,我们完全可以使用kubelet的参数:–resolv-conf=/etc/resolv.conf来决定您的DNS解析文件地址。
- ClusterFirst: 这种方式表示Pod内的DNS使用集群中配置的DNS服务,简单来说,就是使用Kubernetes中kubedns或coredns服务进行域名解析。如果解析不成功,才会使用宿主机的DNS配置进行解析。
如果未明确指定dnsPolicy,则默认使用“ClusterFirst”:
- 如果将dnsPolicy设置为“Default”,则名称解析配置将从运行pod的工作节点继承。
- 如果将dnsPolicy设置为“ClusterFirst”,则DNS查询将发送到kube-dns服务。
对于以配置的集群域后缀为根的域的查询将由kube-dns服务应答。所有其他查询(例如,www.kubernetes.io)将被转发到从节点继承的上游名称服务器。在此功能之前,通常通过使用自定义解析程序替换上游DNS来引入存根域。但是,这导致自定义解析程序本身成为DNS解析的关键路径,其中可伸缩性和可用性问题可能导致集群丢失DNS功能。此特性允许用户在不接管整个解析路径的情况下引入自定义解析。
如果某个工作负载不需要使用集群内的coredns,可以使用kubectl命令或API将此策略设置为dnsPolicy: Default。