问题表象
部分节点通过k8s node节点的svc访问容器内容,部分节点正常,部分节点时好时坏
通过抓包查看
tcpdump -i eth0 host 客户端ip and port 29004 -vvv
发现不通的节点在不通的情况下 发出的seq包到达了k8s node节点 但是k8s node节点没有响应syn
产生原因
当客户端发出的syn包带有时间戳的情况下,经过NAT转换后,如果使用的端口被之前使用过,而且时间戳大于本次syn包中的时间戳。系统将会直接丢弃。造成本次链接无法正常完成TCP/IP的3次握手。
可能是因为阿里云环境不同网段或者转发有nat,所以造成了这个情况
解决方案
1. 执行命令 vi /etc/sysctl.conf。
2. 添加如下内容:net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_timestamps=0。
3. 输入指令 # sysctl -p 使配置生效。
原理
通过查阅资料,发现tcp_timestamps默认是开启,如果再把tcp_tw_recycle设置为1,则60s内同一源ip主机的socket connect请求中的timestamp必须是递增的。也就是说服务器打开了 tcp_tw_reccycle了,就会检查时间戳,如果对方发来的包的时间戳是乱跳的或者说时间戳是滞后的,这样服务器肯定不会回复,所以服务器就把带了“倒退”的时间戳的包当作是“recycle的tw连接的重传数据,不是新的请求”,于是丢掉不回包,就出现了开始说的syn不响应。
近期评论