k8s

CoreDNS性能优化

背景

集群中如果dns的性能不足,可能会影响应用的访问。关于CoreDNS的介绍请看这里。下面介绍几种优化手段。

1.调整CoreDNS的副本数

  1. CoreDNS作为集群中的核心组件,可以根据集群规模大致推算出副本数,比如修改为5个副本:
    kubectl scale deployment/coredns --replicas=5 -n kube-system
  2. 使用cluster-proportional-autoscaler根据集群规模和CPU核心数来实现更精确的扩缩容。

2.禁用 ipv6

  • 容器内发起dns请求时是同时发起ipv4和ipv6的请求的。
  • 如果不需要ipv6的解析,当容器请求某个域名时,coredns解析不到ipv6记录,就会转发到上游去解析。
  • 如果到上游需要经过较长时间(比如跨公网,跨机房专线),就会拖慢整个解析流程的速度,业务层面就会感知到dns解析慢。

使用template插件,可以用它来禁用 IPV6 的解析,添加如下配置,即给所有ipv6的解析请求都响应空记录。
插件的官网地址:https://coredns.io/plugins/template/#description

. {
    template ANY ANY {
      rcode NXDOMAIN
    }
}

3.优化 ndots

file

比如要解析 kubernetes.test.svc.cluster.local 这个 service,

  1. 查询 kubernetes.test.svc.cluster.local.default.svc.cluster.local,查不到。
  2. 查询 kubernetes.test.svc.cluster.local.svc.cluster.local,查不到。
  3. 查询 kubernetes.test.svc.cluster.local.cluster.local,查不到。
  4. 查询 kubernetes.test.svc.cluster.local.openstacklocal,查不到。
  5. 不加后缀,查询 kubernetes.test.svc.cluster.local,查到了。

通过这个栗子可以看到请求一个普通的域名,都需要经过5次解析,集群中充斥着大量无用的 DNS 请求。

自定义dns policy

那么该怎么优化呢?参考这里的自定义dns policy章节,再让业务发起请求时尽量带上完整的域名,这样就不会有过多无效请求。

使用autopath插件

autopath插件可以避免每次域名解析经过多次请求才能解析到,原理是CoreDNS智能识别拼接过search的DNS解析,直接响应CNAME并附上相应的ClusterIP。
插件的官网地址:https://coredns.io/plugins/autopath/

修改coredns的configmap:

ks edit cm coredns

这是原有的cm配置:

file

这是修改后的cm配置:

kubernetes cluster.local in-addr.arpa ip6.arpa {
            # insecure改为verified
           pods verified
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        # 新增
        autopath @kubernetes
        prometheus :9153

coredns会watch所有的pod,启用autopath后,会增加coredns 的内存消耗,所以需要根据情况适当调节coredns的memory request和limit。

3.NodeLocal DNSCache

通过在集群节点上启动一个DaemonSet运行DNS缓存代理来提高集群DNS性能。
参考链接:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/nodelocaldns/

分类: k8s
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部
0
希望看到您的想法,请您发表评论x