如何深入理解Kube-Proxy

理解 Kubernetes 的服务网络(Service Network)是理解和用好 Kubernetes 的关键,目前业界讲解 Kubernetes 服务网络的资料不少,包括官方文档和其他网络资料,但是真正讲解底层实现原理的资料却很少,这使得很多人对 Kubernetes 的服务网络只是知其然,却不知其所以然,达不到生产级应用的要求。

  Kube-Proxy是实现服务网络关键底层组件。Service Descovery,包括Service到Pod的转化路由,还有外部流量接入内部的Service,都是通过Kube-Proxy间接实现的。

  接下来将深入剖析Kube-Proxy内部工作原理,这里先从四个基础的概念讲起:

代理(Proxy)服务发现NetfliterIptables

  有了这些基础概念铺垫,接下来重点讲解Kube-Proxy的三种工作模式:

用户空间代理模式Iptables模式IPVS模式

  分析他们的内部实现机制,流程和优劣。

四个基础概念

1.代理(Proxy)

  所谓的代理服务器,通常指的是在服务提供者和客户请求之间引入的一个中间角色。常见的代理有两种:

前向代理(forward proxy)反向代理(reverse proxy)

1.1前向代理

  它是放置在企业网络的边界上,可以让企业内部人员统一、集中的去访问外网。这样不必为每个人员单独设置外网链接,节省资源,还可以集中进行安全审计等功能。

  这里的箭头指向企业外部的,互联网在这里是位于前面,所以叫前向代理。

1.2反向代理

  反向代理指的是企业的外部客户集中访问企业内部的应用和服务。

  我们知道企业内部应用和服务是比较多的,如果每个都对外暴露,一方面有安全问题,另外一方面需要申请很多的公网域名和IP等资源。

  通过引入反向代理,可以屏蔽企业内部服务的复杂性,让外部看到的是一个简单单一的入口。

  反向代理可以把外部访问路由到内部各个具体的应用和服务,这个术语叫反向路由。同时反向代理还可以实现,安全监控,日志记录,限流熔断等功能。

  反向代理还有一种称谓叫网关(gateway)。

  注意这里的箭头的统一指向企业内部,表示这个代理是对向的统一入口,和前向代理刚好相反。

2.服务发现

  Kube-Proxy在K8S中扮演的是反向代理的角色,它主要实现服务发现和负载均衡两大功能。

  一般的反向代理会将流量路由到主机上,但是Kube-Proxy则是将流量路由到Pod上。更具体的讲就是把ClusterIP转化到PodIP。

  它更加接近代理中的主机独立进程代理,因为K8S会在每个Worker节点上都部署一个Kube-Proxy。

  接下来我们进一步深入思考:K8S是如何将服务的ClusterIP转化到具体的PodIP,并且将流量转化到具体的Pod上的?实际上Kube-Proxy是间接通过Linux内核提供的两种技术Netfliter和Iptables来实现IP地址转化和路由的,他俩都是Linux内核底层的细节比较复杂,这里不做太多延生。

3.Netfliter

  Netfliter是Linux内核支持的一种钩子方法(Hook),它允许内核其他模块注册各种回调方法,这些回调方法可以截获网络包,并且可以改变他们的目的地和路由。

4.Iptables

  它是用户空间程序,通过它可以去设置Netfilter的路由规则,该程序可以检查,修改,转发,重定向或者丢弃IP网络包。换句话说,Iptables是Netfilter用户空间的接口。Kube-Proxy通过Iptables可以间接地操作Netfilter里头的路由规则。

  该图简化展示了用户空间当中的Iptables,内核当中的Netfilter以及底层硬件网卡之间的层次关系。用户程序,比如Kube-Proxy可以通过用户空间的Iptables去操作内核当中的Netfilter的路由规则,而Netfilter可以截获底层的IP网络包,并修改他们的路由。