kube-proxy 详解:Kubernetes 集群的"网络流量指挥官"

This article is extracted from the chat log with AI. Please identify it with caution.

什么是 kube-proxy?#

kube-proxy 是 Kubernetes 中关键的网络代理组件,它运行在集群的每个节点上,负责实现 Service 的网络模型。简单来说,kube-proxy 是 Kubernetes 服务发现和负载均衡机制的本地代理,它将 Service 的抽象定义转化为实际的网络规则,确保对 Service 的请求能正确路由到后端 Pod。

作为 Kubernetes 网络模型的核心组件之一,kube-proxy 与 CNI(容器网络接口)插件协同工作,共同实现了集群内部的网络通信能力。没有 kube-proxy,Service 就无法工作,Pod 之间的负载均衡也无法实现。

kube-proxy 在 Kubernetes 中的核心角色#

1. Service 的"实现者"#

  • 将 Service API 对象转换为实际网络规则
  • 为 ClusterIP Service 维护虚拟 IP 和端口映射
  • 确保对 Service IP 的访问能正确路由到后端 Pod

2. 负载均衡的"调度员"#

  • 在多个后端 Pod 间分发流量
  • 支持多种负载均衡策略(轮询、最少连接等)
  • 自动剔除不健康的 Pod,保证服务可靠性

3. 网络规则的"维护者"#

  • 动态更新节点上的网络规则(iptables 或 IPVS 规则)
  • 监听 Service 和 Endpoint 变化,实时调整规则
  • 处理连接跟踪和会话保持

kube-proxy 的架构与工作模式#

kube-proxy 支持三种工作模式,每种有其优缺点:

1. userspace 模式(已弃用)#

graph LR
A[客户端] --> B[kube-proxy 监听 Service IP]
B --> C{kube-proxy 选择后端 Pod}
C --> D[转发到 Pod 1]
C --> E[转发到 Pod 2]
C --> F[转发到 Pod 3]
  • 工作原理:kube-proxy 在用户空间监听 Service IP,接收连接后再转发到后端 Pod
  • 优点:实现简单,兼容性好
  • 缺点:性能差,需要在用户空间和内核空间之间多次复制数据
  • 状态:已在 Kubernetes 1.22+ 中完全移除

2. iptables 模式(默认)#

graph LR
A[客户端] --> B[iptables PREROUTING 链]
B --> C[KUBE-SERVICES 链]
C --> D[KUBE-SVC-XXXX 链 负载均衡]
D --> E[KUBE-SEP-XXXX 链 选择 Endpoint]
E --> F[DNAT 到 Pod IP]
  • 工作原理:使用 Linux iptables 规则直接在内核空间处理 Service 流量
  • 优点
    • 性能显著优于 userspace 模式
    • 规则分散,单点故障影响小
    • 无需维护额外连接
  • 缺点
    • 规则复杂,难以调试
    • 随着 Service 和 Pod 数量增加,规则数量呈指数增长
    • 负载均衡为随机选择,无法实现高级策略

3. IPVS 模式(推荐大规模集群)#

graph LR
A[客户端] --> B[IPVS 虚拟服务器]
B --> C[调度算法]
C --> D[Pod 1]
C --> E[Pod 2]
C --> F[Pod 3]
  • 工作原理:使用 Linux IPVS(IP Virtual Server)内核模块实现负载均衡
  • 优点
    • 高性能,专为负载均衡设计
    • 支持多种调度算法(rr, lc, dh, sh 等)
    • 规则管理和查询效率高
    • 支持会话保持和健康检查
  • 缺点
    • 需要特定内核模块支持(Linux kernel ≥4.19 推荐)
    • 配置相对复杂

kube-proxy 的配置与部署#

1. 配置方式#

kube-proxy 通常作为 DaemonSet 部署在每个节点上,配置通过 ConfigMap 提供:

# kube-proxy ConfigMap 示例
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-proxy
  namespace: kube-system
data:
  config.conf: |-
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    mode: "ipvs"  # 工作模式:iptables/ipvs
    clusterCIDR: "10.244.0.0/16"
    ipvs:
      scheduler: "rr"  # 调度算法:轮询
      excludeCIDRs: ["10.96.0.10/32"]
    conntrack:
      maxPerCore: 32768
    metricsBindAddress: "0.0.0.0:10249"

2. 关键配置参数#

参数说明推荐值
mode工作模式ipvs (大规模集群)/iptables (小型集群)
clusterCIDR集群 Pod CIDR与网络插件一致
ipvs.schedulerIPVS 调度算法rr (轮询)
conntrack.max连接跟踪表大小根据节点规模调整
metricsBindAddress指标端点0.0.0.0:10249 (监控需要)
nodePortAddresses限制 NodePort 监听地址[“10.0.0.0/8”]

3. 部署清单示例#

# kube-proxy DaemonSet 示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-proxy
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: kube-proxy
  template:
    metadata:
      labels:
        k8s-app: kube-proxy
    spec:
      hostNetwork: true  # 使用主机网络
      serviceAccountName: kube-proxy
      containers:
      - name: kube-proxy
        image: k8s.gcr.io/kube-proxy:v1.24.0
        command:
        - /usr/local/bin/kube-proxy
        - --config=/var/lib/kube-proxy/config.conf
        - --hostname-override=$(NODE_NAME)
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        volumeMounts:
        - mountPath: /var/lib/kube-proxy
          name: kube-proxy
        - mountPath: /run/xtables.lock
          name: xtables-lock
          readOnly: false
      volumes:
      - name: kube-proxy
        configMap:
          name: kube-proxy
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate

kube-proxy 的工作原理详解#

1. iptables 模式规则链#

当创建一个 Service 时,kube-proxy 会生成以下 iptables 规则链:

PREROUTING --> KUBE-SERVICES
OUTPUT --> KUBE-SERVICES
KUBE-SERVICES --> KUBE-SVC-XXXX (Service 链)
KUBE-SVC-XXXX --> KUBE-SEP-XXXX (Endpoint 链)
KUBE-SEP-XXXX --> DNAT 到具体 Pod IP

示例规则

# Service 链 (KUBE-SVC-XXXX)
-A KUBE-SVC-XXXX -m statistic --mode random --probability 0.33333 -j KUBE-SEP-AAAA
-A KUBE-SVC-XXXX -m statistic --mode random --probability 0.50000 -j KUBE-SEP-BBBB
-A KUBE-SVC-XXXX -j KUBE-SEP-CCCC

# Endpoint 链 (KUBE-SEP-XXXX)
-A KUBE-SEP-AAAA -s 10.244.1.5/32 -m tcp -p tcp -j DNAT --to-destination 10.244.1.5:80

2. IPVS 模式工作流程#

IPVS 模式使用内核的 ip_vs 模块实现负载均衡,创建虚拟服务器和真实服务器:

# 查看 IPVS 规则
ipvsadm -ln

# 输出示例
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr
  -> 192.168.1.100:6443           Masq    1      0          0
TCP  10.96.0.10:53 rr
  -> 10.244.0.5:53                Masq    1      0          0
  -> 10.244.0.6:53                Masq    1      0          0

工作流程

  1. 创建虚拟服务器(Service IP:Port)
  2. 为每个后端 Pod 添加真实服务器
  3. 应用调度算法(如轮询 rr)
  4. 内核直接处理数据包转发,无需用户空间干预

3. 会话亲和性实现#

对于配置了 sessionAffinity: ClientIP 的 Service:

iptables 模式

-A KUBE-SVC-XXXX -m recent --name KUBE-SEP-XXXX --rcheck --seconds 10800 --reap -j KUBE-SEP-XXXX

IPVS 模式

ipvsadm -ln
# 输出
TCP  10.96.0.10:80 sh  # sh 表示源哈希(Source Hashing)
  -> 10.244.1.5:80      Masq    1      0          0
  -> 10.244.2.6:80      Masq    1      0          0

kube-proxy 的高级功能#

1. 外部流量策略#

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local  # 保留客户端源IP
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 80
  • Cluster (默认):流量可能经过多次跳转,丢失源IP
  • Local:仅将流量转发到本节点的Pod,保留源IP,但可能导致负载不均衡

2. 健康检查与故障转移#

kube-proxy 与 kubelet 协同工作,自动移除不健康的 Endpoint:

  • 当 Pod 的 readinessProbe 失败,kubelet 更新 Endpoint 状态
  • kube-proxy 监听 Endpoint 变化,从负载均衡池中移除不健康的 Pod
  • 当 Pod 恢复健康,自动重新加入负载均衡池

3. 指标暴露#

kube-proxy 在 10249 端口暴露 Prometheus 指标:

curl http://localhost:10249/metrics

关键指标包括:

  • kube_proxy_sync_proxy_rules_duration_seconds:规则同步耗时
  • kube_proxy_sync_proxy_rules_last_timestamp:最后同步时间
  • kube_proxy_ipvs_total_servers:IPVS 后端服务器总数

kube-proxy 与其它组件的关系#

1. 与 Service 和 Endpoint#

graph LR
A[API Server] -->|监听| B(kube-proxy)
B -->|监听| C[Service API 对象]
B -->|监听| D[Endpoints API 对象]
C -->|包含| E[ClusterIP/Port]
D -->|包含| F[Pod IP 列表]
B -->|生成规则| G[iptables/IPVS]
G -->|路由流量| H[Pod]

2. 与 CNI 插件#

  • CNI 负责:Pod 网络命名空间配置、IP 分配、路由设置
  • kube-proxy 负责:Service 抽象的实现、负载均衡
  • 协作关系:CNI 配置基础网络,kube-proxy 在此基础上实现 Service

3. 与 DNS 服务#

  • CoreDNS/kube-dns 为 Service 提供 DNS 解析
  • kube-proxy 为解析后的 Service IP 提供负载均衡
  • 两者协同实现完整的"服务发现→负载均衡"流程

kube-proxy 的监控与故障排除#

1. 关键监控指标#

指标说明健康阈值
规则同步延迟iptables/IPVS 规则更新时间< 1 秒
连接跟踪使用率conntrack 表使用比例< 80%
CPU/内存使用kube-proxy 资源消耗< 100m CPU, < 100Mi 内存
同步错误率规则同步失败次数0
丢包率无法路由的包比例0%

2. 常用诊断命令#

# 检查 kube-proxy 状态
kubectl get pods -n kube-system -l k8s-app=kube-proxy

# 检查 kube-proxy 日志
kubectl logs -n kube-system <kube-proxy-pod>

# 检查 iptables 规则 (iptables 模式)
iptables-save | grep <service-ip>

# 检查 IPVS 规则 (IPVS 模式)
ipvsadm -ln

# 检查 kube-proxy 指标
curl http://localhost:10249/metrics

# 测试 Service 连通性
curl <service-ip>:<port>

3. 常见问题与解决方案#

问题现象可能原因诊断命令解决方案
Service 无法访问kube-proxy 未运行kubectl get pods -n kube-system -l k8s-app=kube-proxy重启 kube-proxy,检查配置
连接超时iptables 规则不完整iptables-save | grep <service-ip>检查 kube-proxy 日志,重启服务
负载不均衡会话亲和性配置kubectl describe svc <service-name>调整会话亲和性配置
高延迟conntrack 表满sysctl net.netfilter.nf_conntrack_count增加 conntrack 限制
源IP丢失externalTrafficPolicy=Clusterkubectl get svc -o wide设置 externalTrafficPolicy=Local
规则同步慢大规模集群使用 iptablescurl http://localhost:10249/metrics | grep sync_duration迁移到 IPVS 模式

最佳实践#

  1. 模式选择

    • 小型集群 (<1000 Service):iptables 模式
    • 大型集群 (>1000 Service):IPVS 模式
    • 性能敏感场景:IPVS + direct routing 模式
  2. 性能优化

    ipvs:
      scheduler: "rr"  # 轮询算法通常性能最佳
      syncPeriod: 30s  # 减少同步频率
    conntrack:
      maxPerCore: 65536  # 增加连接跟踪表大小
  3. 资源限制

    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 500m
        memory: 512Mi
  4. 安全加固

    • 限制 kube-proxy 权限(使用最小权限 ServiceAccount)
    • 通过 nodeSelector 将 kube-proxy 限制在系统节点
    • 禁用不必要的端口(如 metrics 端口仅限 localhost)
  5. 高可用架构

    • 确保每个节点都有 kube-proxy 实例
    • 使用 PodDisruptionBudget 防止同时更新多个实例
    • 与节点自动修复机制集成
  6. 升级策略

    • 滚动更新,每次更新少量节点
    • 在低流量时段进行更新
    • 准备回滚计划(保留旧版本镜像)

一个简单类比#

想象 Kubernetes 集群是一座现代化的交通调度中心:

  • kube-proxy 是每个路口的智能交通信号系统
  • 节点(Node) 是城市中的各个路口
  • Service目的地抽象(如"市中心")
  • Pod具体建筑(如"中央广场1号"、“中央广场2号”)
  • 流量来往车辆

路口的智能交通信号系统(kube-proxy)的工作方式:

  1. 接收指令:从交通控制中心(API Server)接收目的地(Service)和可选路线(Endpoints)信息
  2. 设置规则:根据指令设置信号灯(iptables规则)或导航屏(IPVS规则)
  3. 分流车辆:当车辆(请求)到达路口,根据预设规则引导到不同路线(后端Pod)
  4. 实时调整:当某条路堵塞(不健康Pod),自动调整路线
  5. 特殊处理:对VIP车辆(会话亲和性),始终引导到同一路线

当一位司机想去"市中心"(Service):

  • 无需知道具体建筑(Pod)位置和状况
  • 只需跟随路口信号系统(kube-proxy)指引
  • 信号系统自动选择最佳路线(负载均衡)
  • 如果某条路施工(节点故障),自动引导到替代路线

kube-proxy 作为 Kubernetes 网络的核心组件,是实现服务抽象和负载均衡的关键。它将复杂的网络规则转化为简单的 Service 接口,使开发者无需关心底层网络细节。理解 kube-proxy 的工作原理,对于构建高性能、高可靠的 Kubernetes 集群至关重要。在云原生时代,它是连接微服务的"隐形桥梁",默默确保着应用流量的顺畅通行。通过合理配置和监控 kube-proxy,可以显著提升集群的网络性能和可靠性,为业务应用提供坚实的网络基础。

本文共 3535 字,创建于 Dec 31, 2025

相关标签: Kubernetes, ByAI