用过K8S的朋友都知道,目前让K8S对外提供服务的方式无外乎通过ClusterIP、Nodeport、Load Balancer和Ingress这几种方法,通常在本地部署K8S的场景下,经常会使用Nodeport的方式对外提供服务,毕竟本地的部署K8S群集的想要做LoadBalancer是十分困难的,但话说回来,即使在本地有了Load Balancer,但LoadBalancer能提供的Port其实就那么几个,远远不能满足群集内大量应用程序对外发布的需求,所以在很多场景下,我们都希望以域名的形式来对外提供服务,为不同的业务系统创建不同的域名,不同的域名对应群集内不同的Service,在或者可以通过URL路径进行流量分发,从而实现IP和端口的复用,而这恰巧就是Ingress所提供的功能。
其实不论在云端还是在本地,我们都可以通过多种方式来实现Ingress,比如在本地我们可以使用Nginx、Traefik等方式,在云端我们可以使用Nginx,AGIC等方式,都可以实现上述的功能。 因为我本人用AKS的场景比较多,所以今天我们主要围绕在Azure中如何对AKS实现Ingress的方式展开讨论。
我们说在Azure中我们可以通过NGINX和AGIC(Application Gateway)的方式来实现AKS群集的ingress控制器,两种方式各有好处,接下来我们逐一来讨论。
NGINX Ingress
Nginx是一种广泛使用的Ingress控制器,同时也是K8S中所推荐的Ingress控制器。在K8S中,有两个基于Nginx的开源Ingress控制器,一个由Kubernetes社区维护,另一个由NGINX , INC维护。我们今天要和大家聊的是由Kubernetes社区维护的Nginx Ingress
Nginx Ingress顾名思义,是基于Nginx平台所构建的。作为现在是世界上最流行的HTTP Server,相信大家对Nginx都比较熟悉,这是一个优点。它还有一个优点是 Nginx Ingress 接入 Kubernetes 集群所需的配置非常少,而且有很多文档来指引用户如何使用它。这对于大部分刚接触 Kubernetes 的人或者创业公司来说,Nginx Ingress 的确是一个非常好的选择。
AGIC(Application Gateway Ingress Controller)
和Nginx Ingress类似,AGIC也是AKS中的Ingress控制器的一种。其实AGIC就是一个放在AKS里面的Azure Application Gateway的监控程序,他们可以监控AKS的Ingress Yaml文件,并且根据用的在Ingress Yaml中的定义,自动的去修改Application Gateway上的配置。对比Nginx Ingress大家会发现,Nginx Ingress其实是在K8S群集内部运作,在K8S内部去处理流量,而到了AGIC,虽然监控程序部署在群集里面,但真实流量的流向和处理其实是在群集外部的Application Gateway,因为Application Gateway就是一个位于AKS群集外部的Azure 服务,所以相比于Nginx Ingress而言,使用AGIC不会消耗Node的计算和内存资源,而且因为Application Gateway是云端的服务,所以我们可以根据流量的情况对其进行灵活的缩放。除此之外,Application Gateway也提供了内置的WAF机制,接触于此,我们可以通过WAF对入栈流量进行安全过滤,增强应用的安全性。
AGIC 通过 Kubernetes Ingress 资源以及服务和部署/Pod 进行配置。 它提供许多功能,利用 Azure 的本机应用程序网关 L7 负载均衡器。 例如:
- URL 路由
- 基于 Cookie 的相关性
- TLS 终止
- 端到端 TLS
- 支持公共、专用和混合网站
- 集成式 Web 应用程序防火墙
有了AGIC就不需要在 AKS 群集前面设置另一个负载均衡器/公共 IP,避免在请求到达 AKS 群集之前在数据路径中设置多个跃点。 应用程序网关直接使用其专用 IP 与 Pod 通信,不需要 NodePort 或 KubeProxy 服务。 这也会改进部署性能。