概述
你已经用 Kubernetes 部署了各种服务......
每个服务都配了一个 LoadBalancer 类型的 Service,结果:
- AWS 账单暴涨(每个 LoadBalancer 都要钱)
- 每个服务一个公网 IP,难以管理
- 想加 HTTPS、路径路由?得一个个配置
如何使用 Ingress 来解决这些问题
为什么 LoadBalancer 不够用
假设你有 3 个微服务:
| 服务 | 域名 | 端口 |
|---|---|---|
| 用户服务 | user.example.com | 80 |
| 订单服务 | order.example.com | 80 |
| 商品服务 | product.example.com | 80 |
如果用 LoadBalancer:
- 你需要 3 个公网 IP
- 支付 3 份负载均衡费用
- 每个都要单独配置 TLS 证书
那么面临的问题有 成本高、运维复杂、不环保
如何只用 1 个公网 IP ,通过 域名或路径 自动路由到不同服务,这就是 Ingress 的核心价值。
什么是 Ingress
Ingress 是 Kubernetes 的一种 API 对象,用于:
- 将外部 HTTP/HTTPS 流量路由到集群内的 Services
- 支持基于 域名 (Host)或 路径(Path)的规则
- 集中管理 TLS 证书、重定向、限流等
但注意:Ingress 本身只是一个"配置清单" ,真正干活的是 Ingress Controller(如 Nginx、Traefik)。
- Ingress = 路线规划图("user.example.com → 用户服务")
- Ingress Controller = 路由器
Ingress 的三大优势
| 能力 | 说明 |
|---|---|
| ✅ 统一入口 | 一个公网 IP 服务所有应用 |
| ✅ 基于域名/路径路由 | user.example.com → 用户服务,/api/order → 订单服务 |
| ✅ 集中 TLS 管理 | 一张证书搞定所有子域名(通配符证书) |
主流 Ingress Controller 对比
| Controller | 特点 | 适合场景 |
|---|---|---|
| Nginx Ingress | 官方维护,功能全,文档丰富 | 通用首选 |
| Traefik | 自动发现服务,UI 友好,支持 Let's Encrypt | 快速上手、DevOps |
| Istio Gateway | 服务网格集成,高级流量控制 | 已使用 Istio 的团队 |
新手推荐:Nginx Ingress(社区最成熟)
最佳实践:在 Minikube 上部署 Ingress
我们将:
- 启用 Minikube 的 Ingress 插件
- 部署两个微服务(用户 + 订单)
- 创建 Ingress 规则,通过不同路径访问它们
Step 1:启动 Minikube 并启用 Ingress
bash
minikube start --driver=docker
minikube addons enable ingress
验证控制器是否运行:
bash
kubectl get pods -n ingress-nginx
看到 ingress-nginx-controller-xxx 处于 Running 状态即可。
Kind 用户需手动安装 Nginx Ingress,安装方式如下:
bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
等待几分钟,直到 Pod 就绪:
bash
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=90s
然后通过端口转发访问:
bash
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8080:80
访问:http://localhost:808/prefix
Step 2:部署两个微服务
用户服务(user-service)
yaml
# user-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-deploy
spec:
replicas: 1
selector:
matchLabels:
app: user
template:
metadata:
labels:
app: user
spec:
containers:
- name: user-app
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: user-svc
spec:
selector:
app: user
ports:
- protocol: TCP
port: 80
targetPort: 80
订单服务(order-service)
yaml
# order-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-deploy
spec:
replicas: 1
selector:
matchLabels:
app: order
template:
metadata:
labels:
app: order
spec:
containers:
- name: order-app
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: order-svc
spec:
selector:
app: order
ports:
- protocol: TCP
port: 80
targetPort: 80
应用:
bash
kubectl apply -f user-deploy.yaml
kubectl apply -f order-deploy.yaml
Step 3:创建 Ingress 规则
yaml
# ingress-rule.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- http:
paths:
- path: /user
pathType: Prefix
backend:
service:
name: user-svc
port:
number: 80
- path: /order
pathType: Prefix
backend:
service:
name: order-svc
port:
number: 80
📝 说明:
- 访问
/user→ 转发到user-svc- 访问
/order→ 转发到order-svc
应用规则:
bash
kubectl apply -f ingress-rule.yaml
Step 4:获取访问地址
bash
minikube ip
# 输出如:192.168.49.2
现在,打开浏览器或终端:
bash
curl http://192.168.49.2/user
curl http://192.168.49.2/order
你会看到两个不同的 Nginx 欢迎页!
同一个 IP,不同路径,访问不同服务!
Ingress vs Service
| 场景 | 推荐方案 |
|---|---|
| 微服务之间调用 | ✅ ClusterIP Service |
| 本地开发临时暴露 | ✅ NodePort |
| 单个公网服务(简单) | ⚠️ LoadBalancer(小项目可用) |
| 多个 HTTP 服务统一入口 | ✅ Ingress |
| 非 HTTP 流量(如 gRPC、TCP) | ❌ Ingress 不支持 → 用 LoadBalancer 或 Service Mesh |
Ingress 只支持 HTTP/HTTPS!其他协议需另寻方案。
常见问题
Q:Ingress 能加 HTTPS 吗?
当然!只需在 Ingress 中添加 tls 配置,并提供 Secret:
yaml
spec:
tls:
- hosts:
- user.example.com
secretName: my-tls-secret
rules:
- host: user.example.com
...
Q:Ingress Controller 占用资源多吗?
- Nginx Ingress:约 100~200MB 内存,轻量级
- 一个 Controller 可服务成百上千个 Ingress 规则
Q:能做灰度发布吗?
高级 Ingress Controller(如 Nginx Plus、Istio)支持权重路由、Header 匹配等。
总结
| 方案 | 成本 | 管理难度 | 适用规模 |
|---|---|---|---|
| 多个 LoadBalancer | 高 | 高 | 小项目 |
| Ingress | 低(1 个 LB) | 低 | 中小到大型项目 |
有了 Ingress,你的微服务架构才真正走向生产级!