Kubernetes Ingress 是一种 API 对象,用于管理外部访问集群内服务的规则,通常是 HTTP 和 HTTPS 路由。Ingress 提供了基于域名和路径的路由、TLS 终止等功能。
Ingress 的作用
-
路由规则:根据域名和路径将流量路由到不同的 Service
-
负载均衡:在多个 Service 实例之间分发流量
-
SSL/TLS 终止:在 Ingress 层面处理 HTTPS,简化后端配置
-
基于名称的虚拟主机:支持多个域名指向同一个集群
-
路径重写:支持 URL 路径重写
Ingress Controller
Ingress Controller 是实现 Ingress 功能的组件,它监听 Ingress 资源的变化并配置负载均衡器。
常见的 Ingress Controller
-
NGINX Ingress Controller:
- 最流行的 Ingress Controller
- 基于 NGINX/OpenResty
- 功能丰富,性能优秀
- 支持高级路由、限流、认证等
-
Traefik:
- 云原生设计
- 自动服务发现
- 支持 Let's Encrypt 自动证书
- 配置简单
-
HAProxy Ingress:
- 基于 HAProxy
- 高性能
- 支持高级负载均衡算法
-
Istio Gateway:
- 服务网格的一部分
- 支持高级流量管理
- 集成 mTLS、流量镜像等
-
AWS ALB Ingress Controller:
- 专门为 AWS 设计
- 使用 AWS Application Load Balancer
- 原生集成 AWS 服务
Ingress 资源示例
基本路由
yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: simple-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: example.com http: paths: - path: /app1 pathType: Prefix backend: service: name: app1-service port: number: 80 - path: /app2 pathType: Prefix backend: service: name: app2-service port: number: 80
TLS 配置
yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tls-ingress spec: tls: - hosts: - secure.example.com secretName: tls-secret rules: - host: secure.example.com http: paths: - path: / pathType: Prefix backend: service: name: secure-service port: number: 443
默认后端
yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: default-backend-ingress spec: defaultBackend: service: name: default-service port: number: 80 rules: - host: example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80
Ingress 注解(Annotations)
注解用于配置 Ingress Controller 的特定行为。
NGINX Ingress Controller 常用注解
- 重写路径:
yamlnginx.ingress.kubernetes.io/rewrite-target: /$2
- 启用 SSL 重定向:
yamlnginx.ingress.kubernetes.io/ssl-redirect: "true"
- 限流配置:
yamlnginx.ingress.kubernetes.io/limit-rps: "10" nginx.ingress.kubernetes.io/limit-connections: "5"
- CORS 配置:
yamlnginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-origin: "*"
- 认证配置:
yamlnginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth
- 自定义错误页面:
yamlnginx.ingress.kubernetes.io/custom-http-errors: "404,503"
Ingress vs Service
| 特性 | Ingress | Service |
|---|---|---|
| 协议 | HTTP/HTTPS | TCP/UDP |
| 路由 | 基于域名和路径 | 基于端口 |
| 负载均衡 | L7(应用层) | L4(传输层) |
| SSL 终止 | 支持 | 不支持 |
| 使用场景 | Web 应用 | 通用服务 |
Ingress vs LoadBalancer
| 特性 | Ingress | LoadBalancer |
|---|---|---|
| 成本 | 低(共享 IP) | 高(每个 Service 一个 IP) |
| 路由能力 | 强(域名、路径) | 弱(仅端口) |
| SSL 终止 | 支持 | 部分支持 |
| 适用场景 | 多个 HTTP/HTTPS 服务 | 少量服务或非 HTTP 服务 |
部署 Ingress Controller
部署 NGINX Ingress Controller
bash# 添加 Helm 仓库 helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update # 安装 helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace
验证安装
bashkubectl get pods -n ingress-nginx kubectl get svc -n ingress-nginx
最佳实践
-
使用命名空间隔离:将 Ingress Controller 部署在独立的命名空间
-
配置资源限制:为 Ingress Controller 设置合理的 CPU 和内存限制
-
启用监控:监控 Ingress Controller 的性能指标
-
使用 TLS:为生产环境配置 TLS 证书
-
配置健康检查:确保后端 Service 的健康检查正常
-
使用注解优化:根据应用需求配置合适的注解
-
备份配置:定期备份 Ingress 配置
-
版本管理:跟踪 Ingress Controller 的版本更新
故障排查
- 查看 Ingress 状态:
bashkubectl get ingress kubectl describe ingress <ingress-name>
- 查看 Ingress Controller 日志:
bashkubectl logs -n ingress-nginx <pod-name>
- 测试 DNS 解析:
bashnslookup example.com
- 检查 Service 和 Endpoint:
bashkubectl get svc kubectl get endpoints
- 验证证书:
bashkubectl get secret tls-secret -o yaml