IPVS下CoreDNS滚动更新解析失败原理探究

 更新时间:2023年03月09日 08:59:46   作者:Honest1y  
这篇文章主要为大家介绍了IPVS下CoreDNS滚动更新解析失败原理探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

IPVS 模式下,当 coredns 滚动更新期间,集群监控日志出现大量的连接超时,由于日志异常的时间和 coredns 变更时间完全重叠,怀疑是 coredns 滚动更新造成,下面进行问题复现,并给出优化方案。

实验

  • 创建一个由 2 个 POD 作为后端的 coredns service
  • 通过创建大量 DNS 查询来访问此服务
  • 触发滚动更新 coredns

顺序查询

while true;do time (dig +tries=1 -4 +short A <name> @<dns clusterIP> >> dig.log) >> dig.log 2>&1;done

可以看到在 顺序执行(非并发压测)的情况下,已经出现较多DNS解析超时的情况

并发查询

dnsperf是一个开源的DNS压力测试工具,用户可以用它来对DNS服务器或者Local DNS做压力测试。dnsperf目前的实现是单进程模式,通过epoll非阻塞地处理网络事件

$ echo "www.mervinwang.com A" > dnstest
$ dnsperf -d dnstest -s <DNS的IP> -c100000 -Q100000 -l60
数据\解析超时时间1000ms500ms
sent6742340925
completed6435834519
lost3065 (4.55%)6406 (15.65%)

优化

通过查阅 issue 得知,这里可能与ipvs_udp_timeout有关,默认的设置的是300scoredns 滚动更新的时候 ipvs 中 udp 老链接会 300s 才删除,如果在 300s 内客户端有端口重用的话就会出现这个问题,并且这个时间和日志发生的时间也很类似,持续了5分钟。

优化改动

kube-proxy 加了ipvs-udp-timeout=10s

    spec:
      containers:
      - args:
        - --kubeconfig=/var/lib/kube-proxy/config
        - --hostname-override=$(NODE_NAME)
        - --v=2
        - --proxy-mode=ipvs
        ...
        - --ipvs-udp-timeout=10s

等待5分钟(关键!!)

coredns configmaphealth lameduck配置改成20s

Corefile: |-
    .:53 {
        errors
        health {
            lameduck 20s
        }
        ready
...
}

查看 coredns日志,等待 reload

修改 coredns configmap 后,coredns 会自动 Reload,Relaod 过程中打印输出的 lameduck 时间为 上次配置的时间

优化后结果

数据类型\解析超时时间1000ms500ms
sent8502780502
completed8493080423
lost97 (0.11%)79 (0.10%)

可以看到,效果还是很明显的~

最后附上 dnspref 工具的常用参数:

Dnsperf 支持下面的这些命令行参数:
-s     用来指定DNS服务器的IP地址,默认值是127.0.0.1
-p     用来指定DNS服务器的端口,默认值是53
-d     用来指定DNS消息的内容文件,该文件中包含要探测的域名和资源记录类型,见下文
-t     用来指定每个请求的超时时间,默认值是3000ms
-Q     用来指定本次压测的最大请求数,默认值是1000
-c     用来指定并发探测数,默认值是100. dnsperf会从-d指定的文件中随机选取100个座位探测域名来发送DNS请求.
-l     用来指定本次压测的时间,默认值是无穷大。
-e     本选项通过EDNS0,在OPT资源记录中运用edns-client-subnet来指定真实的client ip. 
-i     用来指定前后探测的时间间隔,因为dnsperf是一个压测工具,所以本选项目前还不支持。
-P     指定用哪个传输层协议发送DNS请求,udp或者tcp。默认值是udp
-f     指定用什么地址类型发送DNS请求,inet或者inet6。默认值是inet
-v     除了标准的输出外,还输出每个相应码的个数。
-h     打印帮助

参考文档 github.com/kubernetes/…

以上就是IPVS下CoreDNS滚动更新解析失败原理探究的详细内容,更多关于IPVS CoreDNS滚动更新解析失败的资料请关注脚本之家其它相关文章!

相关文章

  • Kubernetes组件和架构简介

    Kubernetes组件和架构简介

    Kubernetes是google开源的容器编排工具,本质是一组服务器集群,在集群的各个节点上运行程序来进行容器进行管理,最终实现资源管理智能化、自动化,这篇文章主要介绍了Kubernetes组件和架构简介,需要的朋友可以参考下
    2023-09-09
  • K8S中Pod重启策略及重启可能原因详细讲解

    K8S中Pod重启策略及重启可能原因详细讲解

    在k8s集群中当某个pod资源需要重启时,我们只会对其进行删除,由其pod控制器进行重新构建,下面这篇文章主要给大家介绍了关于K8S中Pod重启策略及重启可能原因的相关资料,需要的朋友可以参考下
    2023-05-05
  • CentOS 7下YUM 本地仓库的搭建详细步骤

    CentOS 7下YUM 本地仓库的搭建详细步骤

    这篇文章主要介绍了CentOS 7下YUM 本地仓库的搭建详细步骤的相关资料,希望通过本文能帮助到大家实现这样的功能,需要的朋友可以参考下
    2017-09-09
  • 详解Rainbond内置ServiceMesh微服务架构

    详解Rainbond内置ServiceMesh微服务架构

    这篇文章主要为大家介绍了详解Rainbond内置ServiceMesh微服务架构,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 使用sealos快速搭建K8s集群环境的过程

    使用sealos快速搭建K8s集群环境的过程

    这篇文章主要介绍了使用sealos快速搭建K8s集群环境,主要包括sealos安装方法,虚拟机设置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 2022最新青龙面板部署完整版图文教程

    2022最新青龙面板部署完整版图文教程

    这篇文章主要介绍了2022最新青龙面板部署完整版图文教程,下面以腾讯云服务器为例,先选地区、然后选择官方镜像、系统镜像、Centos7.6版本,需要的朋友可以参考下
    2022-05-05
  • k8s如何使用NFS作为StorageClass提供动态存储

    k8s如何使用NFS作为StorageClass提供动态存储

    本文主要介绍了k8s中的StorageClass,包括其定义、引入的原因、实现方式、定义方法以及回收策略对数据的影响等,首先,StorageClass是在K8s集群中创建用于动态PV的管理,可以链接至不同的后端存储,对存储的请求可以指向StorageClass
    2024-09-09
  • K8S 中 kubectl 命令详解

    K8S 中 kubectl 命令详解

    这篇文章主要介绍了K8S 中 kubectl 命令,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • RFO SIG之openEuler AWS AMI 制作详解

    RFO SIG之openEuler AWS AMI 制作详解

    这篇文章主要为大家介绍了RFO SIG之openEuler AWS AMI 制作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • K8S节点本地存储被撑爆问题彻底解决方法

    K8S节点本地存储被撑爆问题彻底解决方法

    这篇文章主要为大家介绍了K8S节点本地存储被撑爆问题彻底解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论