这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 本章将一个电商微服务部署到 Kubernetes,覆盖镜像、Deployment、Service、Ingress、配置、探针、发布和监控。
31.1 服务拓扑
Internet
-> Ingress
-> gateway
-> order-service
-> product-service
-> PostgreSQL
-> Redis
非核心依赖:
Prometheus
Grafana
Fluent Bit
31.2 镜像
FROM maven:3.9-eclipse-temurin-17 AS build
WORKDIR /src
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=build /src/target/order-service.jar app.jar
USER app
ENTRYPOINT ["java", "-XX:MaxRAMPercentage=70", "-jar", "/app/app.jar"]
31.3 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
labels:
app: order
spec:
replicas: 3
selector:
matchLabels:
app: order
template:
metadata:
labels:
app: order
spec:
containers:
- name: app
image: registry.example.com/shop/order-service:1.2.0
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: order-config
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: "1"
memory: 1Gi
31.4 Service 与 Ingress
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
selector:
app: order
ports:
- port: 80
targetPort: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shop
spec:
ingressClassName: nginx
rules:
- host: shop.example.com
http:
paths:
- path: /api/orders
pathType: Prefix
backend:
service:
name: order-service
port:
number: 80
31.5 配置与 Secret
ConfigMap 放普通参数,Secret 放数据库凭据:
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
生产可接外部密钥管理系统,并记录轮转流程。
31.6 发布
kubectl apply -f deployment.yaml
kubectl rollout status deployment/order-service
核心链路采用:
1. 预发环境验证
2. 镜像扫描
3. 生产小比例灰度
4. 观察错误率和延迟
5. 逐步放大流量
6. 异常自动回滚
31.7 监控
| 指标 | 目标 |
|---|---|
| HTTP 5xx | 立即告警 |
| P99 延迟 | SLO |
| Pod restarts | 异常告警 |
| CPU throttling | 容量评估 |
| OOMKilled | 高危 |
| 数据库连接池 | 保护依赖 |
31.8 上线清单
1. requests / limits
2. liveness / readiness / startup
3. 日志和 trace
4. Service / Ingress 测试
5. NetworkPolicy
6. RBAC
7. HPA
8. 备份和回滚
9. 混沌演练
本章小结
项目上线不只是 apply YAML,而是镜像安全、资源边界、流量入口、配置注入、健康检查、发布策略和可观测性的组合。
思考题
- 为什么镜像要固定版本?
- ConfigMap 和 Secret 如何划分?
- 灰度发布观察哪些指标?
- OOMKilled 如何处理?
- 上线前为什么做混沌演练?