第 2 章 · 多环境与配置管理
本章目标:规范 dev / staging / prod 三环境隔离;掌握 ConfigMap、Secret 分层与 12-Factor 配置外置;维护 demo-mall 环境差异矩阵,建立 staging→prod 配置晋升 流程。
学时建议:2~2.5 小时(含 1.5 小时跟练)
前置:小紫云计算 · 应用部署;PaaS ch15 多环境概念;ops-deploy ch01 三环境地图。
2.1 场景说明
| 项目 | 内容 |
|---|---|
| 背景 | demo-mall API 在 dev 用 DEBUG 日志、连测试库;staging 需脱敏数据预发布;prod 严禁调试端口 |
| 事故伏笔 | 某次 dev 的 DB_HOST 误复制到 prod ConfigMap,导致 staging 回归通过但 prod 连错库(本课 ch06 会演练) |
| 你的角色 | DevOps,负责 Namespace 配额、ConfigMap/Secret 规范、env-matrix 文档 |
| 本章任务 | 创建/核对 6 Namespace、部署带 envFrom 的 demo-api、完成一次 LOG_LEVEL 变更验证 |
| 约束 | Secret 明文 永不进 Git;prod 变更需走晋升检查清单 |
核心原则:staging 拓扑与 prod 同构(同组件、不同规模);镜像 无环境差异,差异全在配置层。
2.2 学完你能
| 能力 | 验收标准 |
|---|---|
| 环境隔离 | 画出 cluster 内 6 Namespace 及用途 |
| ConfigMap / Secret | 各举 3 个 demo-mall 字段示例并说明归属 |
| 编写 env-matrix | 至少 8 行 dev/staging/prod 差异 |
| 资源配额 | 解释 ResourceQuota、LimitRange 作用 |
| 配置晋升 | 填写 staging→prod 晋升检查表 |
| 界面操作 | 在小紫 应用部署 挂载 ConfigMap 并滚动验证 |
2.3 为什么要分环境
| 环境 | 用途 | 数据 | 对外暴露 | 变更频率 |
|---|---|---|---|---|
| dev | 开发联调 | 可伪造、可清库 | 内网 / VPN | 随时 |
| staging | 预发布验证 | 脱敏生产快照 | 内网 + 白名单 | 每日多次 |
| prod | 正式服务 | 真实业务数据 | Ingress + HTTPS | 变更窗口 |
三原则
- staging 拓扑与 prod 同构
- 配置 外置,镜像 tag 唯一差异来源是「版本」而非「环境名写死在 Dockerfile」
- Secret 永不进 Git(Sealed Secrets / 小紫 Secret 管理,见 ch12)
2.4 逐步跟练 · 第一步:Namespace 与配额(约 30 分钟)
目标拓扑:
cluster
├── dev-app / dev-middleware
├── staging-app / staging-middleware
├── prod-app / prod-middleware
└── devops # CI、Registry、监控
步骤 1 — 创建 Namespace
- 集群管理 → Namespace → 创建
- 依次创建:
dev-app、dev-middleware、staging-app、staging-middleware、prod-app、prod-middleware(已存在则跳过)
你应该看到:6 个 Active Namespace;labels 建议加 env=dev|staging|prod。
步骤 2 — 为 staging-app 配置 ResourceQuota
在 应用部署 → YAML 导入 或 kubectl 应用以下示例:
# 限制 staging 资源总量,防止压测挤爆集群
apiVersion: v1
kind: ResourceQuota
metadata:
name: staging-quota
namespace: staging-app
spec:
hard:
requests.cpu: "8"
requests.memory: 16Gi
pods: "30"
含义说明:
| 字段 | 作用 |
|---|---|
requests.cpu | staging 所有 Pod CPU request 之和上限 |
requests.memory | 内存 request 上限 |
pods | Pod 总数上限 |
你应该看到:集群管理 → ResourceQuota 显示 staging-quota,Used/Hard 列有数值。
步骤 3 — prod-app LimitRange(默认 requests)
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: prod-app
spec:
limits:
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
type: Container
你应该看到:未写 resources 的新 Pod 自动带上 defaultRequest,避免「裸 Pod」挤占节点。
环境规模对照:
| 项 | dev | staging | prod |
|---|---|---|---|
| 副本数 | 1 | 2 | ≥3 |
| CPU request | 100m | 250m | 500m |
| 日志级别 | DEBUG | INFO | WARN |
| 调试端口 | 可开 | 关闭 | 关闭 |
| PDB | 无 | minAvailable 1 | minAvailable 2 |
2.5 逐步跟练 · 第二步:ConfigMap 与 Secret(约 40 分钟)
步骤 1 — 创建 staging ConfigMap
应用部署 → 配置 → ConfigMap → 创建,Namespace staging-app,名称 demo-api-config:
apiVersion: v1
kind: ConfigMap
metadata:
name: demo-api-config
namespace: staging-app
data:
LOG_LEVEL: "INFO"
DB_HOST: "mysql.staging-middleware.svc.cluster.local"
REDIS_URL: "redis://redis.staging-middleware.svc:6379/1"
FEATURE_NEW_CHECKOUT: "true"
HTTP_PORT: "8080"
步骤 2 — 创建 Secret(界面或 YAML)
名称 demo-api-secrets(密码用占位符,生产由管理员注入):
apiVersion: v1
kind: Secret