Kube-Proxy 浅析

监控集群中用户发布的服务,并完成负载均衡配置。
在建立好应用,服务要发布出去,那么proxy就要监控service对象完成负载均衡。
每个节点的Kube-Proxy都会 配置相同的负载均衡策略,使得整个集群的服务发现建立在分布
式负载均衡器之上, 服务调用无需经过额外的网络跳转(Network Hop)。
负载均衡配置基于不同插件实现:
       • userspace。
       • 操作系统网络协议栈不同的 Hooks 点和插件:
              • iptables 
              • ipvs

kube-proxy


kube-proxy 也是在每个节点上都运行的。它是实现Kubernetes Service 机制的重要组件。毫无意外,kube-proxy 也是一个控制器它也从API Server 监听Service 和Endpoint对象的变化,并根据Endpoint 对象的信息设置Service 到后端Pod 的路由,维护网络规则,执行TCP、UDP 和SCTP 流转发。

如图1-16 所示,标签app=example Pod 都是此Service的后端Pod,他们的Pod IP 将会被Endpoint 控制器实时更新到Endpoint 对象中。此Serivce被分配的ClusterIP 为192.168.232.109nodePort 30004Pod 8080 端口映射到Service80 端口。

也就是说,在集群内部通过192.168.232.109:80 就能访问此Service 的后端Pod 8080 端口提供的服务;集群外的主机可以通过nodeIP:30004 来访问此Service

 

                                                    1-16 Service Pod 的关系

kube-proxy 有两种模式都可以实现流量转发,分别是 iptables 模式和 IPVS (IP Virtual Server)模式(可以通过参数 --proxy-mode 来指定)。
默认是 iptables 模式,该模式是通过每个节点上的iptables 规则来实现的。我们可以通过 iptables 命令查看相关的 iptables rules
  1. 从上面iptables rules 的代码片段来看,在集群内,用ClusterIP: 192.168.232.109(规则 ②)或 nodePort 30004(规则①)访问 Service 时,会被跳转到 Chain KUBE-SVC- BBVI5 ZF6XS3KVW42。
  2. 对于Chain KUBE-SVC-BBVI5ZF6XS3KVW42,它有三条可以跳转的路径(规则③④⑤)。当我们查询到规则③时,它将有33.33%的概率命中,并跳转到KUBE-SEP-RXBFMC7CATPNMAHP。如果规则③未命中,则接下来我们考虑规则④,它将有50%的概率进入Chain KUBE-SEP-CCTNN4A277RJLBDD。如果此条仍没有命中,就会进入 Chain KUBE-SEP-HJGBTFNTDVVP5Q3I。因此分别进入这三个Chain 的概率是一样的,kube-proxy 也是利用iptables 的这一特性实现流量的负载均衡。
随着 Service 数量的增大, iptables 模式由于线性查找匹配、全量更新等特点,其性能会显著下降。从Kubernetes 1.8 版本开始, kube-proxy 引入了 IPVS 模式, IPVS iptables同样基于 netfilter ,但是采用的是哈希表而且运行在内核态,当 Service 数量达到一定规模时,哈希表的查询速度优势就会显现出来,从而提高Service 的服务性能。我们可以通过 ipvsadm 命令查看 IPVS 模式下的转发规则:

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/124032927