Kubernetes Dns query调优

Kubernetes 目前使用的kube-dns来实现集群内部的service dns记录解析。默认情况下/etc/resolv

/ # more /etc/resolv.conf
nameserver 172.19.0.10
search crm-platform.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

search doamin列表默认情况下,它只包含本地域名。这可以通过在search关键字后面列出所需的域搜索路径来添加。kubernetes为每个容器配置默认是${namespace}.svc.cluster.local svc.cluster.local cluster.local。在一次dns域名查询时,将会尝试使用每个search doamin依次搜索少于ndots点(默认值为1)的解析器查询,直到找到匹配项。对于具有多个子域的环境,建议调整选项ndots:n,以避免man-in-the-middle攻击和root-dns-servers的不必要通信。
请注意,如果搜索域对应的服务器不是本地的,那么这个查询过程可能会很慢,并且会产生大量的网络流量。如果其中一个搜索域域没有可用的服务器,则查询将超时。

kubernetes 集群内容器里面dns查询抓包过程如下:
kubernetes pod内容器默认的dns请求过程,我们ping www.baidu.com抓包分析

/ # tcpdump -i eth0 -nt -s 500 port domain -v | grep r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 500 bytes
    172.16.6.243.46930 > 172.19.0.10.53: 64884+ A? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com.crm-platform.svc.cluster.local. (90)
    172.16.6.243.46930 > 172.19.0.10.53: 65374+ AAAA? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com.crm-platform.svc.cluster.local. (90)
    172.16.6.243.48706 > 172.19.0.10.53: 51041+ A? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com.svc.cluster.local. (77)
    172.16.6.243.48706 > 172.19.0.10.53: 51397+ AAAA? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com.svc.cluster.local. (77)
    172.16.6.243.56542 > 172.19.0.10.53: 2243+ A? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com.cluster.local. (73)
    172.16.6.243.56542 > 172.19.0.10.53: 2519+ AAAA? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com.cluster.local. (73)
    172.16.6.243.44830 > 172.19.0.10.53: 22499+ A? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com. (59)
    172.16.6.243.44830 > 172.19.0.10.53: 22789+ AAAA? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com. (59)
    172.19.0.10.53 > 172.16.6.243.44830: 22499* 1/0/0 r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com. A 192.168.1.224 (75)

可以看到如上信息,r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com中ndots为4小于5,会一次从search domain查询,会造成大量的网络通信,降低dns query性能。
当我们设置ndots:2之后:

/ # tcpdump -i eth0 -nt -s 500 port domain -v | grep r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 500 bytes
    172.16.6.243.38612 > 172.19.0.10.53: 10944+ A? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com. (59)
    172.16.6.243.38612 > 172.19.0.10.53: 11338+ AAAA? r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com. (59)
    172.19.0.10.53 > 172.16.6.243.38612: 10944* 1/0/0 r-2ze2f5a0ee3afde4.redis.rds.aliyuncs.com. A 192.168.1.224 (75)

由于以上原因,我们建议将设置ndots:2,包含跨namespace service(servie.namepsace)通信即可,可以减少大量无用的dns query来避免查询超时。

自定义pod的dns配置在1.9以上才被得到支持.建议在集群内查询dns 域名时指定绝对路径:www.baidu.com.

参考地址:

  • https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
  • https://linux.die.net/man/5/resolv.conf

你可能感兴趣的:(Kubernetes Dns query调优)