05-存储基础
存储基础概念引入容器是临时的——Pod 重启后容器里的数据就没了。但数据库、文件上传这些场景需要持久化存储。K8s 用三层抽象来解决这个问题使用绑定自动创建PodPVC存储申请单PV实际存储StorageClass存储模板打个比喻PVPersistentVolume仓库里的实际货架存储空间PVCPersistentVolumeClaim你提交的我需要一个 10GB 货架的申请单StorageClass自动货架供应系统——你申请它自动创建原理讲解三种存储概念概念角色谁创建PV实际的存储资源管理员预先创建或由 StorageClass 自动创建PVC用户对存储的需求开发者在 YAML 中声明StorageClass存储供应模板管理员配置定义存储类型和供应方式静态供应 vs 动态供应动态供应开发者创建 PVCStorageClass 自动创建 PVPVC 绑定到新 PV静态供应管理员创建 PV开发者创建 PVCPVC 绑定到已有的 PV现代 K8s 集群基本都用动态供应——开发者只管写 PVCStorageClass 自动搞定 PV。访问模式模式缩写含义ReadWriteOnceRWO单节点读写ReadOnlyManyROX多节点只读ReadWriteManyRWX多节点读写PVC YAML 结构apiVersion:v1kind:PersistentVolumeClaimmetadata:name:my-pvcspec:accessModes:-ReadWriteOnceresources:requests:storage:1GistorageClassName:standard# 使用哪个 StorageClass在 Pod 中使用 PVCspec:containers:-name:appvolumeMounts:-name:datamountPath:/datavolumes:-name:datapersistentVolumeClaim:claimName:my-pvc动手实验步骤 1查看默认 StorageClasskubectl get storageclass预期输出Kind 集群自带 standardNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE standard (default) rancher.io/local-path Delete WaitForFirstConsumer步骤 2创建 PVCcatmy-pvc.yamlEOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Mi EOFkubectl apply-fmy-pvc.yaml步骤 3查看 PVC 状态kubectl get pvc预期输出NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE my-pvc Pending standard unset 6s为什么是 PendingKind 的 StorageClass 使用WaitForFirstConsumer模式——PVC 会等到有 Pod 真正使用时才绑定。步骤 4创建使用 PVC 的 Podcatpvc-pod.yamlEOF apiVersion: v1 kind: Pod metadata: name: pvc-pod spec: containers: - name: app image: busybox command: [sh, -c, echo Hello K8s Storage! /data/test.txt sleep 3600] volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: my-pvc EOFkubectl apply-fpvc-pod.yaml步骤 5验证 PVC 已绑定kubectl get pvc预期输出NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE my-pvc Bound pvc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 100Mi RWO standard unset 30s步骤 6验证数据持久化# 查看写入的数据kubectlexecpvc-pod --cat/data/test.txt预期输出Hello K8s Storage!现在删除 Pod模拟 Pod 崩溃/重启kubectl delete pod pvc-pod创建一个只读不写的新 Pod使用同一个 PVCcatpvc-pod-reader.yamlEOF apiVersion: v1 kind: Pod metadata: name: pvc-pod-reader spec: containers: - name: app image: busybox command: [sh, -c, cat /data/test.txt sleep 10] volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: my-pvc EOFkubectl apply-fpvc-pod-reader.yaml关键第二个 Pod 只执行cat读取不写任何数据。如果文件依然存在说明数据确实来自 PVC 而不是 Pod 自己生成的。查看新 Pod 的输出kubectl logs pvc-pod-reader预期输出Hello K8s Storage!这证明了Hello K8s Storage!是第一个 Pod 写入后被 PVC 持久化保存下来的——第二个 Pod 只是把它读了出来。步骤 7清理kubectl delete pod pvc-pod-reader kubectl delete pvc my-pvcrmmy-pvc.yaml pvc-pod.yaml pvc-pod-reader.yaml自检问题PV 和 PVC 的关系是什么查看答案 PV 是实际的存储资源类似服务器PVC 是用户对存储的申请类似我需要一台 8G 内存的服务器。K8s 会自动把 PVC 绑定到合适的 PV。什么是动态供应查看答案 动态供应是指当 PVC 创建时StorageClass 自动创建对应的 PV不需要管理员预先手动创建。现代 K8s 集群基本都用动态供应。Pod 删除后 PVC 里的数据会丢失吗查看答案 不会。PVC 是独立于 Pod 的资源。Pod 删除后 PVC 仍然存在数据保留。只有当 PVC 本身被删除时取决于 ReclaimPolicy数据才会被清理。下一步现在你知道怎么给应用分配存储了。接下来学习如何隔离和管理多组资源→ 06. 命名空间与访问控制本文来自 K8s Guide—— 开源免费的 Kubernetes 中文学习指南️ 初学者轨道 面试轨道从零基础到拿 Offer 一站式覆盖 每篇文章配套 Kind 实验脚本本地一键运行 本文源码docs/beginner/10-storage-basics.md⭐如果对你有帮助欢迎 Stargithub.com/callmebg/k8s-guide