Kubernetes负载均衡与代理咨询:多Worker节点Pod访问疑问
嘿,很高兴你在探索Kubernetes网络逻辑时提出这个问题——这确实是理解K8s服务网格的关键部分!让我一步步拆解背后的代理和负载均衡机制:
首先得明确一个核心前提:NodePort类型的Service会在集群的每一个节点(包括Master,不过通常我们只在Worker节点上使用)的指定端口上开放一个监听入口,不管这个节点上有没有运行对应Service的Pod。这个设计就是为了让外部可以通过任意节点的NodePort访问到服务,背后的核心执行者是每个节点上的kube-proxy组件。
1. kube-proxy:流量转发的核心组件
每个Worker(以及Master)节点上都会运行kube-proxy进程,它会持续监听Kubernetes API Server中Service和Endpoint的变化:
- 当你创建NodePort Service后,
kube-proxy会自动在当前节点上配置iptables(或者IPVS,取决于你的集群配置)规则; - 这些规则会把NodePort端口收到的流量,转发到该Service对应的所有Pod的Endpoint列表中。
2. 跨节点流量的代理路径
当你访问某个Worker节点的NodePort时,哪怕这个节点上没有运行对应Pod,流量也能被正确路由:
- 比如你访问Worker A的NodePort,但Pod都在Worker B上:Worker A的
kube-proxy会通过iptables/IPVS规则,把流量转发到Worker B的Pod所在的网络地址; - 反之,访问Worker B的NodePort,而Pod部分在Worker A时,Worker B的
kube-proxy也会做同样的跨节点转发。
3. 负载均衡的实现方式
流量分发的策略取决于kube-proxy的运行模式:
- iptables模式(默认):基于随机或轮询的方式(具体由iptables规则决定)把流量分发到不同的Pod;
- IPVS模式:支持更多高级负载均衡算法,比如最少连接数、加权轮询、加权最少连接等,适合流量较大的集群场景。
举个更具体的例子:假设你的Service对应两个Pod,分别在Worker1和Worker2。当你访问Worker1的NodePort时,Worker1的kube-proxy会把请求随机转发到Worker1或Worker2上的Pod;当你访问Worker2的NodePort时,Worker2的kube-proxy也会做同样的分发操作——这就是为什么你现在用两个Worker的NodePort都能访问到Pod,而且流量会被合理分配到不同节点的Pod上。
另外,新增Worker节点后Pod被重新分配,是Kubernetes调度器在做集群资源的负载均衡,它会根据节点的CPU、内存等资源使用情况,把Pod调度到更空闲的节点上,保证集群整体资源利用的均衡性。
内容的提问来源于stack exchange,提问作者branko terzic

