更新时间:2025-05-20 GMT+08:00

路由概述

在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以及负载均衡器,最终返回给用户。
图1 Ingress工作流程

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)上,牺牲了一定的集群资源但可配置性相对更好。
表1 Ingress特性对比

特性

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中配置的转发策略转发到关联的各个工作负载。
图2 ELB Ingress Controller工作原理

Nginx Ingress Controller工作原理

在CCE Autopilot集群中创建Nginx Ingress时,仅支持使用独享型弹性负载均衡(ELB)和ClusterIP类型的Service。在创建Nginx Ingress前,需确保集群已安装NGINX Ingress控制器插件。Nginx Ingress将弹性负载均衡(ELB)作为流量入口,并通过Nginx Ingress控制器实现流量的负载均衡和访问控制。

由于Nginx Ingress Controller部署在工作节点(Autopilot集群托管)上,因此引入了相应的运维成本和Nginx组件运行成本。关于Nginx Ingress Controller的工作原理,请参见图3 Nginx Ingress Controller工作原理,具体实现步骤如下:

NGINX Ingress控制器插件使用开源社区的模板与镜像,使用过程中可能存在缺陷,CCE会定期同步社区版本来修复已知漏洞。请评估是否满足您的业务场景要求。

  1. 当用户更新Ingress资源后,Ingress Controller就会将其中定义的转发规则写入到Nginx的配置文件(nginx.conf)中。
  2. 内置的Nginx组件进行reload,加载更新后的配置文件,完成Nginx转发规则的修改和更新。
  3. 在流量访问集群时,首先被已创建的负载均衡实例转发到集群内部的Nginx组件,然后Nginx组件再根据转发规则将其转发至对应的各个工作负载。
图3 Nginx Ingress Controller工作原理