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-service、api-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";
排错与运维(命令+思路)#
- Ingress 无法访问(404/503)
kubectl get ingress
kubectl get svc,ep
kubectl describe ingress web-api-ingress
- 404:规则未匹配或 Host 头不对。
- 503:后端 Service/Endpoint 不可用。
- Ingress 规则不生效
kubectl get ingressclass
kubectl -n ingress-nginx logs deploy/ingress-nginx-controller | tail -n 50
- 检查
ingressClassName是否与 Controller 匹配。 - 日志中查找 “configuration changes detected”。
- TLS 证书异常
kubectl get secret web-tls -o yaml
kubectl describe ingress web-api-ingress
- Secret 不存在或证书链不完整会导致握手失败。
- 性能问题
kubectl -n ingress-nginx top pod
kubectl -n ingress-nginx logs deploy/ingress-nginx-controller --since=5m
- 观察 CPU/内存、连接数与错误日志。
练习题(可操作)#
- 在
default命名空间创建两个nginxDeployment 和 Service,分别暴露/与/v1。 - 编写 Ingress,要求
www.example.com走web-service,api.example.com/v1走api-service。 - 使用
curl -H Host验证路由效果,并设置limit-rps=5后模拟压测观察限流。 - 故意删除后端 Pod,观察 Ingress 返回码并通过
describe ingress定位问题。