2. Kubernetes 基础回顾:Pod、Deployment、Service、Ingress 核心资源,命名空间与标签选择器在发布中的作用

在深入 Velero 蓝绿发布与灾备切换之前,必须重新校准对 Kubernetes 核心资源模型的理解。本章聚焦于与发布流程直接相关的四个资源(Pod、Deployment、Service、Ingress),以及两个关键逻辑隔离机制(命名空间与标签选择器)。这些概念是后续构建回滚策略和故障切换脚本的基石。

2.1 核心工作负载与网络资源

2.1.1 Pod:最小调度单元

Pod 是 Kubernetes 中可创建和部署的最小计算单元。一个 Pod 可以包含一个或多个容器(通常为一个主容器加若干 sidecar)。在发布场景中,Pod 是蓝绿版本流量的最终承载者。

  • 生命周期短暂:Pod 本身不提供自愈能力,其创建、销毁、重建由上层控制器(如 Deployment)管理。
  • IP 不固定:Pod 重启或迁移后 IP 会变化,因此不能直接通过 Pod IP 对外暴露服务。
  • 就绪探针(Readiness Probe):决定 Pod 是否加入 Service 的端点列表,是蓝绿发布中流量切换的关键控制点。

2.1.2 Deployment:声明式更新与回滚引擎

Deployment 是 Kubernetes 中最常用的无状态工作负载控制器。它通过 ReplicaSet 管理 Pod 的副本数,并提供声明式更新、滚动更新和回滚能力。

特性 说明 发布中的用途
滚动更新(RollingUpdate) 逐步替换旧版本 Pod,支持 maxSurge 和 maxUnavailable 参数 灰度发布、金丝雀发布
回滚(Rollback) 通过 revisionHistoryLimit 保留历史版本,使用 kubectl rollout undo 快速回退 快速恢复至上一稳定版本
版本记录 每次更新 spec.template 都会生成新的 ReplicaSet 版本 配合 Velero 做版本级灾备恢复
关键参数: 在蓝绿发布中,Deployment 的 spec.replicas 和 spec.strategy.rollingUpdate.maxSurge 决定了蓝绿两套环境同时运行的 Pod 数量上限,直接影响资源预留和成本。

2.1.3 Service:稳定的流量入口与负载均衡

Service 为一组功能相同的 Pod 提供稳定的虚拟 IP(ClusterIP)和 DNS 名称。它通过标签选择器(Selector)动态关联后端 Pod。

  • ClusterIP:集群内部访问,用于微服务间调用。
  • NodePort:在每个节点上开放端口,外部可通过节点 IP 访问。
  • LoadBalancer:对接云厂商负载均衡器,提供公网入口。

在蓝绿发布中,Service 的 Selector 是流量切换的“开关”。通过修改 Selector 中的标签值(如 version: blue → version: green),可以实现瞬间流量切换。

2.1.4 Ingress:七层路由与域名管理

Ingress 提供基于 HTTP/HTTPS 的七层路由能力,将外部请求转发到集群内部的 Service。它通常需要配合 Ingress Controller(如 Nginx Ingress、Traefik)使用。

Ingress 功能 发布场景应用
基于 Host/Path 路由 将不同域名或路径指向不同版本的 Service
权重路由(部分 Controller 支持) 实现金丝雀发布,按百分比分配流量到蓝绿版本
TLS 终止 统一管理证书,避免在每个 Service 层重复配置
实战提示: 在蓝绿切换时,如果使用 Ingress 权重路由,需要确保 Ingress Controller 支持 nginx.ingress.kubernetes.io/canary 注解。如果使用 Service Selector 切换,则 Ingress 配置无需变更,只需更新 Service 的标签选择器即可。
Kubernetes 核心资源关系与流量路径 外部用户 Ingress Service Deployment Pod 副本集 version: blue app: myapp 标签选择器 app=myapp 流量路径说明: 1. 外部请求 → Ingress(域名/路径路由)→ Service(四层负载均衡)→ Pod 2. Service 通过标签选择器动态关联 Pod,无需关心 Pod IP 变化 3. Deployment 管理 Pod 的版本和副本数,支持滚动更新和回滚

2.2 命名空间:多环境隔离与资源边界

命名空间(Namespace)是 Kubernetes 中实现多租户隔离的逻辑分区。在发布流程中,命名空间是蓝绿环境隔离的第一道防线。

隔离维度 说明 发布中的典型用法
资源命名 不同命名空间下允许同名资源共存 同一套 YAML 部署到不同命名空间实现环境隔离
网络策略 通过 NetworkPolicy 控制跨命名空间通信 蓝绿环境之间默认隔离,仅允许必要的服务调用
资源配额 通过 ResourceQuota 限制命名空间的总资源消耗 为蓝绿环境分别设置资源上限,避免互相抢占
RBAC 权限 不同团队或角色只能操作特定命名空间 发布操作员仅拥有目标命名空间的写权限
常见误区: 不要将命名空间作为蓝绿版本的唯一隔离手段。命名空间隔离的是资源名称和权限,但 Service 跨命名空间调用默认是允许的。如果需要严格的网络隔离,必须配合 NetworkPolicy 使用。

2.3 标签选择器:发布流程的“粘合剂”

标签(Label)是 Kubernetes 中附加到资源上的键值对,标签选择器(Selector)则用于筛选具有特定标签的资源。在发布流程中,标签选择器是连接 Service、Deployment、Pod 以及监控系统的核心机制。

2.3.1 标签设计原则

  • 标识性标签:app、version、environment 用于区分应用、版本和环境。
  • 发布专用标签:release: stable、release: canary 用于蓝绿或金丝雀发布。
  • 避免频繁变更:标签的增删改会导致 Service 端点重新计算,可能引起短暂流量中断。

2.3.2 蓝绿发布中的标签切换

以下是一个典型的蓝绿发布标签切换流程:

  1. 初始状态:Service Selector 为 app=myapp, version=blue,所有流量进入蓝色版本。
  2. 部署绿色版本:Deployment 创建 Pod,标签为 app=myapp, version=green。
  3. 验证绿色版本:通过内部 Service 或临时 Ingress 规则验证。
  4. 切换流量:修改 Service Selector 为 app=myapp, version=green,流量瞬间切换到绿色版本。
  5. 回滚(如需):将 Selector 改回 version=blue,流量切回蓝色版本。
关键命令示例:
# 查看当前 Service 的标签选择器
kubectl get svc myapp-service -o jsonpath='{.spec.selector}'

# 修改 Service 的标签选择器(切换流量到绿色版本)
kubectl patch svc myapp-service -p '{"spec":{"selector":{"app":"myapp","version":"green"}}}'

# 回滚到蓝色版本
kubectl patch svc myapp-service -p '{"spec":{"selector":{"app":"myapp","version":"blue"}}}'
标签选择器驱动的蓝绿流量切换 蓝色版本(稳定) Pod 标签: app=myapp version=blue 绿色版本(新) Pod 标签: app=myapp version=green Service 标签选择器: app=myapp, version=green 已断开 已连接 切换流程: 1. 初始状态:Service 选择器为 version=blue,流量全部进入蓝色版本 2. 部署绿色版本后,通过内部验证确认新版本正常 3. 修改 Service 选择器为 version=green,流量瞬间切换到绿色版本 4. 如需回滚,将选择器改回 version=blue,流量切回蓝色版本

2.4 本章小结

  • Pod 是发布的最小单元,其就绪探针决定流量是否接入。
  • Deployment 提供声明式更新和回滚能力,是版本管理的核心。
  • Service 通过标签选择器实现流量切换,是蓝绿发布的“开关”。
  • Ingress 提供七层路由,支持更精细的流量分发策略。
  • 命名空间 提供环境隔离,但网络隔离需额外配置 NetworkPolicy。
  • 标签选择器 是连接所有资源的“粘合剂”,其设计直接影响发布流程的灵活性和可靠性。
下一阶段准备: 在掌握这些基础资源后,第 3 章将进入 Velero 的核心能力——如何利用 Velero 对上述资源进行备份、恢复和迁移,为蓝绿发布提供灾备保障。