记录前因:

K8S部署的集群,最近遇到域名解析失败情况,查看coredns日志,没有明显问题。 解析报错: connection timed out ; no servers could be reached

 重启集群服务,解析没有问题, 基本确认跟某个业务服务有关联

解决过程: 

查看跟踪连接数:sysctl net.netfilter.nf_conntrack_count

message会有日志: nf_conntrack: table full, dropping packet

 可以通过查看跟踪连接详细信息:cat /proc/net/nf_conntrack去统计哪个服务导致

优化对应业务服务解决此次问题

 

学习

认识连接跟踪:

nf_conntrack: 连接跟踪 ,同时支持ipv4和ipv6,用于跟踪连接状态,供其他模块使用。 主要用于linux的NAT和状态防火墙

查看状态:

1.当前跟踪连接详情:cat /proc/net/nf_conntrack

格式说明:

网络层协议名、网络层协议编号、传输层协议名、传输层协议编号、记录失效前剩余秒数、连接状态(不是所有协议都有),之后都是key=value或flag格式,1行里最多2个同名key,第1次出现的来自请求,第2次出现的来自响应

 

2.跟踪连接数

sysctl net.netfilter.nf_conntrack_count

 

3.最大跟踪连接数

dmesg | grep conntrack

cat /proc/sys/net/netfilter/nf_conntrack_max

cat /proc/sys/net/nf_conntrack_max

注:哈希表大小(只读)(64位系统、8G内存默认 65536,16G翻倍,如此类推)net.netfilter.nf_conntrack_buckets;默认最大跟踪连接数,默认 nf_conntrack_buckets * 4

哈希表使用情况:

 grep conntrack /proc/slabinfo

 

根据需求调整

1.连接跟踪调整: 

临时调整(重启节点会丢失)

sysctl -w net.netfilter.nf_conntrack_max=1048576
sysctl -w net.nf_conntrack_max=1048576

永久调整:

echo 'net.netfilter.nf_conntrack_max' = 1048576 >> /etc/sysctl.conf
echo 'net.nf_conntrack_max = 1048576' >> /etc/sysctl.conf
sysctl -p

 

2.哈希表大小调整:

临时生效:

echo 262144 > /sys/module/nf_conntrack/parameters/hashsize
永久生效

echo 'options nf_conntrack hashsize=262144' >> /etc/modprobe.d/iptables.conf

 

3.响应时间调整:

临时生效

# 主动方的最后1个状态。默认120秒
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

# CLOSE_WAIT是被动方收到FIN发ACK,然后会转到LAST_ACK发FIN,除非程序写得有问题,正常来说这状态持续时间很短。#默认 60 秒
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_close_wait=15

# 理论上不用这么长,不小于 net.ipv4.tcp_keepalive_time 就行了。默认 432000 秒(5天)
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=300

永久生效
# 修改内核配置文件(/etc/sysctl.conf)
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
net.netfilter.nf_conntrack_tcp_timeout_close_wait=15
net.netfilter.nf_conntrack_tcp_timeout_established=300

# 如果要马上应用配置文件里的设置:
sysctl -p /etc/sysctl.conf

 

禁用跟踪连接

注意:如果有docker、防火墙等服务, 不可以禁用

查看模块:lsmod | egrep "ip_table|iptable|nat|conntrack"

删除/etc/sysconfig/iptables-config里:IPTABLES_MODULES   

关闭防火墙: systemctl stop iptables

移除相关模块

rmmod iptable_nat
rmmod ip6table_nat
rmmod nf_defrag_ipv4
rmmod nf_defrag_ipv6
rmmod nf_nat
rmmod nf_nat_ipv4
rmmod nf_nat_ipv6
rmmod nf_conntrack
rmmod nf_conntrack_ipv4
rmmod nf_conntrack_ipv6
rmmod xt_conntrack

开启相关模块
modprobe iptable_nat
modprobe ip6table_nat
modprobe nf_defrag_ipv4
modprobe nf_defrag_ipv6
modprobe nf_nat
modprobe nf_nat_ipv4
modprobe nf_nat_ipv6
modprobe nf_conntrack
modprobe nf_conntrack_ipv4
modprobe nf_conntrack_ipv6
modprobe xt_conntrack

参考:

https://testerhome.com/topics/15824

https://zhuanlan.zhihu.com/p/349569851