2. K8s核心概念回顾:Deployment、Service、Ingress、Namespace在发布中的作用

在深入蓝绿发布与灾备自动化故障切换之前,必须厘清 Kubernetes 中四个核心资源在发布流程中的职责。它们共同构成了流量接入、副本管理、环境隔离与路由控制的基础设施。

2.1 四类资源的职责矩阵

资源 API 版本(稳定) 核心职责 发布中的关键作用
Deployment apps/v1 声明式副本管理、滚动更新、回滚 控制 Pod 版本切换,支撑蓝/绿两套副本集并行运行
Service v1 提供稳定的 ClusterIP/DNS,负载均衡到后端 Pod 通过 Label Selector 将流量导向蓝或绿版本,实现流量切换
Ingress networking.k8s.io/v1 七层 HTTP/HTTPS 路由、域名分发、TLS 终止 按权重或 Header 将外部流量切分到不同 Service,支持灰度
Namespace v1 逻辑隔离、资源配额、RBAC 作用域 隔离蓝绿环境或灾备集群的命名空间,避免资源冲突

2.2 Deployment:版本管理的执行者

Deployment 是发布动作的直接载体。在蓝绿发布中,我们同时维护两个 Deployment:app-blue 和 app-green,各自携带不同的标签(如 version: blue 与 version: green)。

  • 副本集(ReplicaSet):每个 Deployment 对应一个 ReplicaSet,控制 Pod 数量与镜像版本。
  • 更新策略:蓝绿发布不使用默认的 RollingUpdate,而是手动切换 Service 的 Selector。
  • 回滚能力:保留历史版本记录,通过 kubectl rollout undo 快速恢复。
关键命令示例: 创建蓝版本 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-blue
  labels:
    app: myapp
    version: blue
spec:
  replicas: 5
  selector:
    matchLabels:
      app: myapp
      version: blue
  template:
    metadata:
      labels:
        app: myapp
        version: blue
    spec:
      containers:
      - name: app
        image: myapp:1.0.0
        ports:
        - containerPort: 8080

2.3 Service:流量切换的枢纽

Service 是蓝绿发布中流量切换的核心操作点。通过修改 Service 的 spec.selector,可以将流量瞬间从蓝版本 Pod 全部导向绿版本 Pod。

  • ClusterIP 模式:内部服务间调用通过 Service DNS 完成切换。
  • NodePort / LoadBalancer:外部流量入口,切换后即时生效。
  • 无感切换:由于 Service 是四层转发,Pod IP 变化对客户端透明。
实践要点: 蓝绿发布时,Service 的 selector 只保留一个版本标签。切换前确保绿版本 Pod 全部 Ready,再执行 kubectl patch svc myapp-service -p '{"spec":{"selector":{"version":"green"}}}'。

2.4 Ingress:七层精细化路由

Ingress 在蓝绿发布中承担更灵活的流量分配能力,尤其适用于金丝雀发布或按比例灰度场景。

  • 权重路由:通过多个 Ingress 规则或 Service 权重,将 10% 流量导向绿版本。
  • Header 路由:根据请求 Header(如 X-Canary: true)将特定用户导向新版本。
  • 域名隔离:蓝绿版本分别绑定不同域名,用于预发布验证。
注意: Ingress 控制器(如 Nginx Ingress、Traefik)需要额外配置支持权重切分。原生 Ingress 资源不支持百分比路由,需使用 Annotation 或 CRD 扩展。

2.5 Namespace:环境隔离的边界

Namespace 在灾备与多环境发布中提供逻辑隔离。典型用法包括:

  • 环境隔离:prod-blue、prod-green 两个 Namespace 分别部署完整蓝绿栈。
  • 灾备隔离:主集群与灾备集群使用不同 Namespace 前缀,避免资源名冲突。
  • 资源配额:通过 ResourceQuota 限制每个 Namespace 的 CPU/内存,防止灾备切换时资源争抢。

2.6 四者协作关系图

下图展示了蓝绿发布中 Deployment、Service、Ingress、Namespace 的协作流程:

蓝绿发布核心资源协作关系 Namespace: production Ingress Service (myapp-svc) Deployment: app-blue Deployment: app-green Pod (v1.0) Pod (v1.0) Pod (v2.0) Pod (v2.0) 七层路由 selector: version=blue selector: version=green 流量切换点 修改 Service selector 即可

2.7 发布切换流程总结

  1. 部署绿版本:在相同 Namespace 下创建 app-green Deployment,镜像为 v2.0,副本数对齐蓝版本。
  2. 验证就绪:确认绿版本所有 Pod 通过 Readiness Probe,Service 后端端点正常。
  3. 切换 Service:修改 Service 的 selector 从 version: blue 改为 version: green,流量瞬间切换。
  4. Ingress 配合:如需灰度,Ingress 按权重或 Header 将部分流量导向绿 Service。
  5. 观察与回滚:监控错误率与延迟,异常时立即将 Service selector 切回蓝版本。
  6. 清理旧版本:确认稳定后,删除蓝版本 Deployment 释放资源。
核心原则: Deployment 负责“运行什么”,Service 负责“流量去哪”,Ingress 负责“如何接入”,Namespace 负责“在哪运行”。四者解耦,使蓝绿发布成为可编程的流量切换操作。