Ingress 与 Ingress Controller
Service 解决了 Pod 的发现问题,但你很快会遇到新问题:
- 多域名管理:需要为不同的子域名配置不同的后端服务
- TLS termination:需要在多个服务上配置 HTTPS
- 基于路径的路由:需要将
/api路由到 API 服务,/路由到前端服务 - 灰度发布:需要按照权重分配流量
Ingress 就是来解决这些七层(HTTP/HTTPS)问题的。
Ingress 是什么?
Ingress 是 Kubernetes 的 HTTP 负载均衡资源,它定义了从集群外部到内部服务的 HTTP/HTTPS 路由规则:
basic-ingress.yaml
Info
Ingress 只是资源定义,实际处理流量的是 Ingress Controller。Kubernetes 本身不提供 Ingress Controller,需要单独部署。
Ingress Controller
常见的 Ingress Controller
安装 Nginx Ingress Controller
ingress-nginx-values.yaml
Ingress 规则
基于路径的路由
path-based-ingress.yaml
基于域名的路由
host-based-ingress.yaml
路径类型
TLS 配置
基本 TLS 配置
tls-ingress.yaml
创建 TLS Secret
自动 HTTPS
使用 cert-manager 可以自动管理 TLS 证书:
letsencrypt-ingress.yaml
重写规则
Nginx Ingress Controller 支持路径重写:
rewrite-ingress.yaml
灰度发布
基于权重的流量分割
weight-ingress.yaml
其他灰度注解
认证
Basic 认证
OAuth2 认证
默认后端
当没有匹配的规则时,使用默认后端:
IngressClass
从 Kubernetes 1.18 开始,推荐使用 IngressClass 资源:
ingressclass.yaml
ingress-with-class.yaml
常见问题
Ingress 不生效
排查步骤:
404 错误
常见原因:
- 域名不匹配:请求的 Host 与 Ingress 规则不匹配
- 路径不匹配:没有匹配的路径规则
- Service 不存在:后端 Service 未创建
- Endpoint 为空:后端 Pod 未运行或未 Ready
TLS 证书问题
延伸思考
Ingress 是 Kubernetes 进入外部流量的入口,它的设计体现了几个重要原则:
- 声明式配置:你声明路由规则,Controller 自动配置负载均衡器
- 关注点分离:Ingress 资源定义路由,具体实现由 Controller 负责
- 生态扩展:不同的 Ingress Controller 提供不同的功能
但 Ingress 也有局限:
- 功能差异大:不同 Controller 的功能和注解差异很大
- 配置复杂:高级功能(如限流、熔断)需要大量配置
- 不适合 TCP/UDP:Ingress 只支持 HTTP/HTTPS
对于需要更复杂流量管理的场景,服务网格(如 Istio)可能是更好的选择。
延伸阅读
- Service 详解:ClusterIP、NodePort、LoadBalancer
- Kubernetes 网络模型:深入理解网络原理
- 服务网格概述:更高级的流量管理