kubernetes proxy中 发现长时间运行的tcp连接 如何处理invalid包 如果更优雅的解决需要修改哪个参数?
在 Kubernetes 中,kube-proxy 是一个关键组件,用于管理服务的虚拟 IP 和负载均衡流量。处理长时间运行的 TCP 连接时,如果出现无效(invalid)包,kube-proxy 需要正确处理这些包,以防止连接中断或服务异常。
1. 如何处理无效(invalid)包
- 无效(invalid)包可能出现在长时间运行的 TCP 连接中,这通常是由于连接超时、网络抖动或 NAT 会话过期等原因导致的。
- 在 kube-proxy 中,这些包通常会被标记为 INVALID,并由 Linux 内核的 conntrack 模块管理。默认情况下,这些包可能会被丢弃。
2. 调整 conntrack 超时时间
- 为了更优雅地处理长时间运行的 TCP 连接,避免出现无效包的情况,可以调整 Linux 内核中的 conntrack` 表项的超时时间。
- 主要的超时参数有:
- net.netfilter.nf_conntrack_tcp_timeout_established: 这个参数定义了已经建立的 TCP 连接在没有活动时的超时时间。默认值通常为 5 天(432000 秒)。
- net.netfilter.nf_conntrack_tcp_timeout_close_wait: 定义了 TCP 连接处于 CLOSE_WAIT 状态时的超时时间。
- 调整这些参数可以通过以下命令进行:
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400 # 设为1天
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_close_wait=3600 # 设为1小时
- 这些设置可以减少长时间 TCP 连接出现无效包的概率,从而避免不必要的连接中断。
3. 调整 kube-proxy 的 `conntrack**** 配置
- kube-proxy 可以通过一些参数来更好地管理 conntrack 表的行为:
- –conntrack-tcp-timeout-established`: 设置已经建立的 TCP 连接的超时时间。
- –conntrack-max-per-core: 设置每个 CPU 核心的最大 conntrack 表项数目,默认是 32,000 条。这可以防止 conntrack` 表溢出。
例如,启动 kube-proxy 时,可以设置:
kube-proxy --conntrack-tcp-timeout-established=86400s --conntrack-max-per-core=131072
4. 使用 TCP Keepalive
- 另一种优雅的解决方案是启用 TCP Keepalive 机制,通过在 TCP 连接上定期发送保活探测包来检测并维护连接状态。
- 这可以通过以下系统参数配置:
sysctl -w net.ipv4.tcp_keepalive_time=600 # 10分钟
sysctl -w net.ipv4.tcp_keepalive_intvl=75 # 每75秒发送一个keepalive包
sysctl -w net.ipv4.tcp_keepalive_probes=9 # 尝试9次后放弃
- 启用 Keepalive 可以帮助检测到已失效的连接,并及时释放相应的 conntrack 表项,防止无效包产生。
总结
- 处理无效包: Kubernetes 中的 kube-proxy 会依赖 Linux 内核的 conntrack 模块来管理连接状态。调整 conntrack` 的超时设置是避免长时间 TCP 连接中无效包产生的有效方法。
- 优化连接管理: 通过调整 conntrack 参数和启用 TCP Keepalive,可以更优雅地管理长时间运行的 TCP 连接,从而减少连接中断和无效包的发生。
要实现这些优化,可以通过调整系统级别的 sysctl 参数和 kube-proxy 的配置来实现。