# 路由概述
在Kubernetes中，服务的访问管理是确保集群内外部流量高效、安全流动的关键。Kubernetes 的Service基于TCP和UDP协议进行流量转发，主要用于集群内部的服务发现和负载均衡，但它缺乏对HTTP/HTTPS的原生支持，无法直接处理复杂的路由规则、基于域名的访问控制、TLS终止等需求。为解决这一问题，Kubernetes集群提供另一种基于HTTP/HTTPS协议的访问方式------Ingress。Ingress是Kubernetes集群中一种独立的资源，通过ingress，用户可以根据域名和路径对转发规则进行自定义，完成对访问流量的细粒度划分。
在Kubernetes中，Ingress资源本身是一个规则的集合，并不会直接处理流量，需要依赖Ingress Controller完成流量的转发，具体概念如下：
- **Ingress资源**：一组基于域名或路径把请求转发到指定Service实例的访问规则，是Kubernetes的一种资源对象，通过接口服务实现增、删、改、查的操作。
- **Ingress Controller**：请求转发的执行器，用以实时监控资源对象Ingress、Service、Endpoint、Secret（主要是TLS证书和Key）、ConfigMap的变化，解析Ingress定义的规则并负责将请求转发到相应的后端Service。
#### Ingress工作流程
Ingress可以将外部的HTTP/HTTPS流量路由到集群内部的Service中，具体工作流程如下：
1. 外部客户端发起HTTP/HTTPS请求。
2. 请求到达Ingress管理的负载均衡器，负载均衡器将请求转发到集群中的Ingress Controller。
3. Ingress Controller接收到请求后，会根据请求的域名和路径匹配Ingress资源中定义的规则。根据匹配的规则，Ingress Controller将请求转发至对应的Service，Service通过标签选择器找到对应的Pod。
4. Service根据负载均衡策略（如轮询）将请求转发到后端的Pod。
5. Pod处理请求并返回响应，响应经过 Service、Ingress Controller以及负载均衡器，最终返回给用户。
图1Ingress工作流程   
![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002176723916.png "点击放大")
#### Ingress Controller类型
Ingress Controller在不同厂商之间的实现方式不同，CCE Autopilot集群支持ELB Ingress Controller和Nginx Ingress Controller，具体对比请参见[表1 Ingress特性对比]。
- **ELB Ingress Controller** ：部署在控制节点（Autopilot集群托管），与集群所在VPC下的弹性负载均衡器（ELB）绑定，能够基于弹性负载均衡服务（ELB）实现流量转发，所有策略配置和转发行为均在ELB侧完成，具体参见[ELB Ingress Controller工作原理]。
- **Nginx Ingress Controller** ：部署在工作节点（Autopilot集群托管），并通过容器端口对外提供访问，外部流量经过Nginx组件转发到集群内其他业务，流量转发行为及转发对象均在集群内部，具体请参见[Nginx Ingress Controller工作原理]。
 
ELB Ingress使用企业级LB进行流量转发，拥有高性能和高稳定性的优点，而Nginx Ingress Controller部署在工作节点（Pod）上，牺牲了一定的集群资源但可配置性相对更好。
 表1Ingress特性对比 
| 特性            | ELB Ingress Controller         | Nginx Ingress Controller                                                                                                                                                                                                                                          |
|:---|:---|:---|
| 运维           | 免运维                           | 自行安装、升级、维护                                                                                                                                                                                                                                                       |
| 性能             | 一个Ingress支持一个ELB实例              | 多个Ingress只支持一个ELB实例                                                                                                                                                                                                                                              |
| 性能             | 使用企业级LB，高性能高可用，升级、故障等场景不影响业务转发 | 性能依赖pod的资源配置                                                                                                                                                                                                                                                        |
| 性能             | 支持配置动态加载                      | - 非后端端点变更需要Reload进程，对长连接有损。  - 端点变更使用Lua实现热更新。  - Lua插件变更需要Reload进程。   |
| 组件部署            | 控制节点（Autopilot集群托管）           | 工作节点（Autopilot集群托管），Nginx组件存在运行成本                                                                                                                                                                                                                                  |
| 路由重定向          | 支持                           | 支持                                                                                                                                                                                                                                                               |
| SSL配置          | 支持                             | 支持                                                                                                                                                                                                                                                                |
| 代理HTTPS协议的后端服务 | 支持                            | 支持，可通过backend-protocol: "HTTPS"注解实现                                                                                                                                                                                                                               |
   
 #### ELB Ingress Controller工作原理
CCE Autopilot集群仅支持使用**独享型ELB** 直接连接Pod。创建集群外部访问的Ingress时，可使用ELB对接ClusterIP服务，直接将Pod作为ELB监听器的后端服务器，外部流量可以通过容器端口直接访问集群中的Pod。ELB Ingress Controller的工作原理请参见[图2 ELB Ingress直通容器原理]，实现步骤如下：
1. 用户创建Ingress资源，在Ingress中配置流量访问规则，包括负载均衡器、访问路径、SSL以及访问的后端Service端口等。
2. Ingress Controller监听到Ingress资源发生变化时，就会根据其中定义的流量访问规则，在ELB侧重新配置监听器以及后端服务器路由。
3. 当用户进行访问时，流量根据ELB中配置的转发策略转发到关联的各个工作负载。
图2ELB Ingress Controller工作原理   
![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002211930197.png "点击放大")
 #### Nginx Ingress Controller工作原理
在CCE Autopilot集群中创建Nginx Ingress时，仅支持**使用独享型弹性负载均衡（ELB）和ClusterIP类型的Service** 。在创建Nginx Ingress前，需确保集群已安装[NGINX Ingress控制器插件](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0034.html)。Nginx Ingress将弹性负载均衡（ELB）作为流量入口，并通过Nginx Ingress控制器实现流量的负载均衡和访问控制。
由于Nginx Ingress Controller部署在工作节点（Autopilot集群托管）上，因此引入了相应的运维成本和Nginx组件运行成本。关于Nginx Ingress Controller的工作原理，请参见[图3 Nginx Ingress Controller工作原理]，具体实现步骤如下：
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
NGINX Ingress控制器插件使用[开源社区](https://github.com/kubernetes/ingress-nginx)的模板与镜像，使用过程中可能存在缺陷，CCE会定期同步社区版本来修复已知漏洞。请评估是否满足您的业务场景要求。
1. 当用户更新Ingress资源后，Ingress Controller就会将其中定义的转发规则写入到Nginx的配置文件（nginx.conf）中。
2. 内置的Nginx组件进行reload，加载更新后的配置文件，完成Nginx转发规则的修改和更新。
3. 在流量访问集群时，首先被已创建的负载均衡实例转发到集群内部的Nginx组件，然后Nginx组件再根据转发规则将其转发至对应的各个工作负载。
图3Nginx Ingress Controller工作原理   
![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002209526801.png "点击放大")
