# 核心心智模型
1.PV (PersistentVolume - 持久卷) = 墙上的插座
- 角色: 由**集群管理员(Admin)**提前建好。
- 本质: 它是真实的底层存储资源(比如一块 50G 的 NFS 网络硬盘,或云上的 EBS 盘)。插座建好后,它就在那里,里面有电,等待被使用。
2.PVC (PersistentVolumeClaim - 持久卷声明) = 电器的插头
- 角色: 由**开发人员(Developer/User)**提出申请。
- 本质: 它是对存储的“需求清单”。比如声明:“我需要一个 10G 容量、能读能写的插座”。
3.Binding (绑定) = 插头插进插座
- 机制: Kubernetes 内部有一个控制器,会不断寻找还没有插电的插头(Pending PVC),然后去墙上找一个容量满足要求、访问模式匹配的空闲插座(Available PV),把它们死死绑定在一起(Bound)。
4.Pod = 电器
- 本质: 带着插头(PVC)的电器。只要插头有电,电器就能工作;电器坏了扔掉(Pod 被删除),插座里的电(PV 里的数据)依然存在!
# 实验目标
验证“电器毁灭,数据永存”
因为没有外部 NFS 服务器,这里使用 hostpath(直接使用宿主机的本地硬盘)来模拟这个过程。
# 实验过程
# 阶段一:管理员在墙上打一个插座 (创建 PV)
1. 创建 PV 定义文件 pv.yaml 我们将划出一块 1Gi 的空间,访问模式设为 ReadWriteOnce(最常用的单节点读写模式)。
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data" # 借用节点本地的这个目录作为底层存储
2. 部署并观察插座状态
kubectl apply -f pv.yaml
kubectl get pv
预期输出: 状态显示为
Available。插座已经通电,随时可以使用。
# 阶段二:开发者拿着插头来找插座 (创建 PVC)
1. 创建 PVC 定义文件 pvc.yaml 开发者不知道底层是 hostPath 还是 NFS,他只提需求:我需要 500Mi 的空间。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi # 需求小于插座提供的 1Gi,可以匹配!
2. 部署并见证“牵手”成功
kubectl apply -f pvc.yaml
kubectl get pvc
kubectl get pv
预期输出: 你的 PVC 状态会瞬间从
Pending变成Bound,PV 的状态也会变成Bound。此时,插头已经牢牢插进插座了!
# 阶段三:电器插上电源开始工作 (Pod 挂载 PVC)
1. 创建 Pod 文件 pod-storage.yaml 注意看 YAML 中的两段对应关系:先声明使用哪个插头(volumes),再决定把插头接到电器的哪个部位(volumeMounts)。
apiVersion: v1
kind: Pod
metadata:
name: storage-pod
spec:
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: test-pvc # 1. 声明:我要用刚才建好的那个插头 (PVC)
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html" # 2. 挂载:把外部存储接到 Nginx 的网页目录下
name: data-volume
2. 部署电器
kubectl apply -f pod-storage.yaml
kubectl get pod storage-pod -o wide
(注意看它被调度到了哪个节点,假设是 node1)
# 阶段四:终极测试(毁灭与重生)
现在我们要往里面写数据,然后把 Pod 删掉,看看数据还在不在。
1. 往持久化存储里写入一段文字
kubectl exec storage-pod -- sh -c 'echo "Hello Persistent Storage! CKA is easy!" > /usr/share/nginx/html/index.html'
2. 验证写入成功
kubectl exec storage-pod -- cat /usr/share/nginx/html/index.html
3. ⚡ 毁灭电器(删除 Pod)⚡
kubectl delete pod storage-pod
此时,电器灰飞烟灭。如果是普通 Pod,数据已经死无全尸了。
4. 重新买一个同款电器(重建 Pod) 完全不需要修改刚才的 YAML,直接原样再拉起一个 Pod:
kubectl apply -f pod-storage.yaml
5. 见证奇迹:数据重生 等 Pod 运行起来后,再次查看里面的文件:
kubectl exec storage-pod -- cat /usr/share/nginx/html/index.html
你依然会看到那句 “Hello Persistent Storage! CKA is easy!”
# 清理战场
拔掉插头之前,必须先销毁电器。否则 PVC 会陷入 Terminating 卡死状态(Kubernetes 的自我保护机制)。
## 1. 删电器
kubectl delete -f pod-storage.yaml
## 2. 拔插头
kubectl delete -f pvc.yaml
## 3. 拆插座
kubectl delete -f pv.yaml
## (可选)去节点上把刚才生成的物理文件删掉
## rm -rf /mnt/data