2. 声明式资源模型基础

2.1 声明式 vs 命令式:两种运维哲学

在基础设施与应用发布领域,操作方式可分为两大范式:命令式(Imperative) 和 声明式(Declarative)。理解二者的区别是掌握 GitOps 的前提。

维度 命令式(Imperative) 声明式(Declarative)
核心思想 “如何做”——描述操作步骤 “做什么”——描述最终状态
操作对象 直接操作 API 或 CLI 执行动作 提交资源清单,由系统自动调和
幂等性 非幂等,重复执行可能产生不同结果 幂等,重复提交相同清单结果一致
可审计性 依赖操作日志,难以追溯 资源清单即真相来源(Source of Truth)
典型示例 kubectl run nginx --image=nginx kubectl apply -f deployment.yaml
适用场景 调试、临时操作、快速验证 生产环境、CI/CD、多集群管理
关键认知: GitOps 的核心前提是“声明式”。只有当你用声明式描述系统期望状态时,Git 才能成为不可变的真相来源,自动化调和循环才能成立。

2.2 Kubernetes 资源模型(KRM)

Kubernetes 资源模型(KRM)是声明式管理的具体实现。所有资源都遵循统一的结构:API 版本(apiVersion)、资源类型(kind)、元数据(metadata)、规格(spec) 和 状态(status)。

  • apiVersion:定义资源所属的 API 组和版本,如 apps/v1、v1。
  • kind:资源类型,如 Deployment、Service、ConfigMap。
  • metadata:标识信息,包括 name、namespace、labels、annotations。
  • spec:用户声明的期望状态(Desired State)。
  • status:系统回写的当前实际状态(Actual State),由 Controller 持续更新。
实践要点: 在 GitOps 工作流中,Git 仓库只存储 apiVersion、kind、metadata 和 spec。status 由集群内部维护,不应提交到 Git。
Kubernetes 资源模型结构 Kubernetes 资源模型(KRM)结构 Kubernetes 资源对象 apiVersion apps/v1, v1, batch/v1 kind Deployment, Service, Pod metadata name, namespace, labels spec(期望状态) replicas: 3, image: nginx:1.25 status(实际状态) replicas: 3, readyReplicas: 2 Controller 持续对比 spec 与 status,执行调和循环(Reconciliation Loop)

2.3 YAML/JSON 声明式语法

Kubernetes 资源清单通常使用 YAML 或 JSON 编写。YAML 因其可读性成为首选,JSON 常用于 API 传输。以下是一个完整的 Deployment 声明式定义:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: production
  labels:
    app: nginx
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
常见陷阱: YAML 对缩进敏感,禁止使用 Tab 键,必须使用空格。字段名区分大小写,replicas 与 Replicas 是不同的字段。建议在提交前使用 kubectl dry-run 或 yamllint 验证语法。

2.4 资源状态期望值(Desired State)

声明式模型的核心是 期望值(Desired State)。它不是单一数值,而是资源规格中所有字段的集合。系统通过调和循环持续将实际状态向期望状态收敛。

资源类型 期望值关键字段 调和目标
Deployment spec.replicas、spec.template.spec.containers[].image 运行指定数量的 Pod,使用指定镜像版本
Service spec.selector、spec.ports[].port 将流量路由到匹配标签的 Pod
ConfigMap data 键值对 将配置数据注入 Pod 环境变量或文件
PersistentVolumeClaim spec.resources.requests.storage、spec.accessModes 绑定满足容量和访问模式的 PersistentVolume
HorizontalPodAutoscaler spec.minReplicas、spec.maxReplicas、spec.targetCPUUtilizationPercentage 根据负载自动调整副本数
声明式调和循环 声明式调和循环(Reconciliation Loop) Git 仓库 期望状态(YAML) Controller 对比 spec vs status Kubernetes 集群 实际状态(status) 反馈实际状态 当实际状态偏离期望状态时,Controller 自动执行修正动作(如重启 Pod、扩缩容) GitOps 将 Git 作为期望状态的唯一入口,任何手动变更都会被下一次调和覆盖

2.5 声明式管理的核心优势

  • 可复现性:相同的 YAML 清单在任何集群上产生相同的结果。
  • 版本控制:所有变更通过 Git 提交记录,支持回滚、分支、Code Review。
  • 自动化调和:系统持续自愈,无需人工干预。
  • 团队协作:多人并行修改不同资源,通过 PR 流程合并。
  • 多环境一致性:开发、测试、生产环境使用同一套清单,仅参数化差异。
GitOps 最佳实践: 始终使用 kubectl apply 而非 kubectl create 或 kubectl run。将 apply 操作封装在 CI/CD 流水线中,确保 Git 仓库始终是唯一的操作入口。