tcp_tw_recycle 参数导致的K8S网络问题
问题现象
客户端访问对端服务器端口,时通时不通。
多数服务出现连接nacos 500问题
排查记录
检查服务到nacos的连接是否正常
- 通过进入到容器当中,去ping
external-nacos.default.svc.cluster.local
可ping通
- 通过进入到容器当中,去ping
排查 nacos 状态,检查nacos是否正常
- 所有的中间件连接信息,均是通过nacos配置中心来获取配置
- kubectl get ep external-nacos.default.svc.cluster.local
- 逐一访问 endpoint 均正常
客户端telnet数据库端口,发现时通时不通
检查k8s 集群 cni mtu 发现,值为1430,初步怀疑是服务与应用交互的数据包过大,导致的超时,尝试修改cni插件的MTU值为1480。一般比物理网卡小20即可
2. kubectl -n kube-system edit ds calico-node
重启服务,发现故障依旧
结合以往故障记录,由于k8s的pod均是使用的nat模式访问目标机器,怀疑目标机器未开启路由转发,登录到目标机器,查看确实未开启,追加后,重启服务器,故障依旧
登录到目标主机抓包,抓包分析发现收到包之后三次握手不成功,只有客户端发送过来的SYN包,并没有服务端返回的SYN+ACK包,所以无法建立连接。
$ tcpdump -i ens192 host 192.168.10.121 and port 22 -w a.cap`
$ tcpdump -i ens192 host 192.168.10.122 and port 22 -w b.cap`
$ tcpdump -i ens192 host 192.168.10.123 and port 22 -w c.cap`
8. 返回查看内核参数,发现有net.ipv4.tcp_tw_recycle
参数,以前看别人遇到过类似问题https://www.jianshu.com/p/3b8f674f577e
,该参数在4.12版本内核之后被废除,发现目标节点为3.10版本内核,尝试关闭此参数,重启服务,故障恢复
故障定位
因为2.6内核以上中tcp_timestamps默认是打开的,所以当打开 tcp_tw_recycle时会导致部分通过NAT上网client无法正确连接服务器,故障表现为client发出SYN后无法收到server返回 的SYN+ACK,推荐的解决方法是关闭tcp_tw_recycle,打开tcp_tw_reuse解决TIME-WAIT过多的问题。
tcp_tw_recycle 设置为 1 会开启系统对 TIME_WAIT 状态的 socket 的快速回收。开启这个功能,系统就会存下 TCP 连接的时间戳,当同一个 IP 地址过来的包的时间戳小于缓存的时间戳,系统就直接丢包,“回收”这个 socket。这个选项同样需要开启 tcp_timestamp 才生效。
开启这个功能是有很大风险的,服务器端会根据同一个 IP 发送过来的包的时间戳来判断是否丢包,而时间戳是根据发包的客户端的系统时间得来的,如果服务端收到的包是同一出口 IP 而系统时间不一样的两个客户端的包,就有可能会丢包,可能出现的情况就是一个局域网内有的客户端能连接服务端,有的不能。具体原因是客户端处于NAT模式下,出口ip可能是同一个ip,不同客户端的发送的时间戳可能乱序,服务器会检查相同ip地址发送来过的包的时间戳是不是小于缓存的时间戳,如果不是,直接丢掉。
问题解决
# 临时解决
$ echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle# 永久解决
$ vim /etc/sysctl.conf
net.ipv4.tcp_tw_recycle = 0$ sysctl -p
参考链接:
https://www.cnblogs.com/cyleon/p/16176888.html
https://www.jianshu.com/p/3b8f674f577e
tcp_tw_recycle 参数导致的K8S网络问题相关推荐
- cni k8s 插件安装_第一次,如此清晰脱俗的直解K8S网络
图片出自:<你女儿也能看懂的插画版 Kubernetes 指南> K8S 网络设计原则 K8S 网络设计原则如下: 每个 Pod 都拥有一个独立 IP 地址,Pod 内所有容器共享该 IP ...
- 第四课 k8s网络基础学习-DNS和DHCP学习
第四课 k8s网络基础学习-DNS和DHCP学习 tags: k8s网络 DNS DHCP 文章目录 第四课 k8s网络基础学习-DNS和DHCP学习 第一节 DNS介绍 第二节 DNS的linux使 ...
- 网络优化之net.ipv4.tcp_tw_recycle参数
本文为翻译英文BLOG<Coping with the TCP TIME-WAIT state on busy Linux servers>,(http://vincent.bernat. ...
- linux内net.ipv4.tcp_tw_recycle参数一定不要启用
linux内net.ipv4.tcp_tw_recycle参数一定不要启用 net.ipv4.tcp_tw_recycle = 0 本文为转载译者achejq博客的原文,目的是为了加深自己知识点的记忆 ...
- 不要在linux上启用net.ipv4.tcp_tw_recycle参数
本文为翻译英文BLOG<Coping with the TCP TIME-WAIT state on busy Linux servers>,但并非完整的翻译,译者CFC4N对原文理解后, ...
- 第八课 k8s网络基础学习-VxLAN基础
第八课 k8s网络基础学习-VxLAN基础 tags: k8s网络 eNSP wireshark VxLAN 文章目录 第八课 k8s网络基础学习-VxLAN基础 第一节 VxLAN 1.1 VxLA ...
- 非全研究生计算机网络-k8s网络插件(CNI)性能分析
由于计算机网络课程需要,看了一些k8s网络机制,随翻译了一篇论文,说实话有点空洞. 作者: Youngki Park School of Electronic Engineering Soongsil ...
- k8s网络基础学习-Calico网络插件
第十课 k8s网络基础学习-Calico网络插件 tags: k8s网络 calico proxy arp bgp full mesh bgp RR 文章目录 第十课 k8s网络基础学习-Calico ...
- K8s网络插件Flannel,Calico
文章目录 一.K8s网络插件flannel与calico 1. k8s网络解决方案 容器虚拟化网络方案 基于隧道 基于路由 2. CNI(容器网络接口) flannel与calico 选型比较 3. ...
最新文章
- 【FFmpeg】ffmpeg工具源码分析(二):转码核心函数 transcode
- 前端计划——面试题总结-CSS篇
- Python网络爬虫与信息提取(二)(BeautifulSoup库)
- LightTools 切趾角度设置
- 【Linux导论】通过图形接口配置系统(System Configuration from the Graphical Interface)
- 【Breadth-first Search 】785. Is Graph Bipartite?
- 推荐算法--推荐系统架构(06)
- HTML代码 笔记 部分
- 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件
- nginx linux脚本,控制 nginx shell脚本语言
- 超像素经典算法SLIC的代码的深度优化和分析
- 仿百度统计html模板,YJHL仿百度统计 | CNZZ统计友盟源码
- mysql cpu使用率_MySQL CPU使用率高情况的原因和解决
- HBase流程框架图
- 为什么响应式(自适应)网站是一个坑
- 【Unity3D】游戏研发团队及岗位职责
- MybatisPlus学习〖四〗报错篇 WARNWarn: Could not find @TableId in Class: com.fehead.OceanCode.dataobject
- 怎么找电脑服务器文档,电脑服务器地址怎么找
- 第二章 定义和构建索引(二)
- VTK 3D图像显示
热门文章
- Socket.io部署遇到的坑
- LeetCode——51. N 皇后
- Python 内置函数与匿名函数
- Android 实用自定义Dialog页面加载动画
- tcpdump丢包问题分析
- warning #225-D: function “InitXintf“ declared implicitly
- Web开发路线图(2020)
- 南通五年制计算机大专学校,2020年南通五年制大专录取分数线有哪些
- 聊聊「租房平台,虚假房源」
- MindSpore单卡GPU训练竟然报NCCL的错