Kubernetes 负载均衡现象解析:为何同一批次请求集中于单个 Pod

背景

《在 Windows 上使用 Kind 创建本地 Kubernetes 集群并集成Traefik 进行负载均衡》在这篇文章中,通过这个命令验证负载均衡。

bash 复制代码
 1..10 | ForEach-Object {
   curl.exe http://hello.local
}

实际的情况是:

比如,我第一次执行这个命令,所有的请求全部打到pod1中,过一会再执行这个命令,所有的请求全部打到pod2中,再过一会儿执行这个命令,所有的请求全部打到pod3中。

和预期并不相符合:

为什么for循环中10次请求,没有分别打到不同的pod中呢? 这个traefik的负载均衡,是实现把流量转发到不同的pod中么?如果是转发到不同的pod中,是如何实现的呢?

同一批次请求集中到一个 Pod,间隔后切换的核心原因是 Kubernetes Service 的会话亲和性(Session Affinity)与连接复用 共同作用的结果。

当前负载均衡的实际链路

从配置来看,流量路径是:
客户端(curl)→ Traefik → Kubernetes Service(NodePort)→ Pod

其中,实际的 Pod 负载均衡是由 Kubernetes Service 完成的 ,而非 Traefik。因为你的 Traefik 配置中,hello-service只指向了一个后端(Kubernetes Service 的 NodePort:http://172.18.0.2:32599),Traefik 自身并没有感知到多个 Pod 的存在,只是单纯将所有请求转发给这个 NodePort。

为什么同一批次请求会集中到一个 Pod?

Kubernetes Service 默认的负载均衡策略是 轮询(Round Robin) ,但存在一个关键特性:对同一客户端连接的请求会 "粘住" 同一个 Pod(默认启用短时间的会话亲和性)。

具体来说:

  1. curl命令在默认情况下会启用 HTTP/1.1 的长连接(Keep-Alive),10 次循环请求会复用同一个 TCP 连接。
  2. Kubernetes Service 检测到这是同一个连接,会将该连接上的所有请求转发到同一个 Pod(这是为了避免分布式场景下的会话状态丢失,是默认优化)。
  3. 当连接断开(间隔一段时间后),新的连接会触发 Service 重新轮询到下一个 Pod,因此你会看到 "间隔后切换 Pod" 的现象。
相关推荐
打工仔折腾 AI9 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
yyuuuzz9 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节
‎ദ്ദിᵔ.˛.ᵔ₎9 小时前
关于Linux 线程局部存储的认识
linux·运维
GlobalInfo9 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
隔窗听雨眠11 小时前
KingbaseES平替全链路实践:从迁移评估到可持续运维
运维
skywalk816311 小时前
登到192.168.1.5那台机器,看看今天白天,大约从早晨到晚上,都卡住了。看看因为什么卡住,为什么卡住而没有杀死那个导致卡死的进程,为什么
运维·系统·freebsd
运维行者_11 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
孔令飞13 小时前
知己知彼,百战不殆:AI SKILL 实现原理剖析
云原生·go·ai编程
晚风吹北巷13 小时前
Linux复习篇(自用)
linux·运维·服务器·1024程序员节
风哥2号13 小时前
数据库教程FGMT69:PostgreSQL运维诊断与监控分析
运维·数据库·postgresql