2. K8s 核心概念回顾:Namespace、Deployment、Service、Ingress、ConfigMap、Secret
在深入蓝绿发布与灾备 RPO 调优之前,必须对齐 Kubernetes 的六个核心原语。这些对象构成了应用部署、网络暴露、配置注入与安全凭证管理的全部基础。本章以“蓝绿发布”为视角,重新梳理每个概念在生产中的实际角色。
2.1 Namespace:多环境隔离的边界
Namespace 是 Kubernetes 集群内的虚拟分区,用于将资源逻辑隔离。在蓝绿发布场景中,通常使用 两个独立的 Namespace(如 prod-blue 和 prod-green)来承载不同版本的应用实例,从而实现流量切换与快速回滚。
| 特性 | 说明 | 蓝绿发布中的用途 |
|---|---|---|
| 资源隔离 | Pod、Service、Deployment 等资源按 Namespace 分组 | 蓝/绿两套环境互不干扰 |
| 命名作用域 | 同一 Namespace 内资源名必须唯一 | 避免蓝绿版本资源名冲突 |
| 配额管理 | 可为每个 Namespace 设置 CPU/内存上限 | 防止蓝绿同时运行时资源争抢 |
| 网络策略 | 可针对 Namespace 级别控制入站/出站流量 | 限制蓝绿环境间的非必要通信 |
2.2 Deployment:声明式应用管理
Deployment 是 Kubernetes 中最常用的工作负载控制器,负责管理 ReplicaSet 并实现 Pod 的声明式更新与回滚。在蓝绿发布中,Deployment 的 spec.replicas、spec.template 和 spec.strategy 字段直接决定了版本切换的粒度与速度。
- Replicas: 定义目标 Pod 副本数,蓝绿两套 Deployment 各自维护独立的副本数。
- Template: 包含 Pod 模板(镜像、环境变量、挂载卷等),蓝绿版本通过不同的镜像标签区分。
- Strategy: 更新策略,蓝绿发布通常使用
Recreate或手动控制,而非默认的RollingUpdate。
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-blue
namespace: prod-blue
spec:
replicas: 5
selector:
matchLabels:
app: myapp
version: blue
template:
metadata:
labels:
app: myapp
version: blue
spec:
containers:
- name: myapp
image: myregistry/app:v1.0.0
ports:
- containerPort: 8080
matchLabels 必须不同(通常通过 version 标签区分),否则 Service 的 Selector 会同时选中两个版本的 Pod,导致流量混乱。
2.3 Service:稳定的网络入口
Service 为一组 Pod 提供稳定的虚拟 IP 和 DNS 名称,实现负载均衡与服务发现。在蓝绿发布中,Service 的 selector 是流量切换的核心开关——通过修改 selector 中的标签,可以将流量从蓝色版本瞬间切换到绿色版本。
apiVersion: v1
kind: Service
metadata:
name: app-service
namespace: prod-blue
spec:
selector:
app: myapp
version: blue # 切换时改为 green
ports:
- protocol: TCP
port: 80
targetPort: 8080
preStop 钩子或优雅退出机制,才能实现零中断切换。
2.4 Ingress:七层路由与域名管理
Ingress 提供基于 HTTP/HTTPS 的七层路由能力,将外部请求按域名或路径分发到集群内部的 Service。在蓝绿发布中,Ingress 可以配合 流量权重 或 Header 路由 实现灰度验证,而不仅仅是全量切换。
| 路由方式 | 适用场景 | 蓝绿发布中的典型用法 |
|---|---|---|
| 基于域名 | 不同环境(如 dev、staging、prod) | blue.app.com / green.app.com |
| 基于路径 | 同一域名下的不同服务 | /blue /green |
| 基于 Header | 灰度发布、A/B 测试 | Header: X-Canary: true → 绿色版本 |
| 基于权重 | 渐进式流量迁移 | Ingress Controller 原生支持(如 Nginx Ingress) |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
namespace: prod-blue
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service-blue
port:
number: 80
2.5 ConfigMap:非敏感配置注入
ConfigMap 用于将应用配置与容器镜像解耦,支持环境变量、命令行参数、配置文件挂载三种注入方式。在蓝绿发布中,不同版本可能依赖不同的配置参数(如数据库连接串、功能开关),通过 ConfigMap 可以实现版本级配置隔离。
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-blue
namespace: prod-blue
data:
APP_ENV: "blue"
LOG_LEVEL: "debug"
FEATURE_FLAG_NEW_PAYMENT: "false"
app-config-blue、app-config-green)。切换版本时,Deployment 引用的 ConfigMap 名称也随之切换,确保配置与版本一致。
2.6 Secret:敏感凭证管理
Secret 与 ConfigMap 类似,但用于存储敏感数据(密码、、证书),数据以 Base64 编码存储,并支持加密(如 KMS、SOPS)。在蓝绿发布中,Secret 的管理需要特别注意:不要将不同版本的凭证混用,避免因凭证泄露导致的安全事故。
| 类型 | 用途 | 蓝绿发布注意事项 |
|---|---|---|
| Opaque | 任意键值对(密码、) | 每个版本使用独立的 Secret,避免凭证交叉 |
| kubernetes.io/tls | TLS 证书 | Ingress 引用的证书需与域名匹配,切换时注意证书有效期 |
| kubernetes.io/dockerconfigjson | 镜像仓库认证 | 确保两个版本都能拉取镜像,避免因凭证过期导致部署失败 |
apiVersion: v1
kind: Secret
metadata:
name: app-secret-blue
namespace: prod-blue
type: Opaque
data:
DB_PASSWORD: c3VwZXJzZWNyZXQ= # base64 编码
API_: dG9rZW4tYmx1ZQ==
2.7 核心概念在蓝绿发布中的职责矩阵
下表总结了六个核心对象在蓝绿发布全生命周期中的具体职责,帮助你在后续章节中快速定位每个组件的作用。
| K8s 对象 | 版本隔离 | 流量切换 | 配置管理 | 安全凭证 | 外部暴露 |
|---|---|---|---|---|---|
| Namespace | ✅ 物理隔离 | ❌ | ❌ | ❌ | ❌ |
| Deployment | ✅ 独立副本集 | ❌ | ✅ 引用 ConfigMap/Secret | ✅ 引用 Secret | ❌ |
| Service | ❌ | ✅ Selector 切换 | ❌ | ❌ | ✅ ClusterIP/NodePort |
| Ingress | ❌ | ✅ 权重/Header 路由 | ❌ | ✅ TLS 证书 | ✅ 七层路由 |
| ConfigMap | ✅ 版本独立 | ❌ | ✅ 非敏感配置 | ❌ | ❌ |
| Secret | ✅ 版本独立 | ❌ | ❌ | ✅ 敏感凭证 | ❌ |