2. K8s 核心概念回顾:Namespace、Deployment、Service、Ingress、ConfigMap、Secret

在深入蓝绿发布与灾备 RPO 调优之前,必须对齐 Kubernetes 的六个核心原语。这些对象构成了应用部署、网络暴露、配置注入与安全凭证管理的全部基础。本章以“蓝绿发布”为视角,重新梳理每个概念在生产中的实际角色。

2.1 Namespace:多环境隔离的边界

Namespace 是 Kubernetes 集群内的虚拟分区,用于将资源逻辑隔离。在蓝绿发布场景中,通常使用 两个独立的 Namespace(如 prod-blue 和 prod-green)来承载不同版本的应用实例,从而实现流量切换与快速回滚。

生产建议: 不要将蓝绿两套环境放在同一个 Namespace 中。独立的 Namespace 可以避免资源命名冲突,并允许独立的 NetworkPolicy 和 ResourceQuota 控制。
特性 说明 蓝绿发布中的用途
资源隔离 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
关键点: 蓝绿发布中,两个 Deployment 的 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
注意: 修改 Service 的 selector 后,连接池中的存量连接不会立即断开,需要配合 preStop 钩子或优雅退出机制,才能实现零中断切换。
蓝绿发布流量切换流程(Service Selector 驱动) 用户流量 app-service Deployment (blue) version: blue Deployment (green) version: green 切换操作:修改 Service selector 中 version 标签从 blue 变为 green,流量即刻导向绿色版本

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
生产建议: 使用 Ingress 的 canary 注解可以实现 10% → 50% → 100% 的渐进式蓝绿切换,大幅降低全量切换风险。但需注意,Ingress Controller 必须支持 canary 功能(如 Nginx Ingress、Traefik)。

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"
最佳实践: 为每个蓝绿版本创建独立的 ConfigMap,命名包含版本标识(如 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==
安全提醒: Secret 的 Base64 编码并非加密,任何有权限访问 Namespace 的用户都可以解码。生产环境应启用 etcd 加密或使用外部密钥管理服务(如 HashiCorp Vault、AWS Secrets Manager)。
K8s 核心概念在蓝绿发布中的协作关系 Namespace: prod-blue Deployment (blue) replicas: 5 | image: v1.0 Deployment (green) replicas: 5 | image: v2.0 Service selector: version=blue Ingress ConfigMap (blue) ConfigMap (green) Secret (blue) Secret (green) 每个核心对象在蓝绿发布中都有明确的职责边界,协作关系清晰可追溯

2.7 核心概念在蓝绿发布中的职责矩阵

下表总结了六个核心对象在蓝绿发布全生命周期中的具体职责,帮助你在后续章节中快速定位每个组件的作用。

K8s 对象 版本隔离 流量切换 配置管理 安全凭证 外部暴露
Namespace ✅ 物理隔离 ❌ ❌ ❌ ❌
Deployment ✅ 独立副本集 ❌ ✅ 引用 ConfigMap/Secret ✅ 引用 Secret ❌
Service ❌ ✅ Selector 切换 ❌ ❌ ✅ ClusterIP/NodePort
Ingress ❌ ✅ 权重/Header 路由 ❌ ✅ TLS 证书 ✅ 七层路由
ConfigMap ✅ 版本独立 ❌ ✅ 非敏感配置 ❌ ❌
Secret ✅ 版本独立 ❌ ❌ ✅ 敏感凭证 ❌
回顾要点: 蓝绿发布的核心思想是“两套环境 + 一个切换点”。Namespace 和 Deployment 负责环境隔离,Service 和 Ingress 负责流量切换,ConfigMap 和 Secret 负责配置与凭证的版本化管理。理解这六个对象的协作关系,是后续 RPO 调优与灾备验证的基础。