在使用K8s集群的过程中,我们发现部分Pod在进行Service名称解析时,容易出现请求超时的情况。
说明:NodeLocal DNSCache 的本地侦听 IP 地址可以是任何地址,只要该地址不和你的集群里现有的 IP 地址发生冲突。 推荐使用本地范围内的地址,例如,IPv4 链路本地区段 '169.254.0.0/16' 内的地址, 或者 IPv6 唯一本地地址区段 'fd00::/8' 内的地址。
1. 按照下方示例创建一个资源清单,并把它保存为 nodelocaldns.yaml
。
https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
把清单里的变量更改为正确的值:
kubedns=`kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP}`
domain=<cluster-domain>
localdns=<node-local-address>
#在本示例中,使用下面的值
domain=cluster.local
localdns=169.254.20.10
注:<cluster-domain> 的默认值是 "cluster.local"。<node-local-address> 是 NodeLocal DNSCache 选择的本地侦听 IP 地址,例如:169.254.20.10。
如果 kube-proxy 运行在 IPTABLES 模式,执行下面命令更改设置:
sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/__PILLAR__DNS__SERVER__/$kubedns/g" nodelocaldns.yaml
注:node-local-dns Pod 会设置 __PILLAR__CLUSTER__DNS__ 和 __PILLAR__UPSTREAM__SERVERS__。在此模式下, node-local-dns Pod 会同时侦听 kube-dns 服务的 IP 地址和 <node-local-address> 的地址,以便 Pod 可以使用其中任何一个 IP 地址来查询 DNS 记录。
如果 kube-proxy 运行在 IPVS 模式,则使用下面命令:
sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/,__PILLAR__DNS__SERVER__//g; s/__PILLAR__CLUSTER__DNS__/$kubedns/g" nodelocaldns.yaml
3. 部署程序
kubectl create -f nodelocaldns.yaml
启用后, node-local-dns Pod 将在每个集群节点上的 kube-system 命名空间中运行。
$ kubectl get pod -n kube-system -l k8s-app=node-local-dns
NAME READY STATUS RESTARTS AGE
node-local-dns-clrsb 1/1 Running 0 6m35s
node-local-dns-msx22 1/1 Running 0 6m35s
node-local-dns-wpphv 1/1 Running 0 6m35s
$ sed -i 's/$kubedns/$localdns/g' /var/lib/kubelet/config.yaml
$ systemctl daemon-reload && systemctl restart kubelet
如下所示:
$ cat /etc/resolv.conf
nameserver 169.254.20.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
至此,整个部署过程完成,现在可以开始体验NodeLocal DNSCacher带来的效果了。
推荐内容:
《Kubernetes从入门到实战》 优惠价89元
,原价 499元《玩转Prometheus监控》 优惠价79元
,原价 299元
------------------ END ------------------
关注公众号,获取更多精彩内容
感谢阅读,如果觉得内容还行可以随手点个“赞”或者“在看”,也欢迎分享文章到朋友圈和技术群。