3. 资源模型基础:Kubernetes资源模型、CRD、GVK、GVR、资源层次结构
Kubernetes 资源模型是整个控制平面与 GitOps 检测体系的基石。理解资源模型,意味着理解“一切皆对象”的声明式 API 如何被定义、寻址、存储与组合。本章从核心概念出发,逐步拆解 GVK、GVR、CRD 以及资源之间的层次关系。
3.1 Kubernetes 资源模型核心概念
Kubernetes 资源模型(KRM)是一套统一的声明式 API 规范。每个资源都是一个 JSON/YAML 对象,包含以下核心字段:
- apiVersion:标识资源所属的 API 组和版本,例如
apps/v1。 - kind:资源类型名称,例如
Deployment。 - metadata:元数据,包含 name、namespace、labels、annotations 等。
- spec:期望状态(Desired State)。
- status:实际状态(Actual State),由控制器更新。
关键原则: 用户通过 spec 声明期望状态,控制器通过 status 反馈实际状态,控制平面持续调和(Reconcile)两者差异。这是 GitOps 检测的核心闭环。
3.2 GVK 与 GVR:资源的逻辑标识与物理寻址
Kubernetes 使用两套标识系统来定位资源:GVK(Group、Version、Kind)用于逻辑类型识别,GVR(Group、Version、Resource)用于 RESTful API 路由。
| 概念 | 全称 | 示例 | 用途 |
|---|---|---|---|
| GVK | Group Version Kind | apps/v1/Deployment |
YAML 定义、类型匹配、RBAC 策略 |
| GVR | Group Version Resource | apps/v1/deployments |
REST API 路径、kubectl 命令、Watch 订阅 |
记忆技巧: GVK 是“是什么”(Kind),GVR 是“在哪里”(Resource)。Kind 通常大写开头(如 Deployment),Resource 通常小写复数(如 deployments)。
3.3 CRD:扩展资源模型的基石
CustomResourceDefinition(CRD)允许用户向 Kubernetes API 注册新的资源类型。CRD 本身也是一个 Kubernetes 资源,其核心结构如下:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: applications.gitops.example.com
spec:
group: gitops.example.com
names:
kind: Application
plural: applications
singular: application
shortNames:
- app
scope: Namespaced
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
repoURL:
type: string
targetRevision:
type: string
path:
type: string
CRD 注册后,Kubernetes 自动生成对应的 RESTful API 端点,用户即可像操作原生资源一样操作自定义资源。
3.4 资源层次结构:从集群到实例
Kubernetes 资源存在清晰的层次结构,理解这一结构对 GitOps 检测的权限控制、资源隔离和状态聚合至关重要。
3.5 资源模型在 GitOps 检测中的映射
在 GitOps 检测场景中,资源模型直接决定了检测的范围、粒度和策略:
- GVK 用于策略匹配:检测规则通过 GVK 指定要监控的资源类型,例如只检测
apps/v1/Deployment和gitops.example.com/v1/Application。 - GVR 用于 API 调用:检测引擎通过 GVR 构造 REST 请求,从集群拉取资源状态,或通过 Watch 订阅变更事件。
- CRD 用于扩展检测范围:通过 CRD 定义的自定义资源(如 ArgoCD Application、Flux Kustomization)是 GitOps 检测的核心对象。
- 资源层次用于权限隔离:Cluster 级别的资源(如 ClusterRole)与 Namespace 级别的资源(如 Role)需要不同的检测策略和 RBAC 配置。
常见陷阱: 在 GitOps 检测中,不要混淆 GVK 与 GVR。例如,检测规则中写
kind: Deployment(GVK),但 API 调用时却使用 /apis/apps/v1/deployment(缺少复数 s),会导致 404 错误。务必使用 /apis/apps/v1/deployments(GVR)。
3.6 资源模型与控制器调和循环
资源模型不仅是静态定义,更是动态调和循环的载体。控制器通过以下步骤实现状态收敛:
- 观察(Observe):通过 GVR 的 Watch 或 List 接口获取当前资源状态。
- 分析(Analyze):对比 spec(期望状态)与 status(实际状态),计算差异。
- 执行(Act):调用 Kubernetes API 创建、更新或删除子资源,使实际状态向期望状态收敛。
- 更新状态(Update Status):将调和结果写回资源的 status 字段。
GitOps 检测引擎本质上是一个“元控制器”,它监控多个资源的 spec 与 status,并报告偏离 Git 仓库期望状态的差异。
实践要点: 在设计 GitOps 检测系统时,建议将检测规则抽象为 CRD 资源(如
DetectionPolicy),利用 Kubernetes 资源模型实现检测策略的声明式管理,而非硬编码在代码中。