1.集群dns切换后,Pod解析用的dns依然不对问题分析
背景描述
最近,遇到了一个域名解析的问题,明明网络已经更换了DNS服务器,并且旧的DNS服务器已经关闭。但是,k8s集群里的pod一直无法正常解析。
尝试修改所有宿主机的/etc/resolv.conf 文件,都已指向新DNS,并且手工验证解析正常,但pod还是无法正确解析,进入pod里检查解析可以正常去找coredns的服务ip,但检查coredns时发现解析找的还是老的dns服务器的ip。
问题分析
经过分析,在Kubelet配置中通过使用–cluster-dns=xxx.xx.xx.xx参数指定的coredns地址会被写入容器的/etc/resolv.conf配置中。
...........................................................................................................................
并且在kublet配置中通过resolv-conf参数可以指定一个主机上的DNS配置文件。
但在默认DNS策略下主机上DNS配置文件中仅仅只有search部分会被加到容器内,nameserver不会被添加到容器中。
要想添加自定义的上游DNS可以通过修改coredns的configmap配置来实现。
...........................................................................................................................
解决思路
-
直接修改coredns上游dns服务器。
-
修改coredns添加 hosts 解析
-
根据域名指定上游dns服务器
这里,我采用第三种方法
修改coredns 解析指定域名走指定dns
kubectl -n kube-system edit configmap coredns
example.com:53 {
errors
cache 30
forward . {
10.231.58.6
10.231.58.12
}
reload
}
example.com 为需要解析的域名
10.231.58.6 为外部dns服务器
注:如果想要监听所有域名,可以使用 .:53。
修改后的configmap文件
apiVersion: v1
kind: ConfigMap
metadata:
annotations:
labels:
eks.amazonaws.com/component: coredns
k8s-app: kube-dns
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream 172.16.0.1
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
proxy . 172.16.0.1
cache 30
loop
reload
loadbalance
}
example.com:53 {
errors
cache 30
forward . {
10.231.58.6
10.231.58.12
}
reload
}
consul.local:53 {
errors
cache 30
proxy . 10.150.0.1
}
配置解释
-
.:53 表示在 53 端口上监听所有域名的查询。
-
errors 插件用于记录错误。
-
health 插件用于健康检查。
-
kubernetes 插件用于 Kubernetes 服务发现。
-
prometheus 插件用于向 Prometheus 公开 CoreDNS 指标。
-
forward . 10.231.58.6 表示将所有的 DNS 查询转发到 10.231.58.6。
-
cache 30 表示设置缓存时间为 30 秒。
-
loop、reload 和 loadbalance 插件用于提供额外的功能,如防止循环、配置重载和负载均衡。
逐个重启 coredns 容器
kubectl get pod -n kube-system |grep coredns
kubectl delete pod core-dns-xxxx -n kube-system
验证解析是否正常
kubectl run busybox --restart=Never --image=busybox -- sleep 3600
kubectl exec busybox -- nslookup example.com