Learn
Kubernetes/18-project-microservices

项目实战:微服务与 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-ingress

4. 访问验证

若本地没有真实域名,改 /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 章核心内容 🎉