Service(svc)到 Endpoint 的映射

发布于:2025-08-12 ⋅ 阅读:(12) ⋅ 点赞:(0)

在 Kubernetes 中,Service(svc)到 Endpoint 的映射并不是通过传统路由协议(如 OSPF、BGP)实现的,而是通过以下核心机制协同工作:


1. 核心映射机制

(1)kube-proxy 的职责
  • 监听 API Serverkube-proxy 实时监听 Service 和 Endpoint 的变化。

  • 配置负载均衡规则

    • IPVS 模式:通过 ipvsadm 在内核中配置虚拟服务(VIP)到后端 Pod(Real Server)的映射。

    • iptables 模式:通过 iptables 规则链实现 DNAT(目标地址转换)。

(2)Endpoint 的动态更新
  • Endpoint Controller:Kubernetes 的控制器会监控 Pod 状态,动态更新与 Service 关联的 Endpoints 对象。

    kubectl get endpoints <service-name>  # 查看 Service 对应的 Endpoints
  • EndpointSlice(优化版):在大规模集群中替代 Endpoints,提高性能。

(3)数据面实现
  • IPVS 模式

    • 流量直接由 Linux 内核的 IPVS 模块转发,不经过用户态。

    • 示例规则ipvsadm -Ln 输出):

      TCP  10.233.25.255:80 rr
        -> 10.233.1.2:80    Masq    1      0          0
        -> 10.233.1.3:80    Masq    1      0          0
      • 10.233.25.255:80 是 Service 的 ClusterIP 和端口。

      • 10.233.1.2:80 和 10.233.1.3:80 是后端 Pod 的 IP。

  • iptables 模式

    • 通过 iptables 的 KUBE-SERVICES 和 KUBE-SVC-XXX 链实现 DNAT。

    • 示例规则iptables -t nat -L -n):

      KUBE-SVC-XXX  tcp  --  0.0.0.0/0  10.233.25.255  tcp dpt:80 statistic mode random probability 0.5
      KUBE-SEP-YYY  tcp  --  0.0.0.0/0  0.0.0.0/0      tcp to:10.233.1.2:80
      KUBE-SEP-ZZZ  tcp  --  0.0.0.0/0  0.0.0.0/0      tcp to:10.233.1.3:80

2. 与路由协议的区别

特性 Kubernetes Service 映射 传统路由协议(如 BGP/OSPF)
工作层级 传输层(L4)或应用层(L7) 网络层(L3)
依赖组件 kube-proxy、IPVS/iptables 路由器、路由表
动态更新 通过 API Server 实时监听 通过路由协议广播或手动配置
目标 服务发现 + 负载均衡 网络可达性

3. 流量转发流程(以 IPVS 模式为例)

  1. 用户访问 Service

    curl http://10.233.25.255:80
  2. 内核拦截流量

    • 目标 IP(10.233.25.255)绑定在 kube-ipvs0 虚拟接口上。

    • 内核 IPVS 模块匹配到对应的虚拟服务。

  3. 负载均衡决策

    • IPVS 根据调度算法(如 rr)选择一个后端 Pod(如 10.233.1.2:80)。

  4. 转发流量

    • 通过 SNAT/Masquerade 将流量发送到 Pod(源 IP 替换为节点 IP)。


4. 关键验证命令

  • 查看 Service 和 Endpoints

    kubectl get svc,ep -o wide
  • 检查 IPVS 规则

    ipvsadm -Ln
  • 检查实际连接

    conntrack -L | grep 10.233.25.255  # 查看 NAT 连接跟踪

5. 常见问题

Q1: 为什么 Pod 无法访问 Service?
  • 可能原因

    • Endpoints 为空(检查 Pod 的 readinessProbe 和标签)。

    • 网络插件故障(如 Calico 未正确配置路由)。

    • kube-proxy 未正常运行(检查日志 kubectl logs -n kube-system <kube-proxy-pod>)。

Q2: 如何选择 IPVS 还是 iptables?
  • IPVS:适合大规模集群(Service 数量 > 1000),性能更优。

  • iptables:适合小规模集群,兼容性更好。

Q3: 是否依赖路由协议?
  • 不依赖:Service 到 Pod 的映射完全由 kube-proxy 通过 IPVS/iptables 实现。

  • :跨节点 Pod 通信可能需要 CNI 插件(如 Calico/BGP)或 Overlay 网络(如 Flannel VXLAN)。


总结

Kubernetes 通过 kube-proxy + IPVS/iptables + Endpoints 控制器 实现 Service 到 Pod 的映射,不依赖传统路由协议。这种设计将服务发现与负载均衡解耦到应用层,而非网络层,更适合动态微服务环境。


网站公告

今日签到

点亮在社区的每一天
去签到