k8s集群coredns偶尔解析外部域名失败
k8s集群出现部分服务器无法解析域名情况,但是coreDNS所在的pod上是可以解析该域名
域名完全不能解析
查看coredns的配置
[root@k8s01 coredns]# kubectl get -n kube-system cm coredns -oyaml
apiVersion: v1
data:
Corefile: |
.:53 {
log
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
其中forward . /etc/resolv.conf配置表示使用当coredns内部不能解析的时候,向宿主机上的resolv.conf文件中配置的nameserver转发dns解析请求,当宿主机上namserver有多个时,默认采用的时random的方式随机转发,失败后就返回错误
查看服务容器中的resolv.conf文件,确认对应的nameserver是指向core-dns对应的service的,对应的coredns的日志显示正常,没有看到异常信息。由此可以推断coredns在该节点上启动的时候该节点上的resolv文件中还没有能解析指定存储域名的nameserver,应该是后续人为手动加上的,所以解决方式是删除coredns的pod,让其在该node上重建,测试dns的解析是正常的,但是多尝试几次发现会出现不能解析的情况
域名偶尔不能解析
在上述问题中说了当宿主机上namserver有多个时,coredns内部默认采用的时random的方式随机转发,失败后就返回错误。由于集群是处于云上的环境,添加上相对应的nameserver后,云环境自己也有对应的nameserver在resolv.conf文件中配置,导致coredns在转发的时候,random方式选择到云环境自己的dns nameserver的时候,就解析不了内部使用的域名,所以解决方式是修改resolv.conf文件,将我们的nameserver添加到宿主机resolv.conf第一个nameserver,然后修改coredns配置,将其forward的policy设置为sequential,然后重建coredns的pod,常见的coredns的forward插件的配置请参考coredns forward plugin,修改后配置文件如下:
[root@k8s01 coredns]# kubectl get -n kube-system cm coredns -oyaml
apiVersion: v1
data:
Corefile: |
.:53 {
log
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
policy sequential
}
cache 30
loop
reload
loadbalance
}
至此dns解析的问题解决,通常k8s使用dns的时候,还会出现k8s集群内部的service (DNS A或者AAAA记录)解析失败的问题,通常可以查看coredns的的kubernetes的插件是否配置正确,可以参考core dns kubernetes plugin的文档进行相关配置的修改来解决相关问题