Kubernetes 资源模型
Kubernetes(常写作 K8s)是一个管理容器化应用的平台。你告诉它"应用应运行几份、如何被访问、资源上限是多少",它持续把集群调整到这个目标状态。本系列从"资源"视角切入:Kubernetes 里几乎所有东西都是资源对象,理解了资源模型,就理解了它的一半设计哲学。
本篇目标:理解声明式 API 与传统命令式的差异,看懂任何资源对象的 YAML 四段结构,掌握 apply 与控制循环的工作方式,并能把常见资源按分组归类。

1. 云原生与声明式 API
1.1 Kubernetes 解决什么问题
Docker 能运行一个容器,但生产环境还需要处理副本故障、滚动发布、服务发现、跨节点调度、资源隔离和权限控制。Kubernetes 把这些能力统一为可声明、可查询、可自动恢复的资源:
| 需求 | Kubernetes 的做法 |
|---|---|
| 一个容器异常退出 | 控制器创建新的 Pod,使副本数回到目标值 |
| 应用需要多副本 | Deployment 维护指定数量的副本 |
| 服务 IP 会变化 | Service 提供稳定访问入口和 DNS 名称 |
| 应用需要配置或密码 | ConfigMap / Secret 与镜像分离管理 |
| 节点要维护 | cordon / drain 安全迁移可驱逐的工作负载 |
1.2 声明式 vs 命令式
同一件事的两种做法,理解差异很重要:
# 命令式:告诉 Kubernetes"做什么"(手动)
kubectl scale deployment web --replicas=3
# 声明式:告诉 Kubernetes"应该是什么样"(YAML + apply)
# 修改 YAML 中 replicas: 2 → 3,然后:
kubectl apply -f deployment.yaml
声明式的优势:
- 可审计:YAML 在 Git 中,谁改了什么一清二楚;
- 可重复:同一份 YAML apply 到任何集群都得到同样结果;
- 可自动恢复:有人手工改了副本数,控制器会自动调谐回 YAML 声明的值。
2. 资源对象元结构
每个 Kubernetes 资源 YAML 都有四个顶层字段:
apiVersion: apps/v1 # API 组和版本(决定可用字段)
kind: Deployment # 资源类型
metadata: # 名称、Namespace、标签、注解
name: web
namespace: learning
labels:
app.kubernetes.io/name: web
spec: # 期望状态(你想要的)
replicas: 2
selector: ...
template: ...
# status: # 实际状态(Kubernetes 自动维护,YAML 中不写)
| 字段 | 作用 | 谁填写 |
|---|---|---|
apiVersion | 指明 API 组与版本,决定可用字段集 | 编写者(按资源类型查) |
kind | 资源类型(Deployment、Service、Pod…) | 编写者 |
metadata | 身份信息:name、namespace、labels、annotations | 编写者 |
spec | 期望状态 | 编写者 |
status | 实际状态(控制器持续更新) | Kubernetes 自动维护 |
spec 是你声明的期望状态,status 是 Kubernetes 观察到的实际状态。控制器持续把 status 向 spec 调谐——这是声明式配置的核心。
3. 创建与生命周期管理
3.1 通过 kubectl apply 创建
kubectl apply -f deployment.yaml # 创建或更新(幂等)
kubectl get deployment web -n learning
kubectl get pod,deployment,service -n learning
kubectl delete -f deployment.yaml # 按清单删除
apply 与 create 的关键区别:create 只能创建新对象,重复执行报错;apply 是声明式更新,重复执行会比对差异并收敛到清单状态。生产上应以 apply(或 GitOps 工具)为准。
3.2 控制循环(Control Loop)
控制器通过"观察 → 对比 → 行动"的循环持续工作:
1. 观察:控制器读到 spec.replicas=3
2. 对比:实际只有 2 个 Pod Running
3. 行动:创建第 3 个 Pod
4. 回到步骤 1,持续循环
这就是为什么 YAML apply 之后不需要手动"运行"什么——控制器在后台持续调谐,即使 Pod 意外被删也会自动创建回来。也是为什么"手工删 Pod → 它又回来了"是正常行为而非 bug。
4. 常见资源类型汇总分类
资源很多,但可以按"解决什么问题"归为几类。记住分组比记住每个资源更容易:
| 分组 | 代表资源 | 回答的问题 |
|---|---|---|
| 工作负载 | Pod、Deployment、StatefulSet、DaemonSet、Job、CronJob | 谁在运行、跑几份、如何更新 |
| 服务与网络 | Service、EndpointSlice、Ingress、Gateway/HTTPRoute | 怎么被找到、怎么暴露 |
| 配置与密钥 | ConfigMap、Secret | 配置和密码放哪里 |
| 存储 | PVC、PV、StorageClass、VolumeSnapshot | 数据存哪里、谁能申请、删了怎么办 |
| 身份与权限 | ServiceAccount、Role、ClusterRole、RoleBinding、ClusterRoleBinding | 谁能对什么资源做什么操作 |
| 策略与治理 | ResourceQuota、LimitRange、NetworkPolicy、PodDisruptionBudget | 边界、配额、网络与可用性约束 |
| 调度 | Node、Taint/Toleration、Affinity | 跑到哪个节点 |
| 可扩展 | CRD、Custom Resource | 标准资源不够用时 |
# 查看当前集群支持的所有资源及 API 版本
kubectl api-resources
# 按分组粗略查看
kubectl get all -n learning # "all" 只含常见资源,不含 ConfigMap/Secret/PVC
本系列的章节大致按此分组推进:先工作负载(03-07),再服务与网络(08-09),配置与密钥(10),存储(11-12),资源限制(13-14),扩缩容(15),安全(16),调度(17),排障(18),生产实践(19)。
5. 练习
练习 A
- 用
kubectl api-resources找出:3 个工作负载资源、2 个存储资源、2 个权限资源,分别属于哪个 API 组 - 写出一个 Deployment YAML,标注四个顶层字段各自的作用
- 用
kubectl explain deployment.spec查看一个字段的说明,感受"资源即文档"的用法
练习 B
- 对一个 Deployment 执行
kubectl apply,再手工删掉它管理的 Pod,观察控制循环自动重建 - 用
kubectl get deployment web -o yaml对比spec与status的内容差异 - 修改 YAML 中
replicas,再次apply,用kubectl get pods观察收敛过程
下一篇:Namespace 与资源隔离。