kubernetes proxy中 发现长时间运行的tcp连接 如何处理invalid包 如果更优雅的解决需要修改哪个参数?

embedded/2025/2/24 9:20:02/

在 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 的配置来实现。


http://www.ppmy.cn/embedded/164799.html

相关文章

Vue框架中Ajax请求的实现方式:使用axios库或fetch API

在Vue框架中,Ajax请求是前后端交互的重要手段,用于异步获取数据。Vue本身不包括Ajax功能,但可以通过引入外部库来实现。常用的有 axios库和原生的 fetch API。下面将详细介绍这两种实现方式,以及它们的使用示例。 使用Axios库 A…

day56 第十一章:图论part06

108.冗余连接 注意init初始化 改进&#xff1a; 其实只有一条边冗余&#xff0c;改为&#xff0c;如果两条边在同一个集合里&#xff0c;就输出&#xff0c;不然加入。 #include <iostream> #include <vector> using namespace std;int n 1005; vector<int>…

DeepSeek写俄罗斯方块手机小游戏

DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件&#xff1a; 核心功能要求 原生JavaScript实现&#xff0c;适配手机屏幕 …

在windows下安装windows+Ubuntu16.04双系统(下)

这篇文章的内容主要来源于这篇文章&#xff0c;为正式安装windowsUbuntu16.04双系统部分。在正式安装前&#xff0c;若还没有进行前期准备工作&#xff08;1.分区2.制作启动u盘&#xff09;&#xff0c;见《在windows下安装windowsUbuntu16.04双系统(上)》 二、正式安装Ubuntu …

C++ 模板初阶

目录 一、前言 二、正文 1、函数模板 1.1函数模板概念 1.2函数模板格式 1.3函数模板的原理 1.4函数模板的实例化 1.5模板参数的匹配原则 2.类模板 2.1类模板的定义格式 2.2类模板函数化 3.template与typedef的区别 三、结言 一、前言 据说C创建初期&#xff0c;…

go 查看版本

个人学习笔记 1. 打开终端&#xff08;或命令提示符&#xff09; 在 Windows 上&#xff0c;使用 cmd 或 PowerShell。在 macOS 或 Linux 上&#xff0c;使用终端应用程序。 2. 运行以下命令 go version 3. 查看输出 命令执行后&#xff0c;终端会显示已安装的 Go 版本&…

Python pip 缓存清理:全面方法与操作指南

在使用 Python 的 pip 进行包安装时&#xff0c;pip 会将下载的包缓存起来&#xff0c;以加快后续相同包的安装速度。不过&#xff0c;随着时间推移&#xff0c;缓存会占用大量磁盘空间&#xff0c;这时你可以对其进行清理。下面为你介绍不同操作系统下清理 pip 缓存的方法。 …

AI发展迅速,是否还有学习前端的必要性?

今天有个小伙伴跟我讨论&#xff1a;“现在 AI 发展迅速&#xff0c;是否还有学习 JS 或者 TS 及前端知识的必要&#xff1f;” 我非常肯定地说&#xff1a; 是的&#xff0c;学习 JavaScript/TypeScript 以及前端知识仍然非常必要&#xff0c;而且在可预见的未来&#xff0c;…