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

路由概述

为什么需要Ingress

Service基于TCP和UDP协议进行访问转发,为集群提供了四层负载均衡的能力。但是在实际场景中,Service无法满足应用层中存在着大量的HTTP/HTTPS访问需求。因此,Kubernetes集群提供了另一种基于HTTP协议的访问方式——Ingress。

Ingress是Kubernetes集群中一种独立的资源,制定了集群外部访问流量的转发规则。如图1所示,用户可根据域名和路径对转发规则进行自定义,完成对访问流量的细粒度划分。

图1 Ingress示意图

Ingress简介

在Kubernetes中,Ingress资源本身是一个抽象的概念,实际的流量处理是由Ingress Controller来完成的。

  • Ingress资源:一组基于域名或路径把请求转发到指定Service实例的访问规则,是Kubernetes的一种资源对象,通过接口服务实现增、删、改、查的操作。
  • Ingress Controller:请求转发的执行器,用以实时监控资源对象Ingress、Service、Endpoint、Secret(主要是TLS证书和Key)、Node、ConfigMap的变化,解析Ingress定义的规则并负责将请求转发到相应的后端Service。
    Ingress Controller在不同厂商之间的实现方式不同,CCE支持ELB型和Nginx型两种Ingress Controller类型:
    • ELB Ingress Controller部署在控制节点,基于弹性负载均衡服务(ELB)实现流量转发,所有策略配置和转发行为均在ELB侧完成。
    • Nginx Ingress Controller使用Kubernetes社区维护的模板与镜像部署在集群内部,并通过NodePort对外提供访问,外部流量经过Nginx组件转发到集群内其他业务,流量转发行为及转发对象均在集群内部。

Ingress特性对比

表1 Ingress特性对比

特性

ELB Ingress Controller

Nginx Ingress Controller

运维

免运维

自行安装、升级、维护

性能

一个Ingress支持一个ELB实例

多个Ingress只支持一个ELB实例

使用企业级LB,高性能高可用,升级、故障等场景不影响业务转发

性能依赖pod的资源配置

支持配置动态加载

  • 非后端端点变更需要Reload进程,对长连接有损。
  • 端点变更使用Lua实现热更新。
  • Lua插件变更需要Reload进程。

组件部署

控制节点,不占用工作节点

Worker节点,需要Nginx组件运行成本

路由重定向

支持

支持

SSL配置

支持

支持

代理HTTPS协议的后端服务

支持

支持,可通过backend-protocol: "HTTPS"注解实现

由于ELB Ingress和社区开源的Nginx Ingress在原理上存在本质区别,因此支持的Service类型不同,详情请参见ELB Ingress支持的Service类型

ELB Ingress Controller部署在控制节点,所有策略配置和转发行为均在ELB侧完成。非ELB直通Pod场景下,集群外部的ELB只能通过VPC的IP对接集群内部节点,因此ELB Ingress只支持NodePort类型的Service。但是ELB直通Pod场景(CCE Turbo集群 + 独享型ELB实例)下,ELB可直接将流量转发到集群内Pod,此时Ingress仅支持对接ClusterIP类型的Service。

Nginx Ingress Controller运行在集群中,作为服务通过NodePort对外暴露,流量经过Nginx Ingress转发到集群内其他业务,流量转发行为及转发对象均在集群内部,因此支持ClusterIP和NodePort类型的Service。

综上,ELB Ingress使用企业级LB进行流量转发,拥有高性能和高稳定性的优点,而Nginx Ingress Controller部署在集群节点上,牺牲了一定的集群资源但可配置性相对更好。

ELB Ingress Controller工作原理

CCE自研的ELB Ingress Controller基于弹性负载均衡服务ELB实现公网和内网(同一VPC内)的七层网络访问,通过不同的路径将访问流量分发到对应的服务。

ELB Ingress Controller部署于控制节点上,与集群所在VPC下的弹性负载均衡器绑定,支持在同一个ELB实例(同一IP)下进行不同域名、端口和转发策略的设置。ELB Ingress Controller的工作原理如下:

  1. 用户创建Ingress资源,在Ingress中配置流量访问规则,包括负载均衡器、访问路径、SSL以及访问的后端Service端口等。
  2. Ingress Controller监听到Ingress资源发生变化时,就会根据其中定义的流量访问规则,在ELB侧重新配置监听器以及后端服务器路由。
  3. 当用户进行访问时,流量根据ELB中配置的转发策略转发到关联的各个工作负载。

CCE Standard集群场景

图2 ELB Ingress工作原理(CCE Standard集群场景)

CCE Turbo集群使用共享型ELB场景

图3 ELB Ingress工作原理(CCE Turbo集群使用共享型ELB场景)

CCE Turbo集群使用独享型ELB场景

在使用CCE Turbo集群时,Pod IP直接从VPC中分配,支持使用独享型ELB直接连接Pod。创建集群外部访问的Ingress时,可使用ELB对接ClusterIP服务,直接将Pod作为ELB监听器的后端服务器,外部流量可以不经过节点端口转发而直接访问集群中的Pod。

图4 ELB Ingress直通容器原理(CCE Turbo集群使用独享型ELB场景)

Nginx Ingress Controller工作原理

Nginx型的Ingress使用弹性负载均衡(ELB)作为流量入口,并在集群中部署NGINX Ingress控制器来对流量进行负载均衡及访问控制。

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

Nginx型的Ingress Controller通过pod部署在工作节点上,因此引入了相应的运维成本和Nginx组件运行成本,其工作原理如图5,实现步骤如下:

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

ELB Ingress支持的Service类型

表2 ELB Ingress支持的Service类型

集群类型

ELB类型

集群内访问(ClusterIP)

节点访问(NodePort)

CCE Standard集群

共享型负载均衡

不支持

支持

独享型负载均衡

不支持

支持

CCE Turbo集群

共享型负载均衡

不支持

支持

独享型负载均衡

支持

不支持

说明:

CCE Turbo集群中的Pod实例单独绑定ENI网卡,ELB直接对接Pod,因此不支持使用节点访问方式。

Nginx Ingress支持的Service类型

表3 Nginx Ingress支持的Service类型

集群类型

ELB类型

集群内访问(ClusterIP)

节点访问(NodePort)

CCE Standard集群

共享型负载均衡

支持

支持

独享型负载均衡

支持

支持

CCE Turbo集群

共享型负载均衡

支持

支持

独享型负载均衡

支持

支持