kube-proxy
是 Kubernetes 集群中一个重要的组件,负责实现服务的网络代理和负载均衡功能。当创建一个 LoadBalancer
类型的 Service
时,kube-proxy
在整个过程中扮演了关键角色。以下是 kube-proxy
在 LoadBalancer
类型 Service
创建和使用过程中所做的工作:
1. 监听 Service 和 Endpoint 变更
kube-proxy
运行在每个节点上,并持续监听 Kubernetes API 服务器上的 Service
和 Endpoint
对象的变更。
- 当创建一个
LoadBalancer
类型的Service
时,kube-proxy
会收到关于这个新Service
的通知。 - 当
Service
的Endpoint
发生变化(例如,匹配的 Pod 增加或减少)时,kube-proxy
也会收到相应的通知。
2. 更新 iptables 或 IPVS 规则
kube-proxy
使用两种主要的方式来处理网络代理和负载均衡:iptables
和 IPVS
(IP Virtual Server)。默认情况下,kube-proxy
可能使用 iptables
,但可以通过配置切换到 IPVS
。
a. 使用 iptables
kube-proxy
会在每个节点上更新iptables
规则,将流量从Service
的 ClusterIP 和端口转发到匹配的 Pod 的 IP 地址和端口。- 对于
LoadBalancer
类型的Service
,kube-proxy
还会配置iptables
规则,将外部流量从负载均衡器的外部 IP 地址和端口转发到Service
的 ClusterIP 和端口。
b. 使用 IPVS
kube-proxy
会在每个节点上维护一个 IPVS 表,将流量从Service
的 ClusterIP 和端口转发到匹配的 Pod 的 IP 地址和端口。- 对于
LoadBalancer
类型的Service
,kube-proxy
还会配置 IPVS 规则,将外部流量从负载均衡器的外部 IP 地址和端口转发到Service
的 ClusterIP 和端口。
3. 处理外部流量
当外部客户端通过负载均衡器的外部 IP 地址和端口访问服务时,kube-proxy
会根据配置的 iptables
或 IPVS
规则将流量转发到 Service
的 ClusterIP。
a. 内部转发
kube-proxy
会将接收到的流量从Service
的 ClusterIP 转发到匹配的 Pod 的 IP 地址和端口。- 这个过程对于外部客户端是透明的,外部客户端只需要知道负载均衡器的外部 IP 地址和端口即可访问服务。
4. 处理内部流量
当集群内部的 Pod 访问 LoadBalancer
类型的 Service
时,kube-proxy
也会根据配置的 iptables
或 IPVS
规则将流量转发到匹配的 Pod。
5. 更新和删除规则
当 Service
或 Endpoint
发生变化时,kube-proxy
会及时更新或删除相应的 iptables
或 IPVS
规则,以确保流量正确地转发到最新的 Pod。
总结
- 监听变更 :
kube-proxy
持续监听Service
和Endpoint
对象的变更。 - 更新规则 :
kube-proxy
根据变更更新节点上的iptables
或IPVS
规则。 - 处理流量 :
kube-proxy
将外部流量从负载均衡器的外部 IP 地址和端口转发到Service
的 ClusterIP,并进一步转发到匹配的 Pod。 - 内部转发 :
kube-proxy
也将集群内部的流量从Service
的 ClusterIP 转发到匹配的 Pod。 - 更新和删除 :
kube-proxy
及时更新或删除规则,以应对Service
或Endpoint
的变化。
通过这些操作,kube-proxy
确保了 LoadBalancer
类型的 Service
能够正确地处理和转发流量,提供了可靠的网络代理和负载均衡功能。