在Kubernetes集群中,Ingress对集群服务(Service)中外部可访问的API对象进行管理,提供七层负载均衡能力。本文介绍Ingress基本概念、工作原理和使用说明。
索引
Ingress基本概念
在Kubernetes集群中,Ingress作为集群内服务对外暴露的访问接入点,几乎承载着集群内服务访问的所有流量。Ingress是Kubernetes中的一个资源对象,用来管理集群外部访问集群内部服务的方式。您可以通过Ingress资源来配置不同的转发规则,从而实现根据不同的规则设置访问集群内不同的Service所对应的后端Pod。
Nginx Ingress Controller
当前Kubernetes官方维护的是Nginx Ingress Controller,ACK基于社区版的Nginx Ingress Controller进行了优化。ACK的Nginx Ingress Controller与社区Nginx Ingress Controller完全兼容,支持社区所有的Annotation。您在ACK集群或ACK Serverless集群中选择安装的Nginx Ingress Controller组件,即为定制版的Nginx Ingress Controller组件。关于如何安装Nginx Ingress Controller组件,请参见安装Nginx Ingress Controller组件。
工作原理
为了使Nginx Ingress资源正常工作,集群中必须要有一个Nginx Ingress Controller来解析Nginx Ingress的转发规则。Nginx Ingress Controller收到请求,匹配Nginx Ingress转发规则,将请求转发到后端Service所对应的Pod,由Pod处理请求。Kubernetes中的Service、Nginx Ingress与Nginx Ingress Controller有着以下关系:
Service是后端真实服务的抽象,一个Service可以代表多个相同的后端服务。
Nginx Ingress是反向代理规则,用来规定HTTP/HTTPS请求应该被转发到哪个Service所对应的Pod上。例如根据请求中不同的Host和URL路径,让请求落到不同的Service所对应的Pod上。
Nginx Ingress Controller是Kubernetes集群中的一个组件,负责解析Nginx Ingress的反向代理规则。如果Nginx Ingress有增删改的变动,Nginx Ingress Controller会及时更新自己相应的转发规则,当Nginx Ingress Controller收到请求后就会根据这些规则将请求转发到对应Service的Pod上。
Nginx Ingress Controller通过API Server获取Ingress资源的变化,动态地生成Load Balancer(例如Nginx)所需的配置文件(例如nginx.conf),然后重新加载Load Balancer(例如执行nginx -s reload
重新加载Nginx)来生成新的路由转发规则。
Nginx Ingress Controller可通过配置LoadBalancer类型的Service来创建SLB,因此可以从外部通过SLB访问到Kubernetes集群的内部服务。根据Nginx Ingress配置的不同规则,可以访问不同的服务。
Nginx Ingress相关文档
ALB Ingress Controller
ALB Ingress基于阿里云应用型负载均衡ALB(Application Load Balancer)之上提供更为强大的Ingress流量管理方式,兼容Nginx Ingress,具备处理复杂业务路由和证书自动发现的能力,支持HTTP、HTTPS和QUIC协议,完全满足在云原生应用场景下对超强弹性和大规模七层流量处理能力的需求。
ALB Ingress Controller所属的ALB实例由Controller完全托管为,请勿在ALB控制台上面进行配置,否则可能造成Ingress服务的异常。
工作原理
ALB Ingress Controller通过API Server获取Ingress资源的变化,动态地生成AlbConfig,然后依次创建ALB实例、监听、路由转发规则以及后端服务器组。Kubernetes中Service、Ingress与AlbConfig有着以下关系:
Service是后端真实服务的抽象,一个Service可以代表多个相同的后端服务。
Ingress是反向代理规则,用来规定HTTP/HTTPS请求应该被转发到哪个Service上。例如,根据请求中不同的Host和URL路径,让请求转发到不同的Service上。
AlbConfig是在ALB Ingress Controller提供的CRD资源,使用AlbConfig CRD来配置ALB实例和监听。一个AlbConfig对应一个ALB实例。
ALB Ingress相关文档
MSE Ingress Controller
MSE Ingress是在MSE云原生网关之上提供更为强大的Ingress流量管理方式,兼容Nginx Ingress以及50多个Nginx Ingress的注解,覆盖90%以上的Nginx Ingress业务场景,支持多服务版本同时灰度发布、灵活的服务治理能力以及全方位的安全防护保障,能够满足大规模云原生分布式应用的流量治理诉求。
功能介绍
更多关于MSE Ingress云原生网关的功能介绍,请参见:
工作原理
组成部分
MSE Ingress Controller:
MSE Ingress Controller本身不是网络数据平面,它是管理MSE云原生网关实例以及配置的控制平面。即MSE Ingress Controller不处理任何业务请求流量,它位于流量旁路,管理着处理业务流量的MSE云原生网关实例。
您需要在ACK或者ACK Serverless集群中安装MSE Ingress Controller,通过使用该组件提供的MseIngressConfig的CRD资源以声明式配置的方式来管理云原生网关实例,以及设置网关对Ingress资源的监听选项。
关于如何安装MSE Ingress Controller组件,请参见管理MSE Ingress Controller组件。
MSE云原生网关:由MSE Ingress Controller根据用户配置的MseIngressConfig资源创建,包含控制面(Control Plane)和数据面(Data Plane)。
控制面(Control Plane):控制面监听您已关联的ACK集群中的Ingress、IngressClass、Service等资源,经内部解析后实时下发给网关数据面。
数据面(Data Plane):数据面是流量治理配置的实施者,按照控制面下发的治理规则处理外部请求,并转发到后端目标服务。
工作机制
MSE Ingress Controller负责监听集群中创建的MseIngressConfig资源,实时动态维护该资源对应的云原生网关实例的生命周期以及该网关与ACK集群的关联关系。
MSE云原生网关的控制面通过关联的ACK集群的API Server获取Ingress资源的变化,然后动态更新MSE云原生网关的路由规则。当MSE云原生网关收到请求时,匹配Ingress转发规则将请求转发到后端Service所对应的Pod。
Kubernetes中Service、Ingress、IngressClass、MseIngressConfig和MSE Ingress Controller存在以下关系:
Service:是后端真实服务的抽象,一个Service可以代表多个相同的后端服务。
Ingress:是反向代理规则,用来规定HTTP和HTTPS请求应该被转发到哪个Service上。例如,根据请求中不同的Host和URL路径,使请求转发到不同的Service上。
IngressClass:是Ingress处理器的描述,用于在K8s集群中声明一个Ingress处理器实现,关联该IngressClass的Ingress资源会被该Ingress处理器解析。此外,需要通过IngressClass的Parameter字段关联一个MseIngressConfig(MSE云原生网关),用于实施被解析的Ingress资源描述的流量管理规则。
MseIngressConfig:是由MSE Ingress Controller提供的CRD,用于描述云原生网关实例的基本信息。
MSE Ingress Controller:本身不是网络数据平面,它是管理MSE云原生网关实例以及配置的控制平面。MSE Ingress Controller负责监听集群中的MseIngressConfig资源,协调MSE云原生网关实例用于实施Ingress资源描述的流量管理规则。
下图是MSE Ingress Controller工作示意图。