Skip to content

Kubernetes-Ingress

文档:https://kubernetes.github.io/ingress-nginx/

Kubernetes Ingress 是 Kubernetes 集群中管理外部访问的核心组件,它提供了灵活的路由规则定义和负载均衡能力

Ingress 概述与核心概念

Ingress 的定义与作用

Ingress 是 Kubernetes 中的一种 API 对象,用于管理和配置集群中的 HTTP 和 HTTPS 服务路由。它充当了集群外部流量和集群内部服务之间的入口,实现了流量的负载均衡、路由和 TLS 终止等功能。

Ingress 的主要优势在于:

  • 统一入口:通过一个统一的入口暴露多个服务,避免为每个服务单独配置外部访问方式
  • 资源节约:只需一个或少量公网 IP 和负载均衡器即可同时暴露多个 HTTP 服务
  • 灵活路由:支持基于域名、路径、HTTP 头部等条件的复杂路由规则
  • TLS 终止:可以在集群边缘处理 SSL/TLS 加密解密,减轻后端服务负担

Ingress 与 Service 的关系

在 Kubernetes 网络模型中,Ingress 和 Service 是互补的组件:

  • Service:主要用于 L4(传输层)流量的暴露,定义了一组 Pod 的访问入口,可以通过 ClusterIP、NodePort、LoadBalancer 等方式将流量引入到集群内部
  • Ingress:主要用于 L7(应用层)流量的路由,可以根据域名、路径等规则对流量进行分发,实现了灵活的路由和负载均衡功能

它们通常结合使用,通过 Ingress 将流量路由到对应的 Service,再由 Service 将流量分发到具体的 Pod。

Ingress 的核心组件

完整的 Ingress 系统包含两个核心部分:

  1. Ingress 资源对象:Kubernetes 的一个 API 对象,用于编写资源配置规则,定义请求如何转发到后端服务的规则
  2. Ingress Controller:负责实现 Ingress 规则的组件,监听 Ingress 对象的变化并动态更新代理配置。常见的实现有:
    • Nginx Ingress Controller
    • Traefik
    • HAProxy
    • Contour
    • Istio

Ingress 工作原理

基本工作流程

Ingress 的工作机制可以概括为以下步骤:

  1. 定义路由规则:用户通过 Kubernetes API 创建 Ingress 规则,指定域名与集群内服务的映射关系
  2. 感知规则变化:Ingress 控制器实时监控 Kubernetes API,以便发现 Ingress 规则的更新
  3. 生成配置:一旦检测到变化,Ingress 控制器自动生成相应的代理配置(如 Nginx 配置)
  4. 应用配置:新生成的配置被应用到运行中的代理实例,通常无需重启服务
  5. 流量转发:代理根据更新的配置,将外部请求转发到集群内正确的服务
  6. SSL/TLS 终止(可选):如果配置了 SSL/TLS,代理可以在转发前终止加密连接

与传统负载均衡的区别

Ingress 相当于一个 7 层的负载均衡器,是 Kubernetes 对反向代理的一个抽象。与传统负载均衡相比:

  • 传统负载均衡:如 Nginx、HAProxy,成熟稳定但动态更新需要 reload 配置
  • 微服务负载均衡:如 Traefik、Envoy、Istio,专为微服务设计,支持动态更新但性能有待提升

Ingress 控制器详解

常见控制器类型

Kubernetes 支持多种 Ingress 控制器,各有特点:

  1. Nginx Ingress Controller
    • 基于 Nginx 的反向代理和负载均衡器
    • 成熟稳定,性能高
    • 支持丰富的注解(annotations)扩展功能
    • 需要 reload 配置来应用变更
  2. Traefik
    • 专为微服务设计的现代 HTTP 反向代理
    • 原生支持服务发现和自动配置
    • 内置监控和熔断功能
    • 配置热更新无需重启
  3. HAProxy Ingress
    • 高性能 TCP/HTTP 负载均衡器
    • 特别适合高并发场景
    • 动态配置更新能力
  4. Istio Ingress Gateway
    • 基于 Envoy 代理构建
    • 与 Istio 服务网格深度集成
    • 支持高级流量管理策略

控制器部署模式

Ingress 控制器可以以多种方式部署:

  1. DaemonSet
    • 每个节点运行一个控制器 Pod
    • 使用 hostNetwork 或 hostPort 暴露端口
    • 适合需要利用所有节点资源的场景
  2. Deployment
    • 运行指定数量的控制器副本
    • 通过 NodePort 或 LoadBalancer 类型的 Service 暴露
    • 配合外部负载均衡器实现高可用
  3. 外部负载均衡器
    • 在云环境中,可以直接使用云提供商提供的负载均衡器
    • 如 AWS ALB、GCE 负载均衡器等

部署 Ingress 控制器

bash
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/cloud/deploy.yaml

修改镜像地址

bash
# 将文件内的镜像下载地址改成国内的
registry.k8s.io/ingress-nginx/controller:v1.6.4
# 替换成阿里云的
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.6.4

修改网络模式

bash
# 494行新增
hostNetwork: true

	  ...
      dnsPolicy: ClusterFirst
      hostNetwork: true				# 添加
      nodeSelector:
        kubernetes.io/os: linux
      ...

修改部署资源类型

bash
# 默认deploment,只会在随机节点部署。
# 将nginx-ingress-controller设置成DaemonSet

390 ---   
391 apiVersion: apps/v1
392 kind: DaemonSet			# 此处修改
393 metadata:

部署

bash
kubectl apply -f example-ingress.yaml

Ingress 配置详解

端口映射关系

配置位置示例值说明
path.backend.port.number80Service的对外暴漏的虚拟端口
Service的spec.ports.port80必须与Ingress配置一致
Service的spec.ports.targetPort8080Pod的实际容器端口

路径匹配类型

Ingress 支持三种路径匹配方式:

  1. Prefix:前缀匹配,路径以指定字符串开头
  2. Exact:精确匹配,路径必须完全一致
  3. ImplementationSpecific:由具体 Ingress 控制器实现决定

基本配置结构

Ingress 资源的基本 YAML 结构如下:

yaml
apiVersion: networking.k8s.io/v1  # Kubernetes API 版本
kind: Ingress                     # 资源类型为 Ingress
metadata:
  name: example-ingress           # Ingress 对象名称
  annotations:                    # 控制器专用配置(Nginx 示例)
    # 注解
    # 基础配置
    kubernetes.io/ingress.class: "nginx"  # 指定使用的 Ingress 控制器类型
    nginx.ingress.kubernetes.io/ssl-redirect: "false"  # 禁用 HTTP 到 HTTPS 的自动跳转
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false" # 禁用强制 SSL 重定向
    
    # 注解配置:强制将 HTTP 请求重定向到 HTTPS
    nginx.ingress.kubernetes.io/ssl-redirect"true"
    
    # 流量控制
    nginx.ingress.kubernetes.io/limit-rps: "100"  # 每秒请求数限制
    nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"  # 代理缓冲区大小
    
    # 连接优化
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "15"  # 后端连接超时(秒)
    nginx.ingress.kubernetes.io/proxy-read-timeout: "300"    # 读取超时
    
    # 安全相关
    nginx.ingress.kubernetes.io/enable-cors: "true"  # 启用 CORS
    nginx.ingress.kubernetes.io/cors-allow-origin: "*"  # 允许的域名
    
    # 日志相关
    nginx.ingress.kubernetes.io/enable-access-log: "true"  # 启用访问日志
    nginx.ingress.kubernetes.io/configuration-snippet: |    # 自定义 Nginx 配置片段
      access_log /var/log/nginx/access.log upstreaminfo;
      error_log  /var/log/nginx/error.log notice;

spec:
  # TLS 配置(可选)
  tls:
  - hosts:
    - example.com       # 证书适用的域名
    secretName: example-tls  # 保存证书的 Secret 名称
  
  rules:  # 路由规则定义
  - host: example.com   # 匹配的域名
    http:
      paths:
      - path: /app1     # 路径匹配规则
        pathType: Prefix  # 匹配类型:Prefix(前缀)|Exact(精确)|ImplementationSpecific
        backend:
          service:
            name: app1-service  # 后端 Service 名称
            port:
              number: 8080     # Service 端口(非 Pod 端口!)
        
        # 路径级注解(覆盖全局)
        metadata:
          annotations:
            nginx.ingress.kubernetes.io/rewrite-target: /$1  # URL 重写规则
            nginx.ingress.kubernetes.io/auth-type: basic      # 基础认证
            
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 8081

关键字段说明:

  • metadata.annotations:控制器的特定配置,如 kubernetes.io/ingress.class 指定控制器类型
  • spec.rules:定义路由规则,可以基于主机名和路径
  • spec.tls:配置 SSL/TLS 证书

路由规则类型

Ingress 支持多种路由规则配置方式:

基于路径的路由

yaml
apiVersion: networking.k8s.io/v1  # 使用 networking.k8s.io/v1 API(Kubernetes 1.19+)
kind: Ingress
metadata:
  name: path-based-routing
  annotations:
    # 基础控制器配置
    kubernetes.io/ingress.class: "nginx"  # 指定使用 Nginx Ingress 控制器
    nginx.ingress.kubernetes.io/ssl-redirect: "false"  # 禁用自动 HTTPS 跳转(如有 TLS 需设为 true)
    
    # 流量控制
    nginx.ingress.kubernetes.io/limit-rps: "100"  # 全局限流 100 请求/秒
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "15"  # 连接超时时间(秒)
    
    # 路径重写示例(按需启用)
    # nginx.ingress.kubernetes.io/rewrite-target: /$2  # 捕获路径参数重写

spec:
  # TLS 配置(可选)
  # tls:
  # - hosts:
  #   - yourdomain.com
  #   secretName: your-tls-secret
  
  rules:
  - host: yourdomain.com  # 替换为实际域名,或删除此行使用 IP 访问
    http:
      paths:
      - path: /service1     # 匹配 /service1 前缀路径
        pathType: Prefix    # 匹配类型:Prefix(前缀)|Exact(精确)
        backend:
          service:
            name: service1  # 后端 Service 名称
            port:
              number: 80    # Service 端口(非 Pod 端口)
        
        # 路径级专属注解(覆盖全局配置)
        metadata:
          annotations:
            nginx.ingress.kubernetes.io/configuration-snippet: |
              add_header X-Service-Type "Service1";  # 添加自定义响应头
              # 重定向
              if ($request_uri ~* "^/svc/") {
                rewrite ^/svc/(.*) /$1 break;
              }
            # 会话保持
            nginx.ingress.kubernetes.io/affinity: cookie
            nginx.ingress.kubernetes.io/limit-rps: "50"  # 本路径限流 50 请求/秒

      - path: /service2
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80
        metadata:
          annotations:
            nginx.ingress.kubernetes.io/auth-type: basic  # 启用基础认证
            nginx.ingress.kubernetes.io/auth-secret: basic-auth  # 认证 Secret
            nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
            
      # 默认后端(可选,当没有路径匹配时使用)
      # - path: /
      #   pathType: Prefix
      #   backend:
      #     service:
      #       name: default-service
      #       port:
      #         number: 8080
路径匹配类型:
  • Prefix:匹配以指定路径开头的请求(如 /service1 会匹配 /service1/xxx
  • Exact:精确匹配路径(需完全一致)
多路径优先级
  • Kubernetes 会优先匹配更长的路径
  • 例如 /service1/sub 会优先于 /service1

基于域名的路由

yaml
apiVersion: networking.k8s.io/v1  # Kubernetes 1.19+ 版本API
kind: Ingress
metadata:
  name: domain-based-routing
  annotations:
    # 基础控制器配置
    kubernetes.io/ingress.class: "nginx"  # 指定使用Nginx Ingress控制器
    nginx.ingress.kubernetes.io/ssl-redirect: "false"  # 禁用自动HTTPS跳转
    
    # 全局流量控制
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "15"  # 连接超时(秒)
    nginx.ingress.kubernetes.io/proxy-read-timeout: "300"    # 读取超时
    
    # 安全相关
    nginx.ingress.kubernetes.io/enable-cors: "true"  # 启用CORS
    nginx.ingress.kubernetes.io/cors-allow-origin: "*"  # 允许所有域名跨域

spec:
  # TLS配置(可选)
  tls:
  - hosts:
    - service1.example.com  # 证书覆盖的域名
    - service2.example.com
    secretName: example-tls  # 包含证书的Secret名称
  
  rules:
  # 第一个域名路由规则
  - host: service1.example.com  # 完全匹配该域名
    http:
      paths:
      - path: /  # 匹配根路径
        pathType: Prefix  # 匹配类型:Prefix/Exact/ImplementationSpecific
        backend:
          service:
            name: service1  # 后端Service名称
            port:
              number: 80    # Service端口(非Pod端口)
        
        # 域名级专属注解(覆盖全局配置)
        metadata:
          annotations:
            nginx.ingress.kubernetes.io/configuration-snippet: |
              add_header X-Service-Name "Service1";  # 添加自定义响应头
            nginx.ingress.kubernetes.io/limit-rps: "200"  # 本域名限流200请求/秒

  # 第二个域名路由规则          
  - host: service2.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80
        metadata:
          annotations:
            nginx.ingress.kubernetes.io/auth-type: basic  # 启用基础认证
            nginx.ingress.kubernetes.io/auth-secret: basic-auth  # 认证Secret
            nginx.ingress.kubernetes.io/auth-realm: "Service2 Authentication"
            
      # 可选:为该域名添加额外路径规则
      # - path: /api
      #   pathType: Prefix
      #   backend:
      #     service:
      #       name: service2-api
      #       port:
      #         number: 8080
域名匹配规则
  • 必须精确匹配 host 字段指定的域名
  • 支持通配符域名(如 *.example.com),但需要证书支持
TLS证书
bash
# 创建证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.cert \
-subj "/CN=yunjisuan.com/O=yunjisuan.com"

# 将生成的证书保存到k8s中(example:域名)
kubectl create secret tls example-tls \
  --cert=path/to/cert.pem \
  --key=path/to/key.pem

默认后端

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: default-backend-ingress
  annotations:
    # 基础控制器配置
    kubernetes.io/ingress.class: "nginx"  # 指定使用的Ingress控制器类型
    nginx.ingress.kubernetes.io/ssl-redirect: "false"  # 禁用自动HTTPS跳转

    # 默认后端专属配置
    nginx.ingress.kubernetes.io/default-backend: "default-service"  # 显式声明默认后端
    nginx.ingress.kubernetes.io/custom-http-errors: "404,503"  # 对这些错误码使用默认后端

    # 全局配置
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "15"  # 连接超时时间(秒)
    nginx.ingress.kubernetes.io/proxy-read-timeout: "300"    # 读取超时时间

spec:
  # 默认后端配置(当没有规则匹配时使用)
  defaultBackend:
    service:
      name: default-service  # 默认后端Service名称
      port:
        number: 80           # Service端口(非Pod端口)

  # 可选:正常路由规则(默认后端不会影响这些规则)
  rules:
  - host: app.example.com    # 显式声明的域名规则优先于默认后端
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 8080

  # TLS配置(可选)
  # tls:
  # - hosts:
  #   - app.example.com
  #   secretName: app-tls
defaultBackend 核心作用
  • 处理所有未匹配任何显式规则的请求
  • 捕获自定义错误码(如404/503等)
  • 通常用于展示维护页面或404页面
工作优先级
mermaid
graph TD
  A[请求到达] --> B{匹配显式规则?}
  B -->|是| C[按规则路由]
  B -->|否| D[转到默认后端]
测试命令
bash
# 测试未匹配任何规则的请求
curl http://<INGRESS_IP>/non-existent-path

# 测试显式规则(应返回app-service内容)
curl -H "Host: app.example.com" http://<INGRESS_IP>/

混合路由

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hybrid-routing-ingress
  annotations:
    # 基础控制器配置
    kubernetes.io/ingress.class: "nginx"  # 指定Ingress控制器类型
    nginx.ingress.kubernetes.io/ssl-redirect: "false"  # 禁用自动HTTPS跳转

    # 路由优先级控制
    nginx.ingress.kubernetes.io/server-alias: "*.example.com"  # 通配符域名支持
    nginx.ingress.kubernetes.io/configuration-snippet: |
      # 自定义Nginx配置片段
      if ($host = '') { set $proxy_upstream_name "default-backend"; }

    # 全局流量控制
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "15"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "300"

spec:
  # TLS配置(可选)
  tls:
  - hosts:
    - foo.example.com  # 域名级TLS
    secretName: foo-tls
  - secretName: wildcard-tls  # 通配符证书(用于非指定域名请求)

  rules:
  # ======================
  # 域名+路径混合路由规则
  # ======================
  - host: foo.example.com  # 显式域名匹配(高优先级)
    http:
      paths:
      - path: /bar  # 路径规则1
        pathType: Prefix
        backend:
          service:
            name: service1
            port: 
              number: 80
        metadata:
          annotations:
            nginx.ingress.kubernetes.io/rewrite-target: /$1  # 路径重写
            nginx.ingress.kubernetes.io/limit-rps: "100"  # 限流

      - path: /baz  # 路径规则2
        pathType: Exact  # 精确匹配
        backend:
          service:
            name: service2
            port: 
              number: 80
        metadata:
          annotations:
            nginx.ingress.kubernetes.io/auth-type: basic  # 基础认证

  # ======================
  # 纯路径路由规则(无host)
  # ======================
  - http:
      paths:
      - path: /foo  # 通用路径规则
        pathType: Prefix
        backend:
          service:
            name: service3
            port: 
              number: 80
        metadata:
          annotations:
            nginx.ingress.kubernetes.io/cors-allow-origin: "*"  # 允许跨域

  # ======================
  # 默认后端(无规则匹配时)
  # ======================
  defaultBackend:
    service:
      name: default-service
      port:
        number: 8080
路由优先级顺序
mermaid
graph LR
  A[请求] --> B{匹配 foo.example.com?}
  B -->|是| C{匹配 /bar或/baz?}
  B -->|否| D{匹配 /foo?}
  C -->|匹配| E[路由到service1/service2]
  D -->|匹配| F[路由到service3]
  C -->|不匹配| G[返回404]
  D -->|不匹配| H[转到defaultBackend]

TLS/SSL 配置

Ingress 配置

Ingress 支持 TLS 终止功能,可以在边缘终止 SSL 连接:

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-ingress
  annotations:
    # 基础控制器配置
    kubernetes.io/ingress.class: "nginx"  # 指定Ingress控制器类型
    
    # TLS增强配置
    nginx.ingress.kubernetes.io/ssl-redirect: "true"  # 强制HTTP跳转到HTTPS
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"  # 即使错误也强制跳转
    nginx.ingress.kubernetes.io/ssl-passthrough: "false"  # 禁用SSL透传(需控制器支持)
    
    # 安全加固
    nginx.ingress.kubernetes.io/ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256"
    nginx.ingress.kubernetes.io/ssl-protocols: "TLSv1.2 TLSv1.3"
    nginx.ingress.kubernetes.io/ssl-session-tickets: "false"  # 禁用SSL会话票证
    nginx.ingress.kubernetes.io/hsts: "true"  # 启用HTTP严格传输安全
    nginx.ingress.kubernetes.io/hsts-max-age: "31536000"  # HSTS有效期(秒)
    nginx.ingress.kubernetes.io/hsts-include-subdomains: "true"  # 包含子域名
    
    # 证书自动管理(需安装cert-manager)
    cert-manager.io/cluster-issuer: "letsencrypt-prod"  # 指定证书颁发者
    cert-manager.io/acme-challenge-type: "http01"  # 验证方式

spec:
  # ======================
  # TLS/SSL 配置
  # ======================
  tls:
  - hosts:
    - example.com       # 证书适用的主域名
    - "*.example.com"   # 通配符子域名(需通配符证书支持)
    secretName: example-tls  # 引用存储证书的Secret名称
  
  # ======================
  # 路由规则
  # ======================
  rules:
  - host: example.com  # 必须与tls.hosts中的域名一致
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80  # 后端Service端口
        metadata:
          annotations:
            nginx.ingress.kubernetes.io/backend-protocol: "HTTP"  # 后端协议类型

TLS 证书准备

命令行模式
bash
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout example.key -out example.cert -subj "/CN=example.com/O=example.com"

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt \
  -subj "/CN=www.yun.local" \
  -addext "subjectAltName = DNS:www.yun.local, DNS:yun.local"
  
# 将生成的证书保存到k8s中
kubectl create secret tls example-tls --key example.key --cert example.cert
kubectl create secret tls example-tls \
  --namespace demo-study \
  --key tls.key \
  --cert tls.crt
  
# 检测
kubectl get secret -n <namespace>
资源清单
yaml
# Secret 资源 API 版本
apiVersion: v1
# 资源类型为 Secret
kind: Secret
metadata:
# Secret 名称,需与 Ingress 中引用的一致
  name: ecommerce-tls
# 所属命名空间,与 Ingress 保持一致
  namespace: shop
# Secret 类型为 kubernetes.io/tls(用于存储 TLS 证书)
type: kubernetes.io/tls
data:
# 证书内容(Base64 编码),可通过 `cat cert.pem | base64` 生成
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCg==
# 私钥内容(Base64 编码),可通过 `cat key.pem | base64` 生成
  tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCg==

多域名证书配置

yaml
tls:
- hosts:
  - example.com
  - api.example.com
  - "*.example.com"  # 通配符需要证书支持
  secretName: wildcard-tls

annotations-注解

负载均衡

yaml
annotations:
  # 注解配置:将负载均衡策略设置为最少连接(优先转发到连接数最少的后端)
  nginx.ingress.kubernetes.io/load-balance"least_conn"
  • 轮询(默认):nginx.ingress.kubernetes.io/load-balance: "round_robin"
  • 最少连接:nginx.ingress.kubernetes.io/load-balance: "least_conn"
  • IP 哈希:nginx.ingress.kubernetes.io/ip-hash: "true"

重定向

yaml
annotations:
  # 强制将 HTTP 请求重定向到 HTTPS
  nginx.ingress.kubernetes.io/ssl-redirect"true"

路径重写

yaml
# 路径重写示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-example
  annotations:
    # 重写目标配置:将匹配的路径重写为 /$2($2 对应正则表达式的第二个分组)
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      # 路径规则:匹配 /v1 开头的路径(如 /v1/user、/v1/order 等)
      # 正则表达式说明:/v1(/|$)(.*) 中,$1 匹配 / 或空,$2 匹配后续内容
      - path: /v1(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: api-service
            port: {number: 80}
# 效果:访问 api.example.com/v1/user 时,实际转发到 api-service 的 /user 路径

跨域控制(CORS)

yaml
annotations:
  # 允许跨域请求的来源(仅允许 https://frontend.example.com)
  nginx.ingress.kubernetes.io/cors-allow-origin"https://frontend.example.com"
  # 允许的 HTTP 方法
  nginx.ingress.kubernetes.io/cors-allow-methods"GET, POST, PUT, DELETE"
  # 允许的请求头
  nginx.ingress.kubernetes.io/cors-allow-headers"Content-Type, Authorization"
  # 允许跨域请求携带 Cookie
  nginx.ingress.kubernetes.io/cors-allow-credentials"true"

流量控制

Ingress 控制器通常支持多种流量控制策略:

流量限制

yaml
annotations:
  nginx.ingress.kubernetes.io/limit-rpm: "100"  			# 每分钟100个请求
  nginx.ingress.kubernetes.io/limit-rps: "5"     			# 每秒5个请求(与rpm同时生效时取更严格值)
  nginx.ingress.kubernetes.io/limit-connections: "10"  		# 并发连接数限制
  nginx.ingress.kubernetes.io/limit-burst-multiplier: "5"  	# 突发流量系数

超时控制

yaml
annotations:
  nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"  # 后端连接超时(秒)
  nginx.ingress.kubernetes.io/proxy-send-timeout: "20"    # 发送请求超时
  nginx.ingress.kubernetes.io/proxy-read-timeout: "30"    # 读取响应超时
  nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "15"  # 切换后端超时

高级保护

yaml
annotations:
  nginx.ingress.kubernetes.io/enable-underscores-in-headers: "false"  # 禁用下划线header
  nginx.ingress.kubernetes.io/disable-access-log: "false"  # 开启访问日志
  nginx.ingress.kubernetes.io/connection-proxy-header: "keepalive"  # 连接优化

会话保持

yaml
annotations:
  nginx.ingress.kubernetes.io/affinity: cookie

连接池优化

yaml
annotations:
  nginx.ingress.kubernetes.io/upstream-keepalive-connections: "100"
  nginx.ingress.kubernetes.io/upstream-keepalive-timeout: "60"
  nginx.ingress.kubernetes.io/upstream-keepalive-requests: "1000"

缓冲区优化

yaml
annotations:
  nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
  nginx.ingress.kubernetes.io/proxy-buffers-number: "4"