2

问题描述:

本环境k8s版本为:v1.22.2

在部署k8s集群的时候选择安装了NodeLocal DNSCache服务以便加速各个节点POD的DNS解析速度,但是因为某些原因需要删除DNSCache服务,在使用部署NodeLocal DNSCache的yaml文件删除DnsCache相关的POD后再次新建的POD还是会或取到之前配置的NodeLocal DNSCache的地址。导致在删除NodeLocal DNSCache相关的POD后无法正常解析域名。

问题现象:

在删除NodeLocal DNSCache相关POD后仍然获取的是169.254.20.10的地址,导致无法正常解析集群内域名。

root@master01:~# kubectl run --iamge=busybox busybox -- tail -f /etc/hosts
root@master01:~# kubectl exec -it busybox -- /bin/sh
/ # cat /etc/resolv.conf
nameserver 169.254.20.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

解决方法:

经过查阅资料发现在集群中新建POD所获取的DNS地址是由各个node节点上的kubelet进行控制的,修改各个节点kubelet相关配置文件(如图为kubelet配置文件的位置)
080c516dbe92c3bd7a4e273b280cfcb.png

确定coredns的service的地址为10.100.0.2.

root@master01:~# kubectl get svc -A
NAMESPACE     NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes       ClusterIP   10.100.0.1       <none>        443/TCP                  5h38m
kube-system   kube-dns         ClusterIP   10.100.0.2       <none>        53/UDP,53/TCP,9153/TCP   5h32m
kube-system   metrics-server   ClusterIP   10.100.181.165   <none>        443/TCP                  3h12m

修改kubelet配置文件中的clusterDNS字段为coredns的service的地址。

root@node02:~# cat /var/lib/kubelet/config.yaml 
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 192.168.10.102
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/ssl/ca.pem
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
cgroupDriver: systemd 
cgroupsPerQOS: true
clusterDNS:
- 10.100.0.2

重启kubelet

root@node02:~# systemctl restart kubelet

按照如上方法修改完所有结点的kubelet配置文件后重启kubelet,再次创建新的POD测试发现新创建的POD获取到的DNS地址已经为10.100.0.2.

ps:本文操作已在本人环境中操作成功,如有问题亦或表述不清的地方欢迎指正。


李朝阳
52 声望14 粉丝

人生到处知何似,应似飞鸿踏雪泥