目录

Cilium模式下部署node-local-dns

概述

node-local-dns 的作用主要如下:

  1. 使用当前的dns体系结构,如果没有本地kube-dns/coredns实例,则具有最高dns qps的pod可能必须延伸到另一个节点。在这种场景下,拥有本地缓存将有助于改善延迟
  2. 跳过iptables dnat和连接跟踪将有助于减少conntrack竞争并避免udp dns条目填满conntrack表
  3. 从本地缓存代理到kube-dns服务的连接可以升级为tcp。tcp conntrack条目将在连接关闭时被删除,相反udp条目必须超时(默认nf_conntrack_udp_timeout是30秒)
  4. 将dns查询从udp升级到tcp将减少由于被丢弃的udp包和dns超时而带来的尾部等待时间;这类延时通常长达30秒(3次重试+10秒超时)。由于nodelocal缓存监听udp dns查询,应用不需要变更
  5. 在节点级别对dns请求的度量和可见性
  6. 可以重新启用负缓存,从而减少对kube-dns服务的查询数量

Cilium模式

在 Cilium 的模式下, NodeLocal DNSCache 的使用有些不一样。简单理解就是实现的 Service 会把所有发送到非容器集群的流量都管理了,默认配置下,发送到 NodeLocal DNSCache 的流量会被 Service 接管然后分发,但是 NodeLocal DNSCache 的本质就是要实现本地代理 DNS 解析的请求,需要客户端对 NodeLocal DNSCache 的访问可以在本地进行转发,这样才可以避免跨节点的流量,这也是 NodeLocal DNSCache 可以提升 DNS 解析速度的核心思想。而 Cilium 通过 CiliumLocalRedirectPolicy 的机制,实现了本地流量的自动代理,也就是把发送到 kube-dns 的流量先转发到 node-local-dns 上。

首先要更新 Cilium 的默认配置。

1
2
3
4
5
6
helm upgrade cilium . \
--namespace kube-system \
--reuse-values \
--set localRedirectPolicy=true

kubectl get crds|grep -i ciliumlocalredirectpolicies

然后部署 node-local-dns,并且创建 node-local-dns-lrp。

1
2
3
4
wget https://raw.githubusercontent.com/cilium/cilium/v1.16/examples/kubernetes-local-redirect/node-local-dns.yaml
kubedns=$(kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP}) && sed -i "s/__PILLAR__DNS__SERVER__/$kubedns/g;" node-local-dns.yaml
kubectl apply -f node-local-dns.yaml
kubectl apply -f https://raw.githubusercontent.com/cilium/cilium/v1.16/examples/kubernetes-local-redirect/node-local-dns-lrp.yaml

参考资料

  1. local-redirect-policy
  2. node-local-dns
  3. 使用NodeLocal DNSCache组件
  4. 节点本地域名解析加速节点本地域名解析加速(NodeLocal DNSCache)
  5. Kubernetes教程(二三)—使用 NodeLocalDNS 提升集群 DNS 性能和可靠性