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 镜像优化要点
- 选择精简基础镜像:优先使用
alpine、slim等变体,避免安装不必要的系统包。 - 合并 RUN 指令:减少镜像层数,将相关操作用
&&连接。 - 利用构建缓存:将不常变化的文件(如依赖声明)放在 Dockerfile 前部。
- 设置 .dockerignore:排除
.git、node_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