16.4.3 Ingress与七层路由

Ingress与七层路由#

Ingress 用于在集群入口处提供基于 HTTP/HTTPS 的七层路由能力,通过 Ingress Controller 将外部流量转发到集群内的 Service。与 Service 的四层负载均衡不同,Ingress 支持基于域名、路径、Header、TLS 的细粒度流量控制,是生产环境对外暴露服务的标准方式。

原理草图(请求链路)

文章图片

核心概念
- Ingress:声明式路由规则与 TLS 配置。
- Ingress Controller:执行 Ingress 规则的代理实现(如 NGINX Ingress)。
- IngressClass:标识 Ingress 归属的 Controller。


安装示例(NGINX Ingress Controller)#

以下示例基于官方清单安装(适用于大多数标准集群):

# 1) 创建命名空间与资源
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

# 2) 查看控制器状态
kubectl -n ingress-nginx get pod -o wide

# 3) 查看服务入口(LoadBalancer/NodePort)
kubectl -n ingress-nginx get svc

命令解释
- apply -f:应用官方部署清单,包含 Controller、RBAC、Service。
- get pod -o wide:确认 Controller 是否 Running。
- get svc:获取外部入口(LB IP 或 NodePort 端口)。


资源与路由示例(域名 + 路径 + TLS)#

前提:已有两个服务 web-serviceapi-service,证书 Secret 名为 web-tls

# file: ingress/web-api-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-api-ingress
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/limit-rps: "20"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - www.example.com
    - api.example.com
    secretName: web-tls
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
  - host: api.example.com
    http:
      paths:
      - path: /v1/(.*)
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 8080
# 1) 应用 Ingress
kubectl apply -f ingress/web-api-ingress.yaml

# 2) 查看生效状态
kubectl get ingress web-api-ingress -o wide

# 3) 查看路由规则与注解
kubectl describe ingress web-api-ingress

命令解释
- describe:展示实际规则、事件与注解解析结果。
- -o wide:查看地址与 IngressClass 绑定情况。


端口与入口模型示例(NodePort 场景)#

当集群无云 LB 时,Ingress Controller 可通过 NodePort 暴露:

# 查看 NodePort 端口
kubectl -n ingress-nginx get svc ingress-nginx-controller

# 假设 NodePort 为 30080,访问时指定 Host 头
curl -H "Host: www.example.com" http://<node-ip>:30080/

预期效果
- 返回 web-service 的响应页面。
- api.example.com/v1/ 返回 api-service 响应。


TLS Secret 创建示例#

# 使用现有证书文件创建 TLS Secret
kubectl create secret tls web-tls \
  --cert=/etc/ssl/certs/web.crt \
  --key=/etc/ssl/private/web.key

命令解释
- create secret tls:生成 kubernetes.io/tls 类型 Secret 供 Ingress 使用。


常用注解与配置示例(超时、限流、Header)#

# file: ingress/advanced-anno.yaml
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-read-timeout: "30"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "30"
    nginx.ingress.kubernetes.io/limit-connections: "50"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "X-Env: prod";

排错与运维(命令+思路)#

  1. Ingress 无法访问(404/503)
kubectl get ingress
kubectl get svc,ep
kubectl describe ingress web-api-ingress
  • 404:规则未匹配或 Host 头不对。
  • 503:后端 Service/Endpoint 不可用。
  1. Ingress 规则不生效
kubectl get ingressclass
kubectl -n ingress-nginx logs deploy/ingress-nginx-controller | tail -n 50
  • 检查 ingressClassName 是否与 Controller 匹配。
  • 日志中查找 “configuration changes detected”。
  1. TLS 证书异常
kubectl get secret web-tls -o yaml
kubectl describe ingress web-api-ingress
  • Secret 不存在或证书链不完整会导致握手失败。
  1. 性能问题
kubectl -n ingress-nginx top pod
kubectl -n ingress-nginx logs deploy/ingress-nginx-controller --since=5m
  • 观察 CPU/内存、连接数与错误日志。

练习题(可操作)#

  1. default 命名空间创建两个 nginx Deployment 和 Service,分别暴露 //v1
  2. 编写 Ingress,要求 www.example.comweb-serviceapi.example.com/v1api-service
  3. 使用 curl -H Host 验证路由效果,并设置 limit-rps=5 后模拟压测观察限流。
  4. 故意删除后端 Pod,观察 Ingress 返回码并通过 describe ingress 定位问题。