当前位置: 首页 > news >正文

CoreDNS 性能优化

CoreDNS 作为 Kubernetes 集群的域名解析组件,如果性能不够可能会影响业务,本文介绍几种 CoreDNS 的性能优化手段。

合理控制 CoreDNS 副本数

考虑以下几种方式:

  1. 根据集群规模预估 coredns 需要的副本数,直接调整 coredns deployment 的副本数:

kubectl -n kube-system scale --replicas=10 deployment/coredns
  1. 为 coredns 定义 HPA 自动扩缩容。

  1. 安装 cluster-proportional-autoscaler 以实现更精确的扩缩容(推荐)。

禁用 ipv6

如果 K8S 节点没有禁用 IPV6 的话,容器内进程请求 coredns 时的默认行为是同时发起 IPV4 和 IPV6 解析,而通常我们只需要用到 IPV4,当容器请求某个域名时,coredns 解析不到 IPV6 记录,就会 forward 到 upstream 去解析,如果到 upstream 需要经过较长时间(比如跨公网,跨机房专线),就会拖慢整个解析流程的速度,业务层面就会感知 DNS 解析慢。

CoreDNS 有一个 template 的插件,可以用它来禁用 IPV6 的解析,只需要给 CoreDNS 加上如下的配置:

template ANY AAAA {rcode NXDOMAIN
}
这个配置的含义是:给所有 IPV6 的解析请求都响应空记录,即无此域名的 IPV6 记录。

优化 ndots

默认情况下,Kubernetes 集群中的域名解析往往需要经过多次请求才能解析到。查看 pod 内 的 /etc/resolv.conf 可以知道 ndots 选项默认为 5:

意思是: 如果域名中 . 的数量小于 5,就依次遍历 search 中的后缀并拼接上进行 DNS 查询。

举个例子,在 debug 命名空间查询 kubernetes.default.svc.cluster.local 这个 service:

  1. 域名中有 4 个 .,小于 5,尝试拼接上第一个 search 进行查询,即 kubernetes.default.svc.cluster.local.debug.svc.cluster.local,查不到该域名。

  1. 继续尝试 kubernetes.default.svc.cluster.local.svc.cluster.local,查不到该域名。

  1. 继续尝试 kubernetes.default.svc.cluster.local.cluster.local,仍然查不到该域名。

  1. 尝试不加后缀,即 kubernetes.default.svc.cluster.local,查询成功,返回响应的 ClusterIP。

可以看到一个简单的 service 域名解析需要经过 4 轮解析才能成功,集群中充斥着大量无用的 DNS 请求。

怎么办呢?我们可以设置较小的 ndots,在 Pod 的 dnsConfig 中可以设置:

然后业务发请求时尽量将 service 域名拼完整,这样就不会经过 search 拼接造成大量多余的 DNS 请求。

不过这样会比较麻烦,有没有更好的办法呢?有的!请看下面的 autopath 方式。

启用 autopath

启用 CoreDNS 的 autopath 插件可以避免每次域名解析经过多次请求才能解析到,原理是 CoreDNS 智能识别拼接过 search 的 DNS 解析,直接响应 CNAME 并附上相应的 ClusterIP,一步到位,可以极大减少集群内 DNS 请求数量。

启用方法是修改 CoreDNS 配置:

kubectl -n kube-system edit configmap coredns

修改红框中圈出来的配置:

  • 加上 autopath @kubernetes。

  • 默认的 pods insecure 改成 pods verified。

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

部署 NodeLocal DNSCache

参考 k8s 官方文档 Using NodeLocal DNSCache in Kubernetes clusters

如果是使用 TKE 并且 kube-proxy 转发模式为 iptables,可以直接在扩展组件中安装此扩展组件,扩展组件说明请参考 TKE 官方文档;如果使用的 ipvs 模式,可以参考 TKE IPVS 模式安装 localdns。

使用 DNSAutoscaler

社区有开源的 cluster-proportional-autoscaler ,可以根据集群规模自动扩缩容,支持比较灵活的扩缩容算法。

如果使用的是 TKE,已经将其产品化成 DNSAutoscaler 扩展组件,在扩展组件中直接安装即可,组件说明请参考 TKE 官方文档。

http://www.lryc.cn/news/42569.html

相关文章:

  • 前端三剑客常见面试题及其答案
  • 【DFS专题】深度优先搜索 “暴搜”优质题单推荐 10道题(C++ | 洛谷 | acwing)
  • 微信小程序自定义组件生命周期有哪些?
  • Linux就该这么学(六)
  • 目标检测算法——YOLOv5/v7/v8改进结合涨点Trick之Wise-IoU(超越CIOU/SIOU)
  • 【蓝桥杯选拔赛真题39】python输出数字组合 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
  • 网络安全工程师做什么?
  • 总结:K8S运维常用命令
  • 你是真的“C”——进行动态内存分配库函数的使用详解
  • Python|蓝桥杯进阶第五卷——数论
  • 用Python实现单例模式
  • 交叉编译说明:工具链安装和环境变量配置
  • 文件上传的多种利用方式
  • 盘一盘C++的类型描述符(二)
  • 慎投,Frontiers这本期刊显示on hold中
  • Winform控件开发(21)——ProgressBar(史上最全)
  • 校招失败后,在外包公司熬了 2 年终于进了字节跳动,竭尽全力....
  • UniApp + SpringBoot 实现接入支付宝支付功能和退款功能
  • 初识进程
  • SOAP传输协议
  • <Linux>进程控制
  • 有手就行 -- 搭建图床(PicGo+腾讯云)
  • “蓝桥杯”递推和递归(一)——取数位
  • 蓝桥杯·3月份刷题集训Day02
  • python --获取内网IP地址
  • 如何衡量你的Facebook广告活动的成功
  • Linux对一个目录及其子目录所有文件添加权限
  • 宝刀未老?低代码何德何能受大厂们的推崇
  • 智能扑克牌识别软件(Python+YOLOv5深度学习模型+清新界面)
  • SQL优化13连问,收藏好!