背景
我司使用的是混合云,云上环境k8s中处理数据的pod不能正常解析公司内部存储的dns域名,从而导致数据处理程序失败,但是core-dns所在的pod上市能解析该域名的。
分析
1. 域名完全不能解析
查看coredns的配置文件如下
apiVersion: v1
data:
Corefile: |
.:53 {
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
}
cache 30
loop
reload
loadbalance
}
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
其中 forward . /etc/resolv.conf 配置表示使用当coredns内部不能解析的时候,向宿主机上的resolv.conf文件中配置的nameserver转发dns解析请求,当宿主机上namserver有多个时,默认采用的时random的方式随机转发,失败后就返回错误。
查看数据处理容器中的resolv.conf文件,确认对应的nameserver是指向core-dns对应的service的,对应的core-dns的日志显示正常,没有看到异常信息。由此可以推断coredns在该节点上启动的时候该节点上的resolv文件中还没有能解析指定存储域名的nameserver,应该是后续人为手动加上的,找相关的运维人员确认,确实是后续加上的,所以解决方式是删除coredns的pod,让其在该node上重建,测试dns的解析是正常的,但是多尝试几次发现会出现不能解析的情况。
2. 域名完全偶尔不能解析 在问题一中我们说了当宿主机上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,修改后的配置文件如下
apiVersion: v1
data:
Corefile: |
.:53 {
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
}
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
至此,dns解析的问题解决,通常k8s使用dns的时候,还会出现k8s集群内部的service (DNS A或者AAAA记录)解析失败的问题,通常可以查看coredns的的kubernetes的插件是否配置正确,通常一些云环境默认的kubrenetes的插件配置可能不能正常work,可以参考core dns kubernetes plugin的文档进行相关配置的修改来解决相关问题。
|