2. Kubernetes 资源模型基础:API资源、资源类型、资源对象、资源规范与状态

Kubernetes 资源模型是集群内所有工作负载与基础设施的抽象表达方式。Helm 作为控制平面与集群之间的适配层,其核心任务正是将 Chart 模板映射为合法的 Kubernetes 资源对象。理解资源模型的四个层次——API 资源、资源类型、资源对象、资源规范与状态——是掌握 Helm 适配机制的前提。

2.1 四层资源模型总览

Kubernetes 资源模型从抽象到具体分为四个层次,每一层解决不同粒度的定义问题:

层次 定义 示例 Helm 关注点
API 资源 RESTful 端点路径,标识一组资源类型 /api/v1/pods、/apis/apps/v1/deployments Chart 中 apiVersion 字段的合法性
资源类型 GVK(Group、Version、Kind)三元组 apps/v1/Deployment、v1/Service 模板中 kind 与 apiVersion 的匹配
资源对象 符合资源类型的 YAML/JSON 实例 一个名为 nginx-deploy 的 Deployment Helm 渲染后的最终 YAML 产物
规范与状态 对象的期望(spec)与实际(status) spec.replicas: 3、status.readyReplicas: 2 Helm 只管理 spec,status 由控制器维护
关键认知: Helm 模板最终生成的是 资源对象,而 apiVersion 和 kind 决定了该对象属于哪个 API 资源 和 资源类型。三者缺一不可。

2.2 API 资源与资源类型(GVK)

Kubernetes 使用 Group(组)、Version(版本)、Kind(种类) 三元组唯一标识一种资源类型。API 资源则是该类型在 REST 接口上的映射路径。

  • Group:资源的功能域,如 apps(工作负载)、networking.k8s.io(网络)、batch(批处理)。核心资源(Pod、Service)属于空组 "",对应 /api/v1。
  • Version:API 的成熟度,v1(稳定)、v1beta1(Beta)、v1alpha1(Alpha)。
  • Kind:资源的具体类型名称,如 Deployment、Service、ConfigMap。

以下表格列出 Helm 开发中最常用的资源类型及其 GVK:

Kind Group Version(稳定) API 路径
Pod (空) v1 /api/v1/pods
Service (空) v1 /api/v1/services
ConfigMap (空) v1 /api/v1/configmaps
Deployment apps v1 /apis/apps/v1/deployments
StatefulSet apps v1 /apis/apps/v1/statefulsets
Ingress networking.k8s.io v1 /apis/networking.k8s.io/v1/ingresses
CustomResourceDefinition apiextensions.k8s.io v1 /apis/apiextensions.k8s.io/v1/customresourcedefinitions
Helm 适配要点: 在 Chart 模板中,apiVersion 字段必须使用 Group/Version 格式(如 apps/v1),kind 字段必须与 GVK 中的 Kind 完全一致。大小写敏感,拼写错误会导致 API Server 拒绝创建。

2.3 资源对象的结构

每个 Kubernetes 资源对象都遵循统一的 YAML 结构,Helm 模板渲染后必须符合此契约:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: default
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
status:
  replicas: 3
  readyReplicas: 3
  conditions:
    - type: Available
      status: "True"

对象结构分为四个顶层字段:

  • apiVersion / kind:标识资源类型,Helm 模板中通常直接写死或通过 .Values 控制。
  • metadata:元数据,包括 name、namespace、labels、annotations。Helm 通过 .Release.Name 等内置对象动态生成名称和标签。
  • spec:期望状态(Desired State),是用户声明的唯一入口。Helm 模板的核心工作就是填充 spec 字段。
  • status:实际状态(Actual State),由 Kubernetes 控制器写入,用户和 Helm 不应手动修改。

2.4 资源规范(Spec)与状态(Status)的分离

Kubernetes 采用 声明式模型,其核心机制是 Spec → Status 的持续调和。Helm 只负责管理 spec,status 由集群内部的控制器循环驱动。

常见误区: 初学者有时会在 Helm 模板中尝试设置 status 字段,这是无效的。API Server 会忽略用户提交的 status,或直接报错。Helm 模板应只包含 apiVersion、kind、metadata、spec 四个顶层字段。

以下 SVG 图展示了 Spec 与 Status 的分离关系以及 Helm 在其中的位置:

Kubernetes 资源模型:Spec 与 Status 分离 Helm 控制平面 管理 Spec(期望状态) 提交 YAML 资源对象 apiVersion + kind metadata + spec 存储 API Server etcd 持久化 控制器 调和循环 读取 spec 写入 status Status 实际状态 说明: • Helm 只管理 spec,不管理 status。 • 控制器持续比较 spec 与 status,驱动实际状态向期望状态收敛。 • 用户通过 Helm 更新 spec,控制器自动响应。

2.5 资源对象的核心元数据

metadata 字段是 Helm 模板中最常操作的部分,以下字段具有特殊意义:

字段 是否必填 Helm 常用模式 说明
name 是 {{ .Release.Name }}-{{ .Values.name }} 集群内唯一,Helm 通过 Release 名称保证唯一性
namespace 否(默认 default) {{ .Release.Namespace }} Helm 安装时通过 -n 指定
labels 推荐 app.kubernetes.io/name: {{ .Chart.Name }} 用于选择器、监控、日志聚合
annotations 否 helm.sh/hook: pre-install Helm 钩子、工具元数据
最佳实践: 所有 Helm 模板生成的资源对象都应包含 app.kubernetes.io/managed-by: Helm 标签,便于集群运维人员识别资源来源。Helm 3 默认在 metadata.labels 中注入此标签。

2.6 资源类型与 Helm 模板的映射关系

Helm 模板中的每个 YAML 文件对应一个资源对象。以下是一个典型的 Helm Chart 模板文件结构及其与资源类型的对应关系:

charts/my-app/
  templates/
    deployment.yaml    →  Kind: Deployment,  apiVersion: apps/v1
    service.yaml       →  Kind: Service,     apiVersion: v1
    ingress.yaml       →  Kind: Ingress,     apiVersion: networking.k8s.io/v1
    configmap.yaml     →  Kind: ConfigMap,   apiVersion: v1
    hpa.yaml           →  Kind: HorizontalPodAutoscaler, apiVersion: autoscaling/v2

每个模板文件的开头必须声明正确的 apiVersion 和 kind,否则 helm install 或 helm upgrade 时会收到 API Server 的校验错误。

2.7 资源模型的版本兼容性

Kubernetes API 版本会演进,Helm Chart 需要声明支持的版本范围。在 Chart.yaml 中通过 kubeVersion 字段约束:

apiVersion: v2
name: my-app
version: 1.0.0
kubeVersion: ">=1.21.0-0 <1.28.0-0"

不同版本的 Kubernetes 可能废弃或移除某些 API 版本。例如:

资源类型 废弃版本 移除版本 替代版本
Deployment apps/v1beta1(1.9) 1.16 apps/v1
Ingress networking.k8s.io/v1beta1(1.19) 1.22 networking.k8s.io/v1
HorizontalPodAutoscaler autoscaling/v2beta2(1.23) 1.25 autoscaling/v2
Helm 适配风险: 如果 Chart 使用了已移除的 API 版本,在目标集群上执行 helm install 时会直接失败。建议在 Chart 的 CI 流程中使用 helm template 配合 --kube-version 参数进行预校验。

2.8 本章小结

Kubernetes 资源模型是 Helm 控制平面与集群交互的底层契约。API 资源定义了 REST 端点,资源类型(GVK)唯一标识了资源的身份,资源对象是 Helm 模板的最终产物,而 Spec 与 Status 的分离确保了声明式管理的可行性。Helm 的核心适配工作就是:将 Chart 模板中的 Go 模板语法渲染为合法的、包含正确 apiVersion/kind/metadata/spec 的资源对象,并提交给 API Server 持久化存储。