kube-proxy
kube-proxy
kube-proxy是什么
Kubernetes 集群中的一个核心网络组件,它运行在集群的每个节点(Node)上,主要负责实现 Kubernetes 的服务(Service) 网络抽象。负责将Service的虚拟IP流量精准转发到后端Pod,是网络通信的关键桥梁。
kube-proxy的作用
服务发现
Service
定义了一个逻辑集合和访问该集合的策略。kube-proxy
监听 Kubernetes API Server,持续跟踪 Service
对象及其关联的 Pod(通过标签选择器 selector
匹配)的变动
当 Service
后端的 Pod 列表发生变化(例如,扩容增加 Pod,或某个 Pod 崩溃被替换)时,kube-proxy
会立即感知到这些变化,并在本节点上更新相应的网络转发规则。这确保了服务发现是动态且实时的。
负载均衡
kube-proxy 在将流量从 Service的虚拟 IP 和端口转发到后端 Pod 的真实 IP 和端口时,会实施负载均衡策略。
kube-proxy
在每个节点上实现了本地的负载均衡,将请求分发到该服务的所有健康 Pod。
当 Service
类型为 NodePort
或 LoadBalancer
时,kube-proxy
确保了从集群外部通过节点 IP 和端口访问服务的流量也能被正确地负载均衡到后端 Pod。
kube-proxy工作原理
kube-proxy
本身不直接处理数据包的转发,而是通过配置节点上的网络规则来实现流量的重定向
iptables模式
它通过监听api sever 中sever和Endpoint的变化。一但发生变更,kube-proxy
就调用 iptables
命令,在节点的 iptables
规则链(主要是 nat
表)中动态地添加、更新或删除规则。当数据包到达 Service 的 ClusterIP:Port 时,iptables
规则会将其目标 IP 和端口修改为某个选中的后端 Pod 的 IP:Port。
ipvs 模式
- 监听API Server:
- kube-proxy通过List-Watch机制监听Kubernetes API Server上的Service和Endpoints资源的变化。
- 当有新的Service或Endpoints被创建、更新或删除时,API Server会通知kube-proxy。
- 获取服务和端点信息:
- kube-proxy接收到通知后,会从API Server获取最新的Service和Endpoints信息。
- Service信息包括虚拟IP(ClusterIP)和端口。
- Endpoints信息包括后端Pod的IP地址和端口。
- 创建虚拟服务器:
- kube-proxy通过Netlink接口调用IPVS模块,创建一个新的虚拟服务器,设置其VIP和端口为Service的ClusterIP和端口。
- 添加真实服务器:
- 对于每个后端Pod,kube-proxy通过Netlink接口将Pod的IP和端口作为真实服务器添加到虚拟服务器中。
- 每个真实服务器还可以设置权重,以支持加权负载均衡。
- 更新哈希表:
- IPVS模块内部使用哈希表来管理连接。当一个新的连接到达虚拟服务器时,IPVS会根据调度算法选择一个真实服务器,并将连接信息存储在哈希表中。
- 哈希表的键通常是五元组(源IP、源端口、目标IP、目标端口、协议),值是对应的真实服务器信息。
- 流量转发:
- 当客户端请求到达虚拟服务器时,IPVS根据哈希表中的信息和调度算法选择一个真实服务器,并将请求转发到该真实服务器。
- 反向流量也会通过同样的机制返回给客户端。
userspace 模式
kube-proxy
自身在用户空间监听 Service 的端口。当有连接到达时,kube-proxy
进程选择一个后端 Pod,然后自己作为代理,将数据在用户空间接收后再转发出去。