项目实战:微服务与 Ingress
最后一章,把整套知识体系用在一个微服务场景:一个前端服务 + 一个后端 API 服务,通过 Ingress 用同一个域名、不同路径统一对外暴露。涉及 Deployment、Service、ConfigMap、Ingress 的协作。
1. 目标架构
浏览器 http://app.example.com
│
▼
Ingress (按路径分流)
├─ / → frontend Service
└─ /api → backend Service
│
▼
frontend Deployment backend Deployment
(3 副本) (3 副本, 读 ConfigMap)2. 完整 YAML
保存为 microservices.yaml:
# 后端配置(用 ConfigMap 注入,便于改环境不重打包)
apiVersion: v1
kind: ConfigMap
metadata:
name: backend-config
data:
APP_ENV: production
LOG_LEVEL: info
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
replicas: 3
selector: { matchLabels: { app: backend } }
template:
metadata:
labels: { app: backend }
spec:
containers:
- name: backend
image: myrepo/backend:1.0
ports: [{ containerPort: 8080 }]
envFrom:
- configMapRef: { name: backend-config }
resources:
requests: { cpu: "100m", memory: "128Mi" }
limits: { cpu: "500m", memory: "256Mi" }
readinessProbe:
httpGet: { path: /health, port: 8080 }
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector: { app: backend }
ports: [{ port: 8080, targetPort: 8080 }]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector: { matchLabels: { app: frontend } }
template:
metadata:
labels: { app: frontend }
spec:
containers:
- name: frontend
image: myrepo/frontend:1.0
ports: [{ containerPort: 80 }]
resources:
requests: { cpu: "50m", memory: "64Mi" }
limits: { cpu: "200m", memory: "128Mi" }
---
apiVersion: v1
kind: Service
metadata:
name: frontend
spec:
selector: { app: frontend }
ports: [{ port: 80, targetPort: 80 }]
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service: { name: backend, port: { number: 8080 } }
- path: /
pathType: Prefix
backend:
service: { name: frontend, port: { number: 80 } }ℹ️ConfigMap 的妙用
后端的环境变量(APP_ENV 等)来自 ConfigMap,改配置只需 kubectl apply 更新 ConfigMap,无需重新构建镜像——这就是"配置与代码解耦"。
3. 部署与验证
kubectl apply -f microservices.yaml
# 确认所有资源就绪
kubectl get pods
kubectl get ingress app-ingress4. 访问验证
若本地没有真实域名,改 /etc/hosts 把 app.example.com 指向 Ingress 入口 IP,再:
# 根路径走前端
curl http://app.example.com/
# /api 走后端
curl http://app.example.com/api/users💡路径顺序有讲究
Ingress 按规则顺序匹配,更具体的 /api 放在 / 之前,避免被 / 的 Prefix 提前截走。
5. 延伸:加 HPA 与回滚
# 给后端加自动扩缩容(需 requests 已设)
kubectl autoscale deployment backend --cpu-percent=50 --min=3 --max=10
# 发布新版本并保留回滚能力
kubectl set image deployment/backend backend=myrepo/backend:2.0
kubectl rollout undo deployment/backend # 出问题一键回退⚠️Ingress 依赖 Controller
若 curl 不通,先确认集群里装了 Ingress Controller(如 nginx-ingress),否则 Ingress 规则不会生效。本地可用 minikube addons enable ingress。
小结
- 微服务:每服务一套 Deployment + Service,通过标签关联
- Ingress 按 host + path 把多服务统一暴露为一个入口
- ConfigMap 注入配置,改配置不重打包镜像
- 串起 HPA、探针、滚动更新即构成生产级部署
- 恭喜!你已学完 Kubernetes 18 章核心内容 🎉