Docker KubernetesNotes

第 31 章:项目实战

zjc 于 2026-01-31 发布

这是《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,而是镜像安全、资源边界、流量入口、配置注入、健康检查、发布策略和可观测性的组合。

思考题

  1. 为什么镜像要固定版本?
  2. ConfigMap 和 Secret 如何划分?
  3. 灰度发布观察哪些指标?
  4. OOMKilled 如何处理?
  5. 上线前为什么做混沌演练?