亲眼看 PVC 真的绑定上
本实验在有真正 provisioner 的集群中运行
VM 内的 k3s 中实际运行着 local-path 动态 provisioner。创建 PVC 后,
PV 会自动生成;写入文件后,即使删除 Pod,数据仍会保留。
CKA 课程中的其他存储实验运行在没有 provisioner 的模拟集群中,
因此 PVC 会永远保持 Pending,只能练习编写 YAML。
首次启动大约需要 2 分钟。
目标
通过状态变化确认 StorageClass、PVC、PV 三层如何协同工作,
并亲自观察为什么需要 WaitForFirstConsumer。
为什么这很重要
处理存储时,比“YAML 是否写对”更常见的问题是判断**“为什么现在处于这个状态”**。
其中最容易被误解的是 Pending。
使用 WaitForFirstConsumer 的 StorageClass 创建 PVC 后,它会有意保持 Pending。
这不是缺陷,而是设计。卷应该创建在哪个节点,取决于使用该卷的 Pod 将被调度到哪个节点;
没有 Pod 时,就无法知道答案。
如果先创建卷,调度器就只能把 Pod 放到该节点上;当节点没有位置时,Pod 将永远无法启动。
WaitForFirstConsumer 通过颠倒这个顺序解决了问题。
如果不理解这一点,就会长时间排查“PVC 处于 Pending,是不是 provisioner 坏了”。
步骤
所有对象都创建在 cst namespace 中。
- 检查
local-pathStorageClass 的provisioner和绑定模式,并保存到/root/cst/sc.txt。 - 创建名为
data的 PVC(1Gi,ReadWriteOnce),并将挂载 Pod 之前的状态保存到/root/cst/pending.txt。还要说明为何处于该状态。 - 创建
writerPod 并挂载该 PVC,将 PVC 变为Bound的情况以及自动创建的 PV 名称保存到/root/cst/bound.txt。 - 向卷中写入文件,删除 Pod 后再重新创建,确认数据是否保留,并将结果保存到
/root/cst/persist.txt。 - 确认
ReadWriteOnce限制的内容,并保存到/root/cst/accessmode.txt。 - 再创建一个
tempPVC,然后删除它,将对应 PV 的变化保存到/root/cst/reclaim.txt。 - 创建
webStatefulSet,并为其添加volumeClaimTemplates(副本数 2),并将生成的 PVC 数量保存到/root/cst/sts.txt。 - 在
/root/cst/report.md中写入binding_mode=、reclaim_policy=、sts_pvcs=三行,并说明三层之间的关系。
参考
- 使用
kubectl -n cst get pvc查看 PVC 状态。Pending原因位于describe的 Events 中。 - 自动创建的 PV 名称可通过
kubectl -n cst get pvc data -o jsonpath='{.spec.volumeName}'获取。 ReadWriteOnce是节点级别的。同一节点上的多个 Pod 可以共同使用,但其他节点无法挂载。它并不表示“只能有一个 Pod”。- StatefulSet 的 PVC 名称格式为
<볼륨이름>-<스테이트풀셋이름>-<번호>。 - 常见错误 1:第 2 步先挂载 Pod 后才查看状态。这样 PVC 会立即变成
Bound,要学习的现象就消失了。 - 常见错误 2:认为删除 StatefulSet 后 PVC 也会被删除。PVC 会保留。 这是为了保护数据,必须手动清理。
谁来创建卷
检查 local-path StorageClass 的provisioner和绑定模式,并保存到 /root/cst/sc.txt。
kubectl get sc local-path -o yaml 中包含 provisioner 和绑定模式。
Pending 属于正常情况
创建名为 data 的 PVC(1Gi,ReadWriteOnce),并将挂载 Pod 之前的状态保存到 /root/cst/pending.txt。还要说明为何处于该状态。
只创建 PVC,暂时不要创建 Pod。此时的状态就是本步骤的观测对象。
挂载 Pod 后生成卷
创建 writer Pod 并挂载该 PVC,将 PVC 变为 Bound 的情况以及自动创建的 PV 名称保存到 /root/cst/bound.txt。
创建挂载 PVC 的 Pod 后,provisioner 会创建新的 PV。请确认其名称。
删除 Pod 后数据仍然保留
向卷中写入文件,删除 Pod 后再重新创建,确认数据是否保留,并将结果保存到 /root/cst/persist.txt。
写入文件,删除 Pod,再使用同一个 PVC 重新创建 Pod 并读取文件。
ReadWriteOnce 是节点级限制
确认 ReadWriteOnce 限制的内容,并保存到 /root/cst/accessmode.txt。
它并不表示“只能有一个 Pod”。同一节点上的多个 Pod 可以共同使用。
删除 PVC 后 PV 会怎样
再创建一个 temp PVC,然后删除它,将对应 PV 的变化保存到 /root/cst/reclaim.txt。
创建一个临时 PVC,挂载到 Pod 使其完成绑定,然后删除 PVC 并检查 PV。
为每个 Pod 分配独立卷
创建 web StatefulSet,并为其添加 volumeClaimTemplates(副本数 2),并将生成的 PVC 数量保存到 /root/cst/sts.txt。
volumeClaimTemplates 会为每个 Pod 创建一个 PVC。请确认命名规则。
总结所学内容
在 /root/cst/report.md 中写入 binding_mode=、reclaim_policy=、sts_pvcs= 三行,并说明三层之间的关系。
除 binding_mode=、reclaim_policy=、sts_pvcs= 三行外,还要说明三层之间的关系。