本文分享自华为云社区《容器中域名解析流程以及不同dnsPolicy对域名解析影响》,作者:可以交个朋友 。
一、coreDNS背景
部署在kubernetes集群中的容器业务通过coreDNS服务解析域名,Coredns基于caddy框架,将整个CoreDNS服务都建立在一个使用Go编写的HTTP/2 Web 服务器Caddy上。通过插件化(链)架构,以预配置的方式(configmap卷挂载内容配置)选择需要的插件编译,按序执行插件链上的逻辑,通过四种方式(TCP、UDP、gRPC和HTTPS)对外直接提供DNS服务。
二、kubelet通过修改容器/etc/resolv.conf文件使得容器中可解析域名
在kubernetes集群中,coreDNS服务和kube-apiserver通信获取clusterip和serviceName的映射关系,并且coreDNS本身通过clusterip(默认 xx.xx.3.10,比如集群clusterip网段为10.247.x.x,则coreDNS对外暴露服务的clusterip为10.247.3.10),我们知道操作系统域名服务器关键配置文件/etc/resolv.conf中的nameserver字段指定,所以只需要使得容器/etc/resolv.conf中 nameserver字段配置为coreDNS的clusterip地址即可。
那么谁来完成容器/etc/resolv.conf的修改和如何修改?kubelet负责拉起容器,启动参数中--cluster-dns字段对应值就是该集群coreDNS的clusterip地址,kubelet在拉起容器中,根据Pod的dnsPolicy选项,把该值修改注入到容器中。
三、Pod不同dnsPolicy对容器/etc/resolv.conf的影响
-
Default:如果dnsPolicy被设置为"Default",则名称解析nameserver配置将从pod运行的节点/etc/resolv.conf继承。
节点/etc/resolv.conf配置
nameserver X.X.X.X nameserver X.X.X.Y options ndots:5 timeout:2 single-request-reopen
-
ClusterFirst:如果dnsPolicy被设置为"ClusterFirst",则使用集群coredns的service 地址作为Pod内/etc/resolv.conf中nameserver配置。
nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 timeout:2 single-request-reopen
-
ClusterFirstWithHostNet:对于使用hostNetwork网络模式运行的Pod,需明确设置其DNS策略"ClusterFirstWithHostNet",否则 hostNetwork + ClusterFirst实际效果 = Default
nameserver 10.247.3.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 timeout:2 single-request-reopen
-
**None:**它允许用户自定义Pod内/etc/resolv.conf配置,忽略Kubernetes环境中默认的DNS设置。应使用dnsConfigPod规范中的字段提供所有DNS设置 。
/etc/resolv.conf相关配置说明
sql
nameserver:表示指定的DNS服务地址IP,用于解析域名的服务器。
search:表示域名解析时指定的域名搜索域。解析域名的时候,会依搜索域顺序构建域名解析地址。进行域名解析,直到解析即可。如:svcname.default.svc.cluster.local --> svcname.svc.cluster.local --> svcname.cluster.local
options:其他选项。最常见的选项配置有:
- ndots值:判断域名解析地址中包含的"."是否大于或等于ndots设定值,如果是,则以请求解析域名地址作为全限定域名发起解析请求,不再进行search域构建域名地址;如果小于ndots,则按照search域构建域名地址,再逐序发起解析请求。
- timeout:等待DNS服务器返回的超时时间。单位秒(s)。