当流量高时,K8S容器出现DNS解析失败

问题状况:
当K8S遇到流量高峰时,经常会报错 “ php_network_getaddresses: getaddrinfo failed”,就是遇到了域名无法解析的情况。
1 最先想到升配,因为问题总是伴随着高流量产生,结果无效。
2 后来阿里云的人提示是基础镜像Alpine的原因,建议换CentOS。原来Alpine使用了musl,CentOS等Linux发行版使用的glibc,在实现DNS上不同。但我们换成CentOS,问题还是没解决。
3 后来分析应用装在普通机器上没问题,那应该是K8S 解析DNS的组件出了问题。检查系统级容器,发现coredns报了一堆错,于是coredns升版本,调高限制,coredns不报错了,但依旧有DNS解析失败。
4 实在没办法了,把kube-system中的系统容器都调高限制,问题依旧。

解决过程:联系阿里云的人,他们抓了几天网络包,分析到了DNS丢包情况(好吧,这个就是我们的问题)。最后在/var/log/messages里找到了关键信息

nf_conntrack: table full, dropping packet

一查,原来docker会调用nf_conntrack 连接跟踪模块。Linux为每个经过内核网络栈的数据包,生成一个新的连接记录项,当服务器处理的连接过多时,连接跟踪表被打满,服务器会丢弃新建连接的数据包。

需要调整3个参数:

echo 262144 | sudo tee /sys/module/nf_conntrack/parameters/hashsize #调整net.netfilter.nf_conntrack_buckets
sudo sysctl net.netfilter.nf_conntrack_max=1048576
sudo sysctl net.netfilter.nf_conntrack_tcp_timeout_established=600

参考博文:
https://www.zybuluo.com/babydragon/note/255530
http://keithmo.me/post/2018/08/25/conntrack-tuning/

你可能感兴趣的:(当流量高时,K8S容器出现DNS解析失败)