一、发现问题
新搭建了Kubernetes1.8.1,想对ingress和nodeport性能进行测试。结果ab跑了没几个请求,K8S的机器就报错了。
kernel: nf_conntrack: table full, dropping packet
二、排查定位
这也算经典的错误了,查了下nf_conntrack_max只有131072,肯定是不够的,CentOS7.3默认应该是65536*4=262144。肯定是有地方改动这个值了,查了一圈没找到,最后看了下Kube-proxy的日志,结果还真是它改的!
[root@k8s-m-1 ~]# kubectl logs kube-proxy-q2s4h -n kube-system
W0110 09:32:36.679540 1 server_others.go:263] Flag proxy-mode="" unknown, assuming iptables proxy
I0110 09:32:36.681946 1 server_others.go:117] Using iptables Proxier.
I0110 09:32:36.699112 1 server_others.go:152] Tearing down inactive rules.
I0110 09:32:36.860064 1 conntrack.go:98] Set sysctl 'net/netfilter/nf_conntrack_max' to 131072
I0110 09:32:36.860138 1 conntrack.go:52] Setting nf_conntrack_max to 131072
I0110 09:32:36.860192 1 conntrack.go:98] Set sysctl 'net/netfilter/nf_conntrack_tcp_timeout_established' to 86400
I0110 09:32:36.860230 1 conntrack.go:98] Set sysctl 'net/netfilter/nf_conntrack_tcp_timeout_close_wait' to 3600
I0110 09:32:36.860480 1 config.go:102] Starting endpoints config controller
三、寻找罪魁祸首
翻看了一下源代码,发现这是一个预设值,在kube-proxy的参数里可以找到。
--conntrack-max-per-core int32 Maximum number of NAT connections to track per CPU core (0 to leave the limit as-is and ignore conntrack-min). (default 32768)
#@每个核默认32768个,总数就是32768*CPU核数
--conntrack-min int32 Minimum number of conntrack entries to allocate, regardless of conntrack-max-per-core (set conntrack-max-per-core=0 to leave the limit as-is). (default 131072)
#@最小值是131072个,CPU核数低于或者等于4,默认是131072
四、解决
找到原因了,如何修改kube-proxy的参数呢?
我的K8S使用kubeadm安装的,kube-proxy是运行在容器里的,只能去dashboard里面去修改YAML文件了。
"command": [
"/usr/local/bin/kube-proxy",
"--kubeconfig=/var/lib/kube-proxy/kubeconfig.conf",
"--cluster-cidr=10.96.0.0/12",
"--conntrack-min=524288"
],
改完就自动生效了。
看来Kubernetes的预设值还有很多坑,得仔细看看。
五、参考资料
https://kubernetes.io/docs/reference/generated/kube-proxy/