Kubernetes多租户集群滚动升级与故障恢复 - 第2节

2.1 资源模型的核心概念

资源模型(Resource Model)是云原生平台对基础设施、中间件、应用组件进行统一抽象与编排的元数据框架。在租户隔离蓝图中,资源模型定义了“有什么资源”“资源长什么样”“资源之间如何连接”三个基本问题,是滚动升级故障排查的语义基础。

2.1.1 资源类型(Resource Type)

资源类型是对一类具有相同属性、行为和生命周期管理方式的资源所做的分类定义。每个资源类型包含:

  • 类型标识:全局唯一的类型名称,如 TenantNamespace、NetworkPolicy、ServiceMesh。
  • 属性模式:描述该类型资源必须或可选包含的字段,如 tenantId、quota.cpu、quota.memory。
  • 生命周期钩子:创建、更新、删除、健康检查等阶段触发的控制器行为。
  • 版本约束:资源类型的 API 版本与兼容性规则。
资源类型 典型属性 生命周期钩子 版本约束
TenantNamespace tenantId, namespaceName, quota 创建时自动绑定 RBAC v1, v2(新增隔离策略)
NetworkPolicy policyName, ingressRules, egressRules 更新时触发流量重算 v1
ServiceMesh meshId, sidecarVersion, mtlsMode 升级时执行金丝雀注入 v1, v2(sidecar 协议变更)
QuotaTemplate cpuLimit, memoryLimit, storageLimit 更新时重新分配租户额度 v1
故障排查要点:滚动升级过程中,如果资源类型的版本约束未在蓝图声明中同步更新,控制器可能因 schema 校验失败而拒绝创建新实例,导致升级卡在“等待就绪”状态。

2.1.2 资源实例(Resource Instance)

资源实例是资源类型在运行时环境中的具体化对象。每个实例拥有唯一的标识符(UID)、当前状态(Status)、期望状态(Spec)以及元数据(Metadata)。实例的状态机通常包含以下阶段:

  1. Pending:实例已提交,但尚未被控制器处理。
  2. Provisioning:控制器正在创建或更新底层基础设施。
  3. Ready:实例已就绪,对外提供服务。
  4. Upgrading:实例正在执行滚动升级,部分副本处于过渡状态。
  5. Degraded:实例部分功能异常,但未完全失效。
  6. Failed:实例无法恢复,需要人工介入。
# 资源实例的 YAML 表示示例(简化)
apiVersion: blueprint.tenant.io/v1
kind: TenantNamespace
metadata:
  name: tenant-alpha-ns
  uid: a1b2c3d4-e5f6-7890-abcd-ef1234567890
spec:
  tenantId: "alpha"
  quota:
    cpu: "4"
    memory: "16Gi"
status:
  phase: Ready
  conditions:
    - type: Ready
      status: "True"
      lastTransitionTime: "2025-03-10T08:00:00Z"
升级故障场景:当资源实例处于 Upgrading 状态时,如果依赖的下游实例尚未完成升级,会导致级联等待超时。排查时应优先检查实例的 status.conditions 中是否包含 DependencyBlocked 类型。

2.2 资源关系图(Resource Relationship Graph)

资源关系图将资源类型与资源实例组织为有向无环图(DAG),描述资源之间的依赖、组合、引用和约束关系。在租户隔离蓝图中,关系图是滚动升级顺序编排的核心依据。

2.2.1 关系类型定义

关系类型 语义 示例
依赖(DependsOn) 源资源必须等待目标资源就绪后才能操作 ServiceMesh 依赖 TenantNamespace
组合(ComposedOf) 源资源由多个目标资源组合而成 TenantBlueprint 组合 NetworkPolicy + QuotaTemplate
引用(References) 源资源通过标识符引用目标资源 NetworkPolicy 引用 TenantNamespace 的 namespaceName
约束(Constrains) 源资源对目标资源的属性施加限制 QuotaTemplate 约束 TenantNamespace 的 quota 上限

2.2.2 资源关系图结构

下图展示了一个典型租户隔离蓝图中的资源关系图。节点代表资源类型,有向边代表依赖与组合关系。滚动升级时,控制器按照拓扑排序从底层依赖向上层逐层推进。

租户隔离蓝图资源关系图 TenantNamespace NetworkPolicy QuotaTemplate ServiceMesh TenantBlueprint 运行时实例 (Running) DependsOn Constrains DependsOn ComposedOf ComposedOf ComposedOf References 核心资源 策略资源 模板资源 网格资源 编排资源 运行时实例

2.2.3 关系图在滚动升级中的作用

资源关系图驱动滚动升级的以下关键决策:

  • 升级顺序:控制器对 DAG 进行拓扑排序,确保无依赖的资源先升级,有依赖的资源后升级。
  • 并发控制:同一层级的无依赖资源可以并行升级,提升效率;跨层级的资源必须串行等待。
  • 故障隔离:当某个资源实例升级失败时,关系图可快速定位受影响的下游资源,避免故障扩散。
  • 回滚范围:回滚时,控制器根据关系图反向传播,确保所有依赖该资源的实例也一并回滚。
排查案例:在一次租户隔离蓝图滚动升级中,ServiceMesh 升级后 TenantBlueprint 一直处于 Upgrading 状态。通过分析资源关系图发现,ServiceMesh 与 TenantBlueprint 之间存在 ComposedOf 关系,但 ServiceMesh 的新版本 sidecar 协议与 NetworkPolicy 的 ingress 规则不兼容,导致组合校验失败。修复 NetworkPolicy 的规则后,升级继续完成。

2.3 资源模型与租户隔离的映射

在租户隔离蓝图中,资源模型通过以下机制实现多租户隔离:

隔离维度 资源模型映射 升级影响
命名空间隔离 每个租户对应一个 TenantNamespace 实例 升级时需保持命名空间标签不变,避免网络策略失效
网络隔离 NetworkPolicy 实例绑定到租户命名空间 升级期间需保留最小权限规则,防止流量中断
配额隔离 QuotaTemplate 实例约束租户资源上限 升级时配额模板变更可能导致正在运行的 Pod 被驱逐
服务网格隔离 ServiceMesh 实例为租户提供独立 sidecar 代理 升级 sidecar 版本需确保与网格控制面兼容