在微服务架构盛行的今天,如何高效、安全地暴露服务,是每一个 Kubernetes 运维与开发人员都要面临的问题。Ingress 作为 K8s 原生提供的 HTTP(S) 路由机制,不仅能统一管理外部访问入口,还支持基于路径、域名的路由转发、TLS 加密等功能。本文将带你全面了解 Ingress 的工作原理、常见控制器、实践配置及注意事项。
一、什么是 Ingress?
Ingress 是一种 Kubernetes API 对象,用于管理集群外部对服务(Service)的 HTTP 和 HTTPS 访问。
与传统 NodePort、LoadBalancer 相比,Ingress 更像是一个七层的应用网关。它借助 Ingress Controller,实现对流量的灵活调度,例如:
- 按域名路由(example.com vs api.example.com)
- 按路径路由(/api vs /admin)
- TLS 终止
- 支持自定义头部、重定向、中间件等功能(需依赖具体 Controller)
二、Ingress 的架构与工作机制
Ingress 本身只是资源定义,并不具备处理请求的能力。真正转发流量的是 Ingress Controller,它通常是一个运行在集群中的 Pod,比如:
控制器 | 说明 |
---|---|
NGINX Ingress | 最主流、社区支持广泛,适合绝大多数场景 |
Traefik | 动态配置强、与微服务集成紧密,支持中间件功能 |
HAProxy Ingress | 基于 HAProxy,性能出色 |
Istio Gateway | 与服务网格场景结合,用于高级路由控制 |
基本流程如下:

三、Ingress 配置实战
1. 基本示例:基于路径的转发
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: example.com
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web(/|$)(.*)
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
说明:
请求 example.com/api/user 将被转发到 api-service。
使用 rewrite-target 重写路径,确保后端能正确解析。
pathType 支持 Prefix、Exact、ImplementationSpecific。
2. 添加 TLS 支持
yaml
spec:
tls:
- hosts:
- example.com
secretName: example-com-tls
TLS 证书通常由 Cert-Manager 自动申请、续签,或手动创建 Secret:
bash
kubectl create secret tls example-com-tls \
--cert=cert.pem \
--key=key.pem
使用 HTTPS 能有效提升安全性,特别是在处理用户数据或提供 API 接口时。
3. 多域名支持
yaml
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
- host: blog.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: blog-service
port:
number: 80
这种方式适合将多个服务部署在同一集群中,按域名隔离访问入口。
四、常用 Annotation 说明(以 NGINX 为例)
Annotation | 作用 |
---|---|
rewrite-target | 重写路径 |
nginx.ingress.kubernetes.io/ssl-redirect | 是否强制 HTTPS |
nginx.ingress.kubernetes.io/backend-protocol | 后端协议 HTTP/HTTPS |
nginx.ingress.kubernetes.io/whitelist-source-range | 限制来源 IP |
nginx.ingress.kubernetes.io/configuration-snippet | 插入 NGINX 配置片段 |
例如,限制某服务只能由特定 IP 段访问:
bash
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.0.0/24"
五、Ingress 背后的负载均衡逻辑
Ingress 通常与 Service 联合使用,其中:
- Ingress 实现 7 层(L7)负载均衡,基于域名与路径;
- Service 的类型为 ClusterIP,Ingress Controller 内部通过访问 Service 再转发到 Pod;
- 控制器如 NGINX 可启用 keepalive、连接池、并发控制等优化项。
如果使用云厂商的 LoadBalancer,通常是四层(TCP),不支持 HTTP 层的路由逻辑。
六、实际生产中需要注意的点
✅ 推荐做法
- 使用 Cert-Manager 自动管理 TLS 证书
- 结合 ExternalDNS 实现域名与 Ingress 的自动绑定
- 使用 PathType=Prefix 明确路径匹配规则
- 配置 健康检查与重试 提升可用性
❌ 常见误区
- 多个 Ingress 对同一域名配置不同路径,易导致冲突
- 忽略 Annotation 生效范围(特定于 Controller)
- 写错 path 正则或 rewrite 导致后端 404
七、总结与最佳实践
能力 | NodePort | LoadBalancer | Ingress |
---|---|---|---|
路由能力 | 无 | 无 | ✅ 支持基于域名、路径等规则 |
HTTP 负载均衡 | ❌ | ❌ | ✅ |
TLS 支持 | ❌ | ❌ | ✅ |
管理多个服务入口 | ❌ | ❌ | ✅ 一处配置多个服务入口 |
易于扩展与控制 | 中等 | 低 | 高(可配合中间件、插件等) |
Ingress 不仅是 Kubernetes 服务暴露的利器,更是打造安全、可维护微服务架构的核心组件。掌握好路径路由、TLS 配置和常见控制器的用法,能显著提升你的 K8s 实践水平。
推荐工具与资源
-
NGINX Ingress Controller 官方文档
-
Cert-Manager 官方文档
-
ExternalDNS 项目地址
如需深入理解 NGINX Ingress 的中间件链路、自定义限流策略或与服务网格的集成,欢迎关注本系列后续内容。