现象:


通过自建k8s访问某个服务比如hbase,进行压测时发现刚开始正常,在一段时间后会出现几秒的断连,之后又会恢复。

排查过程:


1.首先查看哪段时间k8s的pod资源有没有打满,有没有出现pod重启的情况。---发现没有,排除pod资源满的情况

2.去本地ecs去访问这个服务,发现正常。---排除某个服务的问题

3.这里就基本定位是k8s了,进入pod定位

ss -tan | grep 'TIME-WAIT' | wc -l 


发现连接数确实打满,打到2w7,并且没有释放

解决方案:

sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=30
核心关键是下面这一条
net.ipv4.tcp_max_tw_buckets = 5000

ecs可以通过这个看:
cat /proc/sys/net/ipv4/tcp_max_tw_buckets

加入到k8s的配置:
apiVersion: v1
kind: Pod
metadata:
  name: tcp-recycle-demo
spec:
  containers:
  - name: demo-container
    image: your-image
  securityContext:
    sysctls:
    - name: net.ipv4.tcp_fin_timeout
      value: "30"  # TIME_WAIT 超时回收时间
    - name: net.ipv4.tcp_max_tw_buckets
      value: "5000"  # 最大 TIME_WAIT 连接数

    - name: net.ipv4.tcp_tw_reuse
      value: "1"  # 允许 TIME_WAIT 端口复用(加速回收)

更多推荐