3. Ingress 概念:定义、Controller 作用与资源对象结构

在 Kubernetes 集群中,Service 和 Pod 的 IP 仅在集群内可达。要将集群内部服务暴露到外部,传统方式有 NodePort 和 LoadBalancer,但它们在七层路由、域名分发、TLS 终结等方面能力有限。Ingress 正是为解决这些七层流量管理问题而生的 API 资源。

3.1 Ingress 的定义

Ingress 是 Kubernetes 内置的 API 资源(位于 networking.k8s.io/v1 API 组),它定义了从集群外部到集群内部 Service 的 HTTP 和 HTTPS 路由规则。简单来说,Ingress 充当了“外部流量进入集群的七层网关”的角色。

核心能力:基于 Host 域名 + URL 路径的流量分发、TLS/HTTPS 终结、虚拟主机路由、会话保持、重写规则等。
对比维度 NodePort / LoadBalancer Ingress
工作层级 四层(TCP/UDP) 七层(HTTP/HTTPS)
路由粒度 端口级别 域名 + 路径级别
TLS 终结 不支持(需外部处理) 原生支持
多服务复用 每个服务需独立端口/IP 单个 IP 可路由多个服务
成本 高(每个服务消耗公网 IP) 低(共享入口 IP)

3.2 Ingress Controller 的作用

Ingress 资源本身只是一个声明式规则对象,它不会自动生效。真正负责“读取 Ingress 规则并实现流量转发”的组件是 Ingress Controller。Ingress Controller 是一个运行在集群中的 Pod,通常以 Deployment + Service(或 DaemonSet)形式部署。

关键理解:Ingress 是“规则定义”,Ingress Controller 是“规则执行引擎”。没有 Controller,Ingress 资源只是集群中的一组静态配置数据。

Ingress Controller 的核心职责包括:

  • 监听 Ingress 资源:通过 Kubernetes API 实时监听 Ingress、Service、Secret 等资源的变化。
  • 生成代理配置:将 Ingress 规则转换为反向代理(如 Nginx、HAProxy、Envoy)的配置文件。
  • 动态重载:当规则变更时,自动重载代理配置,实现零停机更新。
  • 七层功能实现:包括 TLS 卸载、路径重写、跨域、限流、认证等高级特性。

常见的 Ingress Controller 实现包括:

Controller 名称 底层代理 特点
Nginx Ingress Controller Nginx 社区最成熟,性能稳定,功能全面
Traefik Go 原生 自动发现,支持多种协议,配置热更新
HAProxy Ingress HAProxy 高并发场景,TCP/UDP 支持好
Kong Ingress Controller Kong (OpenResty) 插件生态丰富,API 网关能力
Istio Ingress Gateway Envoy 服务网格集成,精细流量治理

3.3 Ingress 资源对象的基本结构

一个标准的 Ingress YAML 资源包含以下核心字段:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - app.example.com
    secretName: example-tls
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 8080
      - path: /web
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
  - host: admin.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: admin-service
            port:
              number: 3000

各字段说明:

字段路径 说明
spec.ingressClassName 指定使用哪个 Ingress Controller(对应 IngressClass 资源)
spec.tls HTTPS 配置,指定域名与对应 Secret(含证书和私钥)
spec.rules[].host 虚拟主机域名,不指定则匹配所有 Host
spec.rules[].http.paths[].path URL 路径匹配模式
spec.rules[].http.paths[].pathType 路径匹配类型:Prefix(前缀)、Exact(精确)、ImplementationSpecific
spec.rules[].http.paths[].backend 后端 Service 引用,包含名称和端口

3.4 Ingress 流量路径与组件关系

下图展示了 Ingress 资源、Ingress Controller、后端 Service 之间的完整流量路径:

Ingress 流量路径与组件关系图 Ingress 流量路径与组件关系 外部用户 (Client) HTTPS/TLS Ingress Controller (Nginx) 读取规则 → 生成代理配置 → 转发流量 监听 Ingress 资源 规则定义 路由 路由 路由 Service A (api-service) app.example.com/api → 8080 Service B (web-service) app.example.com/web → 80 Service C (admin-service) admin.example.com/ → 3000 Pod 实例组 (api) Pod 实例组 (web) Pod 实例组 (admin) 说明: 1. Ingress Controller 持续监听 Ingress 资源变化,动态更新代理配置。 2. 外部请求到达 Ingress Controller,根据 Host + Path 规则转发到对应 Service。 3. Service 通过标签选择器将流量负载均衡到后端 Pod 实例。

3.5 路径匹配类型详解

Ingress 支持三种路径匹配类型,选择合适的类型对路由准确性至关重要:

pathType 匹配规则 示例 匹配结果
Exact 完全匹配 URL 路径,区分大小写 /api 仅匹配 /api,不匹配 /api/ 或 /api/v1
Prefix 以指定路径为前缀匹配,支持最长前缀优先 /api 匹配 /api、/api/、/api/v1、/api/v2/users
ImplementationSpecific 由 Ingress Controller 自行解释,通常等同于 Prefix — 取决于具体 Controller 实现
常见陷阱:使用 Prefix 类型时,如果路径末尾不带 /,某些 Controller 可能不会自动添加斜杠重定向。建议在路径末尾显式添加 / 或通过 annotation 配置重写规则。

3.6 Ingress 与 IngressClass 的关联

在 Kubernetes 1.18+ 中,推荐使用 IngressClass 资源来解耦 Ingress 与具体 Controller 的绑定关系。一个集群中可以部署多个 Ingress Controller,通过 IngressClass 实现选择:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: traefik
spec:
  controller: traefik.io/ingress-controller

Ingress 资源通过 spec.ingressClassName 引用对应的 IngressClass,从而选择由哪个 Controller 处理:

spec:
  ingressClassName: nginx   # 引用名为 nginx 的 IngressClass
最佳实践:在 IDP 平台中,建议为不同用途(如内部微服务、外部 API、管理后台)创建不同的 IngressClass,分别绑定不同的 Ingress Controller 实例,实现流量隔离和策略差异化。