Nuclio实战及源码分析:基于Kubernetes的Serverless FaaS平台
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.5 路由基础——Ingress

Kubernetes基于传输层通过kube-proxy服务实现了Service的对外发布及负载均衡。在实际的互联网应用场景中,不仅要实现单纯的转发,还有更加细致的策略需求,使用真正的负载均衡器会增加操作的灵活性和转发性能。

基于以上需求,Kubernetes引入了资源对象Ingress,它为Service提供了可直接被集群外部访问的虚拟主机、负载均衡、SSL代理、HTTP路由等应用层转发功能。

Ingress服务由两部分组成。

1)Ingress控制器:将新加入的Ingress转化成Nginx/Traefik的配置文件并使之生效。

2)Ingress服务:将Nginx/Traefik的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的YAML文件即可。

Ingress控制器目前主要有两种:一种是基于Nginx服务的Ingress控制器,另一种是基于Traefik的Ingress控制器。

(1)Nginx Ingress

Nginx Ingress由资源对象Ingress、Ingress控制器、Nginx三部分组成。Ingress控制器用以将Ingress资源实例组装成Nginx配置文件(nginx.conf),并重新加载Nginx使配置生效。当它监听到Service中Pod变化时通过动态变更的方式实现Nginx上游服务器组配置的变更,无须重新加载Nginx进程。Nginx Ingress的工作原理如图1-7所示。

图1-7 Nginx Ingress的工作原理

Ingress控制器通过同步循环机制实时监控API服务等资源对象的变化,当相关Service对应的端点列表有变化时,会通过HTTP POST请求将变化信息发送到Nginx内部运行的Lua程序进行处理,实现对Nginx upstream中后端Pod IP变化的动态修改。

每个后端Pod的IP及targetPort信息都存储在Nginx的共享内存区域,Nginx对每个获取的请求使用配置的负载均衡算法进行转发,Nginx的配置中应用Lua模块的balancer_by_lua功能实现upstream指令域的动态操作,Pod IP变化及资源对象Ingress对upstream指令域相关注解(annotation)的变化无须执行Nginx的reload操作。

当Ingress控制器监控的其他资源对象变化时,会对当前变化的内容创建Nginx配置模型。如果新的配置模型与当前运行的Nginx配置模型不一致,则将新的配置模型按照模板生成新的Nginx配置,并对Nginx执行reload操作。

Nginx配置模型避免了Nginx的无效reload操作。为避免因Nginx配置语法错误导致意外中断,Ingress控制器为Nginx的配置内容提供了冲突检测及合并机制。Ingress控制器使用了准入控制插件(Validating Admission Webhook)做验证Ingress配置语法的准入控制,验证通过的资源对象Ingress才会被保存在存储服务Etcd中,并被Ingress控制器生成确保没有语法错误的Nginx配置文件。

(2)Traefik

Traefik是一个开源的边缘路由器。Traefik自动为服务发现正确的位置,将接收到的请求转发到对应的服务。

Traefik兼容所有主要的集群技术,例如Kubernetes、Docker、Docker Swarm、AWS、Mesos、Marathon等。Traefik还可以在裸机上运行,为遗留软件提供路由服务。Traefik兼容系统环境如图1-8所示。

图1-8 Traefik兼容系统环境

Traefik主要包含以下两部分:

1)边缘路由。

Traefik是一个边缘路由器,这意味着它是平台的大门,将拦截并路由每个传入的请求。Traefik边缘路由器逻辑功能结构如图1-9所示。

图1-9 Traefik边缘路由器逻辑功能结构

Traefik管理所有的逻辑和规则,并确定哪些服务处理哪些请求(基于路径、主机、请求头部信息等)

2)服务自动发现。

传统的边缘路由器(或反向代理)需要一个包含所有可能路由到服务的配置文件,Traefik不需要手动维护而是从服务本身获取这些配置文件。Traefik的服务自动发现如图1-10所示。

图1-10 Traefik的服务自动发现

这意味着当一个服务被部署时,Traefik会立即检测到它并实时更新路由规则。类似地,当服务从基础结构中删除时,相应的路由也会被删除。

下面举例详细说明Traefik是如何工作的。

假设已经在Kuberbetes集群上部署了一堆服务。这时需要一个服务发现系统来管理这些服务(如k8s的Etcd)。如果服务需要外部资源访问,这时还需要配置一个虚拟的域名或者前缀路径来配置一个反向代理。

1)API.DOMAIN.COM:指向私有网络中微服务API的路径。

2)DOMAIN.COM/web:指向私有网络中Web的域名。

3)BACKOFFICE.DOMAIN.com:指向私有网络中的微服务Backoffice,并在多实例间负载均衡。

Traefik的内部结构如图1-11所示。

1)请求在入口点处结束,它们是Traefik的网络入口(监听端口、SSL、流量重定向等)。

2)之后流量会被导向一个匹配的前端。前端是定义入口点到后端之间的路由的地方。路由是通过请求字段(Host、Path、Headers等)来定义的,它可以匹配或否定一个请求。

3)前端将会把请求发送到后端。后端可以由一台或一个通过负载均衡策略配置后的多台服务器组成。

4)服务器转发请求到对应私有网络的微服务当中。

图1-11 Traefik内部结构