在 Kubernetes 中,Service(svc)到 Endpoint 的映射并不是通过传统路由协议(如 OSPF、BGP)实现的,而是通过以下核心机制协同工作:
1. 核心映射机制
(1)kube-proxy 的职责
监听 API Server:
kube-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 模式为例)
用户访问 Service:
curl http://10.233.25.255:80
内核拦截流量:
目标 IP(
10.233.25.255
)绑定在kube-ipvs0
虚拟接口上。内核 IPVS 模块匹配到对应的虚拟服务。
负载均衡决策:
IPVS 根据调度算法(如
rr
)选择一个后端 Pod(如10.233.1.2:80
)。
转发流量:
通过 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 的映射,不依赖传统路由协议。这种设计将服务发现与负载均衡解耦到应用层,而非网络层,更适合动态微服务环境。