1. conntracker是什么
conntracker跟踪并且记录连接状态。Linux为每一个经过网络堆栈的数据包,生成一个新的连接记录项 (Connection entry)。此后,所有属于此连接的数据包都被唯一地分配给这个连接,并标识连接的状态。连接跟踪是防火墙模块的状态检测的基础,同时也是地址转换中实 现SNAT和DNAT的前提。
那么Netfilter又是如何生成连接记录项的呢?每一个数据,都有“来源”与“目的”主机,发起连接的主机称为“来源”,响应“来源”的请求的主机即 为目的,所谓生成记录项,就是对每一个这样的连接的产生、传输及终止进行跟踪记录。由所有记录项产生的表,即称为连接跟踪表。
由于本文主要是介绍kube-proxy是怎么设置conntracker参数的,关于conntracker这里推荐看以下3篇文章:
2. kube-proxy的conntracker参数设置
在使用k8s集群做压测时,发现很多连接关闭,查看/var/log/messages发现有很多的nf_conntrack: table full, dropping packet。查看了/proc/sys/net/netfilter/nf_conntrack_max,发现里面的值被更改了,查看/var/log/messages发现了kube-proxy的重启操作。经过排除,最后将问题锁定在kube-proxy上,然后直接查找源码看它是怎么更改的。
首先查看源码中关于conntracker的参数设置
具体的设置代码
从代码中看到,首先是调用getConntrackMax函数获取max的值,然后设置max,getConntrackMax函数如下
如果我们在kube-proxy的启动参数中没有设置–conntrack-max参数,则对比–conntrack-min和–conntrack-max-per-core的值与cpu核数的大小取其大者返回max值。最后调用SetMax设置conntrack-max的值
继续跟踪SetSysctl函数会得到设置的完整路径为/proc/sys/net/netfilter/nf_conntrack_max。–conntrack-tcp-timeout-established与–conntrack-tcp-timeout-close-wait参数的设置同理,最后对应的文件路径分别为/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established和/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait。
3. 总结
kube-proxy对conntracker的系统设置体现在上述代码中,这解释了我们初始配置的conntracker参数被kube-proxy给修改了,如果要保持conntracker的参数不变,主要是nf_conntrack_max、nf_conntrack_tcp_timeout_established、nf_conntrack_tcp_timeout_close_wait,这3个参数可以在kube-proxy的启动参数中和我们想要设置的参数一致。这里有必要提醒下nf_conntrack_max的设置,在源码中,关于conntrack-max参数是这样提示的“This feature will be removed in a later release.”,所以为了保守点,我们可以不设置这个参数,改为设置–conntrack-min或–conntrack-max-per-core,可以通过两种方式设置max的值
1. 设置–conntrack-min为我们期望的conntrack_max的值(推荐);
2. 设置–conntrack-max-per-core为我们期望的conntrack_max的值除以cpu核数。