Kubernetes Ingress 是一种 API 对象,用于管理外部用户对集群内服务的 HTTP 和 HTTPS 访问。它提供了基于域名和路径的智能路由、TLS 证书终止、负载均衡等功能,是集群的“七层入口”。


1. 为什么需要 Ingress?

如果没有 Ingress,暴露服务通常只能:

  • 使用 NodePort:在每个节点上开一个端口,但端口范围有限(30000-32767),且不适合生产。
  • 使用 LoadBalancer:为每个服务创建一个云负载均衡器,成本高且缺乏统一管理。

Ingress 解决了这些问题:

  • 统一入口:一个公网 IP 就能访问多个服务。
  • 七层路由:可根据域名(foo.combar.com)或 URL 路径(/api/web)将请求转发到不同 Service。
  • TLS 终止:在入口处集中配置 HTTPS 证书,后端服务无需处理加密。
  • 成本优化:减少公网 IP 和负载均衡器数量。

2. Ingress 的工作原理

Ingress 本身只是定义规则,真正干活的是 Ingress Controller(如 Nginx Ingress Controller、Traefik、AWS ALB Ingress Controller 等)。工作流程如下:

  1. 用户创建 Ingress 资源,描述路由规则。
  2. Ingress Controller 监听 API Server,一旦发现新 Ingress,就动态配置自身的负载均衡器(如生成 Nginx 配置)。
  3. 外部请求到达 Ingress Controller(通常通过 Service 暴露,如 NodePort 或 LoadBalancer),Controller 根据规则将请求转发到对应的 Service,然后到达后端 Pod。

3. 一个简单的 Ingress 示例

假设有两个 Service:

  • web-service:提供 Web 前端
  • api-service:提供 REST API

希望:

  • http://example.com/web-service
  • http://example.com/api/api-service

Ingress 配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.com                 # 域名
    http:
      paths:
      - path: /                        # 根路径
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
      - path: /api                      # API 路径
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80

创建后,所有访问 example.com 的请求都会被路由到对应的 Service。


4. Ingress 与 Service 的关系

  • Service 负责集群内部的负载均衡和网络代理(四层)。
  • Ingress 负责集群外部的 HTTP/HTTPS 路由(七层),并将流量转发到对应的 Service

通常,Ingress 将请求转发给 Service,Service 再转发给 Pod。但某些高级 Ingress Controller 支持直接转发到 Pod(跳过 Service),不过 Service 仍是主流模式,因为它提供了稳定的抽象。


5. 主要功能特性

功能说明
基于域名路由根据 Host 头将请求转发到不同 Service。
基于路径路由根据 URL 路径(如 /api/static)分发流量。
TLS 配置可关联 Secret 存储证书,实现 HTTPS 访问。
默认后端定义未匹配任何规则时的兜底服务。
注解(Annotations)通过注解定制 Controller 行为,如重写、限流、CORS 等。

6. 常见 Ingress Controller

  • Nginx Ingress Controller:最流行,基于 Nginx 和 Lua。
  • Traefik:云原生,自动服务发现,支持多种协议。
  • AWS Load Balancer Controller:在 AWS 上创建 ALB 作为 Ingress。
  • HAProxy Ingress:高性能,特性丰富。

总结

Ingress 是 Kubernetes 对外暴露服务的标准方式,它通过将七层路由规则与具体实现解耦,提供了灵活、统一、可扩展的入口管理能力,是现代云原生应用不可或缺的组件。

更多推荐