网站首页 文章专栏 K8S核心组件之kube-proxy
K8S核心组件之kube-proxy
编辑时间:2020-09-05 16:17:34 作者:linxi 浏览量:3782

在k8s中,提供相同服务的一组pod可抽象成一个service,通过service提供的统一入口对外提供服务,每个service都有一个虚拟IP地址(VIP)和端口号供客户端访问。kube-proxy存在于各个node节点上,主要用于Service功能的实现,具体来说,就是实现集群内的pod访问service,或者是集群外的主机通过NodePort等方式访问service。在当前版本的k8s中,kube-proxy默认使用的是iptables模式,通过各个node节点上的iptables规则来实现service的负载均衡,但是随着service数量的增大,iptables模式由于线性查找匹配、全量更新等特点,其性能会显著下降。从k8s的1.8版本开始,kube-proxy引入了IPVS模式,IPVS模式与iptables同样基于Netfilter,但是采用的hash表,因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能。


kube-proxy负责为Service提供cluster内部的服务发现负载均衡,它运行在每个Node计算节点上,负责Pod网络代理, 它会定时从etcd服务获取到service信息来做相应的策略,维护网络规则和四层负载均衡工作。在K8s集群中微服务的负载均衡是由Kube-proxy实现的,它是K8s集群内部的负载均衡器,也是一个分布式代理服务器,在K8s的每个节点上都有一个,这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。


service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。service会为这个LB提供一个IP,一般称为cluster IP。kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问

访问服务的方式:内部cluster IP、外部Node Port方式(kubectl port-forward podname 80:80 || 设置node port参数)

缩略图

部署好服务后,集群内cluster IP + Port访问

缩略图

部署好服务后,集群pod内部域名访问

简单来说: 
->  kube-proxy其实就是管理service的访问入口,包括集群内Pod到Service的访问和集群外访问service。
->  kube-proxy管理sevice的Endpoints,该service对外暴露一个Virtual IP,也成为Cluster IP,集群内通过访问这个Cluster IP:Port就能访问到集群内对应的serivce下的Pod
->  service是通过Selector选择的一组Pods的服务抽象,其实就是一个微服务,提供了服务的LB和反向代理的能力,而kube-proxy的主要作用就是负责service的实现。
->  service另外一个重要作用是,一个服务后端的Pods可能会随着生存灭亡而发生IP的改变,service的出现给服务提供了一个固定的IP,而无视后端Endpoint的变化。


举个例子,比如现在有podA,podB,podC和serviceAB。serviceAB是podA,podB的服务抽象(service)。那么kube-proxy的作用就是可以将pod(不管是podA,podB或者podC)向serviceAB的请求,进行转发到service所代表的一个具体pod(podA或者podB)上。请求的分配方法一般分配是采用轮询方法进行分配。另外,kubernetes还提供了一种在node节点上暴露一个端口,从而提供从外部访问service的方式。比如这里使用这样的一个manifest来创建service。

缩略图


再用一个rc资源创建pod

缩略图

上面配置的含义是在node上暴露出36200端口。当访问node上的36200端口时,其请求会转发到service对应的cluster IP的8000端口,并进一步转发到pod的80端口。

缩略图

nginx-service-nodeport服务选择标签为name=myapp的pods

缩略图

外部访问成功

Service, Endpoints与Pod的关系

缩略图

Kube-proxy进程获取每个Service的Endpoints,实现Service的负载均衡功能


Service的负载均衡转发规则

缩略图

访问Service的请求,不论是Cluster IP+TargetPort的方式;还是用Node节点IP+NodePort的方式,都被Node节点的Iptables规则重定向到Kube-proxy监听Service服务代理端口。kube-proxy接收到Service的访问请求后,根据负载策略,转发到后端的Pod

来说两句吧
最新评论