一.基本概念
- Service:一个稳定的网络端点,暴露一组 Pod 的服务。
- Selector:用于选择 Pod 的标签选择器。
- ClusterIP:一个虚拟 IP 地址,供集群内部访问。
- Endpoints:表示与
Service
关联的 Pod 的 IP 地址和端口。 - EndpointSlice:一种改进的端点表示方式,用于提高性能和可扩展性。
二.工作机制
1.创建service,k8s收到请求,写到etcd
2.service controller监听apiserver发现有service创建出,分配clusterIp给service,告诉apiserver更新至etcd
3.endpoints controller会根据svc的标签选择器找到匹配的pod,写到endpoints或endpointSlice
a)如果使用的是 Endpoints
资源,则所有匹配的 Pod 信息会存储在一个 Endpoints
资源中。
b)如果使用的是 EndpointSlice
资源,则匹配的 Pod 信息会分片存储在多个 EndpointSlice
资源中,以提高性能和可扩展性
4.通过kube-proxy代理,将流量转发到对应的pod,kube-proxy 使用 iptables 或 ipvs 来设置网络规则,这些规则会捕获发往 Service
的流量,并将其转发到对应的 Pod
- iptables 模式:
kube-proxy
使用 iptables 规则直接在内核空间进行流量转发,避免了用户空间的性能瓶颈。 - IPVS 模式:
kube-proxy
使用 Linux 内核的 IPVS(IP Virtual Server)模块进行流量转发,提供更高的性能和扩展性。
三.流量走向
当客户端(可以是集群内部的 Pod 或外部的用户)访问 Service
时,流量的走向如下:
-
客户端发起请求:
- 客户端向
Service
的 ClusterIP 和端口发起请求。
- 客户端向
-
kube-proxy 拦截流量:
- 由于
Service
的 ClusterIP 是一个虚拟 IP 地址,不绑定到实际的网络接口,kube-proxy 在每个节点上设置的 iptables/ipvs 规则会捕获发往 ClusterIP 的流量。
- 由于
-
kube-proxy 选择后端 Pod:
- kube-proxy 根据
Endpoints
资源中的信息,选择一个匹配的 Pod 作为请求的目标。 - 选择算法可以是轮询、随机等,具体取决于 kube-proxy 的配置。
- kube-proxy 根据
-
流量转发到 Pod:
- kube-proxy 将流量转发到选定的 Pod 的 IP 地址和端口。
- 如果目标 Pod 在同一个节点上,流量直接通过本地网络转发。
- 如果目标 Pod 在不同的节点上,流量通过集群网络(由底层网络插件如 Flannel、Calico 等提供)转发。