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 由控制器维护 |
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 |
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 由集群内部的控制器循环驱动。
status 字段,这是无效的。API Server 会忽略用户提交的 status,或直接报错。Helm 模板应只包含 apiVersion、kind、metadata、spec 四个顶层字段。
以下 SVG 图展示了 Spec 与 Status 的分离关系以及 Helm 在其中的位置:
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 钩子、工具元数据 |
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 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 持久化存储。