2. Resource Model 基础:Kubernetes Resource Model (KRM) 核心概念、API 资源与自定义资源
在深入集群升级与租户隔离治理之前,必须建立对 Kubernetes Resource Model (KRM) 的共识。KRM 是 Kubernetes 声明式运维的基石,它定义了“一切皆资源”的哲学,并规范了资源的描述、存储、访问与生命周期管理。本章将拆解 KRM 的核心概念,区分 API 资源与自定义资源,为后续的蓝图治理奠定理论基础。
2.1 KRM 核心概念:声明式资源模型
Kubernetes Resource Model 并非一个具体的软件库,而是一套架构规范。其核心思想是:用户通过声明期望的“终态”来管理集群,而非通过执行一系列命令。KRM 将集群中的每一个可管理实体(Pod、Service、Namespace、Node 等)都抽象为“资源”,并通过统一的 API 进行交互。
KRM 的三大支柱如下表所示:
| 支柱 | 说明 | 在租户隔离中的体现 |
|---|---|---|
| 声明式 API | 用户提交 YAML/JSON 清单(Manifest),描述资源的期望状态。控制器(Controller)持续对比实际状态与期望状态,并执行调和(Reconcile)操作。 | 租户通过提交 ResourceQuota、NetworkPolicy 等清单声明隔离边界,控制器自动保障。 |
| 统一资源模型 | 所有资源遵循相同的元数据结构(apiVersion、kind、metadata、spec、status)。 | 无论是原生 Namespace 还是自定义 Tenant 资源,都使用同一套 CRUD 操作和存储机制(etcd)。 |
| 控制器模式 | 资源本身只存储数据,业务逻辑由控制器执行。控制器通过 Informer 监听资源变化,驱动系统达到期望状态。 | 租户隔离控制器监听 Tenant 资源变化,自动创建 Namespace、绑定 RBAC、配置网络策略。 |
2.2 API 资源与自定义资源(CRD)
KRM 将资源分为两大类:内置 API 资源(Built-in Resources)和自定义资源(Custom Resources)。理解两者的区别与协作,是进行 Resource Model 治理的前提。
2.2.1 内置 API 资源
内置资源由 Kubernetes 核心组件提供,是集群的“原生公民”。它们通常分为不同的 API 组(Group),例如:
- 核心组(Core Group): v1,包含 Pod、Service、Namespace、Node、ConfigMap、Secret 等最基础的资源。
- Apps 组: apps/v1,包含 Deployment、StatefulSet、DaemonSet、ReplicaSet 等工作负载资源。
- Networking 组: networking.k8s.io/v1,包含 NetworkPolicy、Ingress 等网络资源。
- RBAC 组: rbac.authorization.k8s.io/v1,包含 Role、ClusterRole、RoleBinding、ClusterRoleBinding。
2.2.2 自定义资源(CRD)
当内置资源无法满足特定业务需求时,可以通过 CustomResourceDefinition (CRD) 扩展 Kubernetes API。CRD 允许用户定义全新的资源类型,并像操作原生资源一样使用 kubectl 或 API 进行管理。
CRD 在租户隔离蓝图中的典型应用:
- 定义租户抽象: 创建
Tenant或Project资源,作为租户的顶层入口,聚合 Namespace、配额、策略等。 - 定义隔离策略模板: 创建
NetworkIsolationPolicy或QuotaTemplate资源,实现策略的标准化与复用。 - 定义升级策略: 创建
UpgradePlan资源,声明租户级别的升级顺序与灰度策略。
2.3 资源模型结构:从 API 到 etcd
一个完整的 KRM 资源从用户提交到最终存储,经历了清晰的层级转换。下图展示了这一核心流程:
2.4 资源版本与 API 组
KRM 通过 API 组(Group)、版本(Version) 和 资源(Resource) 三级结构来组织所有资源。这是理解集群升级兼容性的关键。
- API 组: 逻辑上相关的资源集合,如
apps、batch、networking.k8s.io。空字符串表示核心组。 - 版本: 同一资源在不同阶段的演进标识,如
v1、v1beta1、v1alpha1。版本级别越高,稳定性越强。alpha:默认关闭,可能包含缺陷,不保证向后兼容。beta:默认开启,经过充分测试,但可能仍有小范围变更。stable (v1):长期支持,保证向后兼容。
- 资源: 具体的资源类型,如
deployments、pods、tenants。
extensions/v1beta1 下的 Ingress 在 v1.22 中被彻底移除。如果租户的 Resource Model 中仍引用已废弃的 API 版本,升级后将导致资源无法被识别,引发服务中断。Resource Model 治理必须包含 API 版本兼容性扫描。
2.5 资源规范(Spec)与状态(Status)
KRM 强制将资源的“期望”与“实际”分离,这是声明式模型的核心设计模式。
| 字段 | 位置 | 写入者 | 用途 | 租户隔离示例 |
|---|---|---|---|---|
| spec | 用户提交的 Manifest | 用户 / 运维人员 | 定义资源的期望状态 | Tenant.spec.namespaces: ["team-a", "team-b"] |
| status | 集群内部 | 对应的 Controller | 反映资源的实际状态 | Tenant.status.phase: "Ready" |
这种分离带来了两大治理优势:
- 可审计性: 通过对比 spec 与 status,可以精确判断资源是否达到预期,便于升级前的合规检查。
- 自动化修复: 当实际状态偏离期望状态(如升级导致 Pod 被驱逐),Controller 会自动进行调和,恢复隔离策略。