2. K8s声明式管理基础:YAML/JSON声明式配置、kubectl apply原理、声明式 vs 命令式

2.1 声明式配置的核心:YAML与JSON

Kubernetes 声明式管理的基石是资源清单(Manifest),通常以 YAML 或 JSON 格式编写。YAML 因其可读性高、支持注释,成为社区首选。每个清单文件描述了一个或多个 Kubernetes 对象的期望状态(Desired State)。

关键原则: 你告诉 K8s “最终要什么”,而不是“每一步怎么做”。系统内部的控制器会持续协调(Reconcile),确保实际状态与期望状态一致。

2.1.1 最小化 YAML 结构示例

apiVersion: v1                # API 版本,决定资源 schema
kind: Pod                     # 资源类型
metadata:
  name: nginx-pod             # 资源名称(命名空间内唯一)
  labels:
    app: nginx                # 标签,用于选择与关联
spec:
  containers:
  - name: nginx
    image: nginx:1.25
    ports:
    - containerPort: 80

2.1.2 声明式配置的四大字段

字段层级 作用 说明
apiVersion API 版本标识 决定资源 schema 与控制器版本,如 apps/v1、networking.k8s.io/v1
kind 资源类型 Pod、Deployment、Service、Namespace、NetworkPolicy 等
metadata 元数据 name、namespace、labels、annotations
spec 期望规格 资源的具体配置,如容器镜像、端口、副本数、网络规则
最佳实践: 始终将清单文件纳入 Git 仓库进行版本控制。这是“GitOps”和“基础设施即代码(IaC)”的基础,也是后续多租户隔离与制品签名链路追溯的前提。

2.2 kubectl apply 原理:声明式协调引擎

kubectl apply 是声明式管理的核心命令。它并非简单的“创建或更新”,而是执行一次服务端协调(Server-Side Apply)或客户端协调(Client-Side Apply)。从 K8s 1.22 起,服务端协调成为默认行为。

2.2.1 工作流程(服务端协调)

  1. 发送清单: 用户将完整 YAML/JSON 发送至 API Server。
  2. 字段级所有权标记: API Server 解析清单,为每个字段标记“管理者”(通过 managedFields 字段记录)。
  3. 合并与冲突检测: 如果多个管理者修改同一字段,系统会报冲突,拒绝覆盖,防止配置被意外覆盖。
  4. 存储期望状态: 将最终合并后的完整对象存入 etcd。
  5. 控制器协调: 对应的控制器(如 Deployment Controller)检测到期望状态变化,开始执行实际变更(如滚动更新 Pod)。
避坑提示: 不要混用 kubectl apply 和 kubectl create/delete 管理同一资源。命令式操作会破坏 managedFields 的追踪,导致后续 apply 出现意外冲突或资源漂移。

2.2.2 声明式协调流程(SVG图)

kubectl apply 声明式协调流程 用户 / CI 系统 API Server etcd 存储 控制器协调 实际资源 反馈实际状态(状态回写) 核心:用户只提交期望状态,系统自动完成差异计算与执行

2.3 声明式 vs 命令式:范式对比

理解两种范式的差异,是构建安全、可审计的多租户平台的前提。命令式关注“如何做”,声明式关注“最终状态”。

维度 声明式(Declarative) 命令式(Imperative)
操作方式 kubectl apply -f manifest.yaml kubectl run、kubectl create deployment、kubectl expose
状态管理 期望状态持久化在 etcd,控制器自动协调 直接执行命令,不保留完整期望状态
可重复性 高,清单文件可版本控制、可复现 低,依赖操作顺序和上下文
审计与追溯 强,Git 历史 + managedFields 可追踪变更来源 弱,仅依赖操作日志,难以关联到具体配置
多租户隔离 天然适合,通过 Namespace + RBAC + NetworkPolicy 声明式定义租户边界 容易产生配置漂移,租户边界难以固化
制品签名集成 可在 CI 中对清单文件签名,验证后再 apply 难以在命令执行时嵌入签名验证

2.3.1 为什么多租户隔离必须选择声明式?

  • 边界固化: 租户的 Namespace、ResourceQuota、NetworkPolicy 通过清单文件定义,不可被运行时命令随意修改。
  • 变更审批: 所有变更通过 Git Merge Request 触发,天然具备审批与审计能力。
  • 回滚能力: 声明式配置支持 kubectl apply --server-side --force-conflicts 或直接回退到历史版本。
  • 签名链路: 在 CI 中对 YAML 清单进行 Cosign 签名,在 CD 中验证签名后再 apply,确保配置未被篡改。
课程关联: 后续章节将基于声明式配置,构建“多租户隔离 → 制品签名 → 发布证据链”的完整安全链路。本章的 YAML 结构与 apply 原理是整门课程的技术地基。

2.4 声明式 vs 命令式:适用场景对比(SVG图)

声明式 vs 命令式:适用场景对比 声明式(推荐用于生产) ✅ 生产环境多租户隔离 ✅ 制品签名与发布证据链 ✅ GitOps / CI-CD 流水线 ✅ 合规审计与变更追溯 ✅ 团队协作与代码审查 ✅ 灾难恢复与集群重建 命令式(仅限临时/调试) ⚠️ 快速调试与故障排查 ⚠️ 临时测试环境 ⚠️ 学习与实验 ⚠️ 一次性资源创建 ❌ 生产环境多租户 ❌ 需要审计与签名的场景
实战建议: 在开发环境中,可以使用命令式快速验证;但在任何需要隔离、审计、签名的场景中,必须使用声明式管理。本课程后续所有实践均基于声明式 YAML 清单。