跳转至

节点本地 DNS 缓存和 Kube-OVN 适配

NodeLocal DNSCache 是通过集群节点上作为 DaemonSet 运行 DNS 缓存来提高集群 DNS 性能,该功能也可以和 Kube-OVN 适配。

节点本地 DNS 缓存部署

部署 Kubernetes 的节点本地 DNS 缓存

该步骤参考 Kubernetes 官网配置 Nodelocaldnscache

使用以下脚本部署:

#!bin/bash

localdns=169.254.20.10
domain=cluster.local
kubedns=10.96.0.10

wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml
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

kubectl apply -f nodelocaldns.yaml

修改每个节点上的 kubelet 配置文件,将 /var/lib/kubelet/config.yaml 中的 clusterDNS 字段修改为本地 DNS IP 169.254.20.10,然后重启 kubelet 服务。

Kube-OVN 相应 DNS 配置

部署好 Kubernetes 的 Nodelocal DNScache 组件后,Kube-OVN 需要做出下面修改:

Underlay Subnet 开启 U2O 开关

如果是 Underlay Subnet 需要使用本地 DNS 功能,需要开启 U2O 功能,即在 kubectl edit subnet {your subnet} 中配置 spec.u2oInterconnection = true , 如果是 Overlay Subnet 则不需要这步操作。

给 Kube-ovn-controller 指定对应的本地 DNS IP

kubectl edit deployment kube-ovn-controller -n kube-system

spec.template.spec.containers.args 增加字段 --node-local-dns-ip=169.254.20.10

重建已经创建的 Pod

这步原因是让 Pod 重新生成 /etc/resolv.conf 让 nameserver 指向本地 DNS IP,如果没有重建 Pod 的 nameserver 将仍然使用集群的 DNS ClusterIP。同时 u2o 开关如果开启也需要重建 Pod 来重新生成 Pod 网关。

验证节点本地 DNS 缓存功能

以上配置完成后可以找到 Pod 验证如下,可以看到 Pod 的 DNS 服务器是指向本地 169.254.20.10,并成功解析域名:

# kubectl exec -it pod1 -- nslookup github.com
Server:         169.254.20.10
Address:        169.254.20.10:53


Name:   github.com
Address: 20.205.243.166

也可以在节点抓包验证如下,可以看到 DNS 查询报文通过 ovn0 网卡到达本地的 DNS 服务,DNS 响应报文原路返回:

# tcpdump -i any port 53

06:20:00.441889 659246098c56_h P   ifindex 17 00:00:00:73:f1:06 ethertype IPv4 (0x0800), length 75: 10.16.0.2.40230 > 169.254.20.10.53: 1291+ A? baidu.com. (27)
06:20:00.441889 ovn0  In  ifindex 7 00:00:00:50:32:cd ethertype IPv4 (0x0800), length 75: 10.16.0.2.40230 > 169.254.20.10.53: 1291+ A? baidu.com. (27)
06:20:00.441950 659246098c56_h P   ifindex 17 00:00:00:73:f1:06 ethertype IPv4 (0x0800), length 75: 10.16.0.2.40230 > 169.254.20.10.53: 1611+ AAAA? baidu.com. (27)
06:20:00.441950 ovn0  In  ifindex 7 00:00:00:50:32:cd ethertype IPv4 (0x0800), length 75: 10.16.0.2.40230 > 169.254.20.10.53: 1611+ AAAA? baidu.com. (27)
06:20:00.442203 ovn0  Out ifindex 7 00:00:00:52:99:d8 ethertype IPv4 (0x0800), length 145: 169.254.20.10.53 > 10.16.0.2.40230: 1611* 0/1/0 (97)
06:20:00.442219 659246098c56_h Out ifindex 17 00:00:00:ea:b3:5e ethertype IPv4 (0x0800), length 145: 169.254.20.10.53 > 10.16.0.2.40230: 1611* 0/1/0 (97)
06:20:00.442273 ovn0  Out ifindex 7 00:00:00:52:99:d8 ethertype IPv4 (0x0800), length 125: 169.254.20.10.53 > 10.16.0.2.40230: 1291* 2/0/0 A 39.156.66.10, A 110.242.68.66 (77)
06:20:00.442278 659246098c56_h Out ifindex 17 00:00:00:ea:b3:5e ethertype IPv4 (0x0800), length 125: 169.254.20.10.53 > 10.16.0.2.40230: 1291* 2/0/0 A 39.156.66.10, A 110.242.68.66 (77)

微信群 Slack Twitter Support Meeting

评论