Docker + Kubernetes 生产环境部署完全指南

这是一份关于 Docker 与 Kubernetes 生产环境部署的指南。由于原文本身即为中文,我将为您整理并优化其结构,使其更符合技术文档的阅读规范。


Docker + Kubernetes 生产环境部署完全指南

前言

在企业级应用开发中,容器化与编排技术已经成为基础设施的基石。本文将从实际生产场景出发,系统讲解从 Docker 容器化到 Kubernetes 编排部署的完整工作流,帮助 DevOps 工程师和后端开发者构建可靠、高效的云原生应用交付体系。


一、Docker 容器化最佳实践

1.1 多阶段构建 (Multi-stage Builds)

多阶段构建是生产环境镜像优化的核心手段,能够将构建依赖与运行时环境严格分离,显著减小最终镜像体积。

# ===== 阶段一:构建阶段 =====
FROM node:20-alpine AS builder
WORKDIR /app
# 先复制依赖文件,利用 Docker 缓存层加速构建
COPY package.json package-lock.json ./
RUN npm ci --only=production
# 复制源码并构建
COPY . .
RUN npm run build

# ===== 阶段二:运行阶段 =====
FROM node:20-alpine AS runtime
# 创建非 root 用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
# 仅从构建阶段复制必要产物
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
USER appuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]

1.2 镜像优化要点

  • 选择精简基础镜像:优先使用 alpineslim 等变体,避免安装不必要的系统包。
  • 合并 RUN 指令:减少镜像层数,将相关操作用 && 连接。
  • 利用构建缓存:将不常变化的文件(如依赖声明)放在 Dockerfile 前部。
  • 设置 .dockerignore:排除 .gitnode_modules*.md 等无关文件。

二、Docker Compose 开发环境配置

在开发阶段,Docker Compose 能够快速搭建包含应用、数据库、缓存等完整依赖的本地环境。

# docker-compose.yml
version: "3.9"
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - DB_HOST=postgres
    volumes:
      - .:/app # 挂载源码实现热重载
    depends_on:
      postgres: { condition: service_healthy }

三、Kubernetes 核心概念

在深入部署配置之前,先梳理 K8s 中最核心的几个资源对象:

资源对象职责
Pod最小调度单元,包含一个或多个共享网络与存储的容器
Deployment声明式管理 Pod 副本数,支持滚动更新与回滚
Service为 Pod 提供稳定的网络访问入口与负载均衡
ConfigMap存储非敏感配置数据,以环境变量或卷挂载方式注入
Secret存储敏感数据(密码、证书等),Base64 编码存储

四、生产级 Kubernetes 部署配置

4.1 Namespace 与 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: production
data:
  NODE_ENV: "production"
  DB_HOST: "postgres-service"

4.2 Secret 管理

注意:生产环境中建议使用 Sealed Secrets、HashiCorp Vault 或云厂商的密钥管理服务,避免将 Secret 明文提交到代码仓库。

4.3 Deployment 关键配置

在生产环境中,务必配置 resources(资源限制)、livenessProbe(存活探针)以及 podAntiAffinity(反亲和性,确保高可用)。

4.4 Service 与 Ingress

通过 Ingress 控制器(如 Nginx Ingress)实现外部流量的路由、SSL 终止及限流。


五、健康检查与自动扩缩容

5.1 健康检查设计

  • livenessProbe:检测容器是否存活,失败则重启容器。
  • readinessProbe:检测容器是否就绪,失败则从 Service Endpoints 中摘除。
  • startupProbe:检测容器是否启动完成,适用于启动较慢的应用。

5.2 HPA 自动扩缩容

通过 HorizontalPodAutoscaler,根据 CPU 或内存使用率自动调整 Pod 副本数量,以应对流量波动。

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  minReplicas: 3
  maxReplicas: 15
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70