ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kubernetes Persistent Volumes 与 Persistent Volume Claims 实战指南:从 PV/PVC 概念到动态供给与最佳实践

Kubernetes Persistent Volumes 与 Persistent Volume Claims 实战指南:从 PV/PVC 概念到动态供给与最佳实践 Kubernetes Persistent Volumes 与 Persistent Volume Claims 实战指南从 PV/PVC 概念到动态供给与最佳实践【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine导读Kubernetes Persistent VolumesPV与 Persistent Volume ClaimsPVC是容器化环境中保存持久数据的核心机制。本文以 refine 开源仓库中的 Kubernetes 系列技术文档为主线系统讲解 PV/PVC 的底层概念、Minikube 本地实验环境搭建、HostPath/NFS/AWS EBS 等常见卷类型的选择与配置、从创建 PV 到 Pod 挂载 PVC 的完整流程并深入动态卷供给、卷扩容与回收、安全加固等生产级最佳实践。读完本文你将掌握在 Kubernetes 中为有状态应用设计与配置持久化存储的完整方法论并能直接复用文中的所有 YAML 清单。一、持久卷核心概念PV 与 PVC 的职责分离在 Kubernetes 中Persistent VolumePV是集群中的一个存储单元通常由管理员预先供给或通过 StorageClass 动态创建。它与 Pod 的生命周期解耦作为集群级资源独立存在类似于 Node 之于 Pod 的关系PV 不依附于任何单个 PodPod 重启、重建甚至被删除PV 中的数据依然保留。Persistent Volume ClaimPVC则是用户对存储的请求request。类比 Pod 消费 Node 资源的方式PVC 消费 PV 资源用户无需关心底层存储来自本地磁盘、NFS 还是云厂商的块存储只需在 PVC 中声明自己需要多大容量、以何种访问模式使用即可。Kubernetes 控制平面负责将满足条件的 PV 与 PVC 完成绑定。这种存储供给与存储消费相分离的设计是 Kubernetes 存储模型的核心价值管理员负责供给Provisioning应用开发者负责声明Claiming双方通过 PVC 这个契约解耦让存储资源的分配像计算资源一样可声明、可复用。临时存储与持久存储的本质区别Kubernetes 中并非所有存储都会持久保留。临时存储ephemeral storage与 Pod 生命周期绑定例如emptyDir卷Pod 被删除时其中的数据随之销毁容器重启、调度迁移都会导致数据丢失因此只适合存放缓存、临时文件等可重建数据。持久存储persistent storage则能够在 Pod 终止、重启、崩溃后继续存活是数据库、消息队列、文件服务等有状态应用的生命线。PV 与 PVC 正是 Kubernetes 提供持久存储能力的两个关键对象它们把数据要留在哪里这一问题的答案从 Pod 定义中抽离出来交由集群层面的存储系统管理。二、搭建本地实验环境Minikube kubectl要亲手实践 PV/PVC首先需要一个可用的 Kubernetes 环境。Minikube 可以在本地单机上模拟出一个完整的 Kubernetes 集群非常适合学习与实验。1. 安装 Minikube 并启动集群minikube start该命令会创建并启动一个本地单节点集群无需真实的多节点基础设施。2. 安装 kubectlkubectl是与 Kubernetes 集群交互的命令行工具所有 PV/PVC 的创建、查询、删除操作都依赖它。请根据操作系统选择对应的安装方式。3. 验证安装kubectl version该命令同时输出客户端client与服务端server版本信息用于确认kubectl已正确连接到集群。4. 启用所需插件部分场景需要额外的 Minikube 插件例如动态供给所需的 storage-provisionerminikube addons enable addon-name例如minikube addons enable storage-provisioner。在 Minikube 中standardStorageClass 由默认的 storage-provisioner 自动创建PVC 无需管理员手工预置 PV 即可完成绑定这为后续体验动态供给提供了现成条件。三、深入 Persistent Volume 类型按场景选型Kubernetes 支持多种持久卷类型适配不同的存储需求与运行环境。理解每种类型的适用边界是正确选型的前提。HostPath单节点测试专用HostPath 卷直接使用节点Node文件系统上的某个文件或目录作为存储。它不经过任何网络或抽象层配置最简单但数据与特定节点绑定Pod 被调度到其他节点时无法访问原数据。apiVersion: v1 kind: PersistentVolume metadata: name: example-hostpath spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data适用场景单节点测试与本地开发。Minikube 只有一个节点使用 HostPath 验证 PV/PVC 的绑定流程非常直观。生产环境应避免使用因为其不具备跨节点能力也与节点本地生命周期强耦合。NFS多节点共享读写NFSNetwork File System卷允许多个节点同时挂载同一份共享存储非常适合多个 Pod 之间交换数据、或者需要跨节点读写的场景。apiVersion: v1 kind: PersistentVolume metadata: name: example-nfs spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: /usr/local/path server: nfs-server-ip配置时需指定 NFS 服务器的 IPserver与导出的路径path。NFS 的ReadWriteMany访问模式使其成为共享文件型应用的常用选择但性能受限于网络与 NFS 服务端能力。AWS EBS云厂商块存储AWS Elastic Block StoreEBS是 Amazon 提供的块级存储服务为 EC2 实例提供持久化磁盘。作为云上生产环境的主流选择EBS 提供高可靠性与快照能力但属于区域region级资源通常只能被同一可用区内的单个节点挂载对应ReadWriteOnce。原文档给出的示例 YAML 中实际混入了azureDisk字段属于 Azure 的卷类型在真实应用中应使用正确的awsElasticBlockStore字段定义apiVersion: v1 kind: PersistentVolume metadata: name: aws-ebs-prod-ec2 spec: capacity: storage: 16Gi accessModes: - ReadWriteOnce awsElasticBlockStore: volumeID: volume-id fsType: ext4需要特别说明的是直接定义静态 PV 并要求volumeID指向已存在的 EBS 卷仅适合存量卷迁移等特殊场景。云上更推荐的做法是定义 StorageClass让集群动态创建 EBS 卷见本文第五节避免手工管理卷的创建、命名与回收。四、创建与配置 Persistent Volume从 YAML 到绑定4.1 定义一个 PV 并应用将以下清单保存为pv.yamlapiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain hostPath: path: /mnt/data使用kubectl应用kubectl apply -f pv.yaml成功后输出类似persistentvolume/example-pv created随后可用kubectl get pv查看 PV 状态此时其STATUS应为Available等待被 PVC 绑定。4.2 访问模式Access Modes访问模式决定了 PV 可以被如何挂载使用是 PV/PVC 匹配的核心约束之一。常见取值访问模式缩写含义ReadWriteOnceRWO卷可被单个节点以读写方式挂载ReadOnlyManyROX卷可被多个节点以只读方式挂载ReadWriteManyRWX卷可被多个节点以读写方式挂载注意访问模式描述的是节点层面的挂载能力而非 Pod 数量。此外并非所有存储类型都支持全部模式——例如 AWS EBS 通常仅支持ReadWriteOnceNFS 则可支持ReadWriteMany选型时需结合第三节的卷类型特性综合判断。4.3 存储类StorageClassStorageClass 用于定义不同的存储档次例如不同性能等级的磁盘gp2、gp3、io1 等。在 PV 定义中通过storageClassName字段指定apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: storageClassName: gp2当 PV 与 PVC 都声明了storageClassName时Kubernetes 只会在同名存储类范围内进行绑定匹配。未声明存储类的 PV/PVC 之间则按默认 StorageClass规则处理集群中标记为 default 的存储类这是 PVC 能否绑定到预期 PV 的关键细节排查Pending状态的 PVC 时需重点检查。五、使用 Persistent Volume Claim声明、绑定与挂载5.1 创建并管理 PVCPVC 的声明方式与 PV 类似保存为pvc.yamlapiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi应用kubectl apply -f pvc.yaml常用管理命令kubectl get pvc # 列出所有 PVC 及其绑定状态 kubectl delete pvc mypvc # 删除指定 PVCPVC 创建后Kubernetes 会在集群中寻找满足条件的 PV容量 ≥ 请求值、访问模式匹配、存储类匹配完成绑定。若存在可用的静态 PVPVC 状态将从Pending变为Bound若无匹配 PV 但存在对应 StorageClass则会触发动态供给见第六节。5.2 在 Pod 中引用 PVC 并理解绑定过程Pod 本身不直接接触 PV而是通过persistentVolumeClaim引用 PVCapiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: nginx volumeMounts: - mountPath: /var/www/html name: myvolume volumes: - name: myvolume persistentVolumeClaim: claimName: mypvc这里的mountPath指定了容器内挂载点claimName指向已创建的 PVC。Pod 调度到节点后kubelet 会将绑定到该 PVC 的 PV 实际挂载进容器。验证 Pod 是否成功挂载kubectl describe pod mypod在输出中检查Volumes与Mounts字段PVC 名称、挂载路径应如清单所定义若绑定或挂载失败Events部分会给出具体的错误原因例如存储类不匹配、容量不足、节点无法访问存储等这是排查存储问题最直接的入口。六、高级场景动态卷供给Dynamic Volume Provisioning手工创建 PV 的方式称为静态供给管理员必须预先创建足够多的 PV 才能响应后续 PVC 请求维护成本高、利用率低。动态供给则让存储卷在 PVC 提出请求时自动创建彻底免去管理员手工管理 PV 的工作。动态供给的核心是一个存储供给器storage provisioner它本质上是运行在集群中的控制器持续监听 PVC 的创建事件依据 PVC 中声明的存储需求自动创建 PV并完成绑定。常见的供给器包括云厂商提供的 EBS/CSI 驱动、Minikube 内置的 storage-provisioner 等。以 AWS EBS 供给器为例完整流程分为三步步骤 1创建 StorageClass。StorageClass 定义了供给参数如卷类型、区域、回收策略供给器会依据这些参数创建 PVapiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: my-storage-class provisioner: my-provisioner步骤 2创建 PVC。PVC 声明容量与访问模式写法同第五节并在storageClassName中指向步骤 1 的 StorageClass。PVC 创建后供给器立即感知并动态创建对应的 PV。步骤 3创建 Pod 并引用 PVCapiVersion: v1 kind: Pod metadata: name: production-pod-ec2 spec: containers: - name: production-api-container image: busybox volumeMounts: - name: production-EU-PVC mountPath: /mnt/data volumes: - name: production-EU-PVC persistentVolumeClaim: claimName: prod-pvcPod 创建完成后供给器自动产出满足 PVC 需求的 PVPod 随即挂载该 PV 访问存储。整个过程对应用透明开发者只关心我要多大、怎么访问不关心卷在哪、叫什么。查看供给结果kubectl get pv kubectl get pvc此时应能看到新 PV 被自动创建并与 PVC 呈Bound状态。动态供给让存储管理从运维手工操作进化为按需自服务是生产环境推荐的标准模式。七、PV 生命周期管理扩容与回收扩容Expanding Volumes存储容量不足时可通过在线扩容扩展 PVC。前提是 StorageClass 启用了扩容能力apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: gp2 allowVolumeExpansion: true # 关键开关随后编辑 PVC调大请求容量kubectl edit pvc mypvc将spec.resources.requests.storage从1Gi改为2Gi后保存即可。注意并非所有存储类型都支持在线扩容且扩容通常只能增大不能缩小。回收Reclaiming VolumesPV 的persistentVolumeReclaimPolicy决定了 PVC 被删除后 PV 的去向有三个取值策略行为Retain保留 PV 及其底层存储由管理员手工处理后续清理与复用Delete删除 PV 时同时删除底层存储资产云上会自动释放 EBS 等卷Recycle已废弃不再推荐使用apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: persistentVolumeReclaimPolicy: Retain对于包含重要数据的卷应使用Retain防止误删对于可重建的临时数据Delete能自动清理云资源、避免费用累积。这是成本控制与数据安全之间的关键权衡点。八、持久化存储的安全考量RBAC 权限管控通过 Role-Based Access ControlRBAC限制谁能创建、修改、删除 PVC防止未授权用户申请任意容量存储或访问敏感数据卷。最小权限原则同样适用于供给器与存储管理组件的 ServiceAccount。静态加密Encryption at Rest为存储卷启用落盘加密以保护敏感数据。云厂商的块存储如 EBS支持托管加密自建存储如 NFS则应在文件系统层或存储设备层落实加密方案。访问模式与共享边界根据安全与共享需求谨慎选择访问模式——ReadWriteOnce限制单节点访问天然收窄数据暴露面ReadWriteMany提供共享能力但也意味着更多工作负载可接触数据需配合鉴权与网络策略一起使用。九、仓库中的真实部署佐证refine 文档站 Helm Chart作为本文技术主题的仓库内实例refine 仓库自带了官方文档站的 Kubernetes 部署清单Helm Chart位于 documentation/k8s/refine-documentation 目录。其中 templates/deployment.yaml 定义了 Deployment 工作负载包含 livenessProbe/readinessProbe 健康检查、容器端口 80 等标准配置values.yaml 则集中管理 replicaCount、镜像仓库、serviceAccount、ingress 等可调参数。值得注意的观察点该 Chart 的默认values.yaml中并未配置任何 volume/PVC 字段。这恰恰印证了本文的核心论断——静态内容型应用如文档站点属于无状态工作负载无需持久卷即可运行而一旦应用需要保存数据库、上传文件、用户数据等有状态信息就必须引入本文所讲的 PV/PVC 机制。这套 Helm Chart 因此可以作为学习 Kubernetes 清单组织方式的现成范例把无状态部分与有状态部分清晰划分仅在真正需要持久化时才引入存储声明是合理架构设计的体现。十、延伸阅读与结论本仓库的 documentation/blog 目录下维护着一整套 Kubernetes 实战系列文章可作为进一步学习路径Kubernetes CronJob 基础详解定时任务的调度、配置与排错其中数据库备份等典型场景正依赖本文的持久化存储能力Kubernetes CrashLoopBackOff 解析与修复Pod 反复崩溃的状态排查其中挂载配置错误正是常见的崩溃根因之一可与本文的挂载验证方法相互印证。总结本文围绕 Kubernetes Persistent Volumes 与 Persistent Volume Claims 构建了从概念到实战的完整知识链先厘清 PV存储供给方与 PVC存储消费方的职责分离以及持久存储与emptyDir等临时存储的本质差异再通过 Minikube 搭建本地实验环境逐一剖析 HostPath、NFS、AWS EBS 三类典型卷的适用边界随后完整走通创建 PV → 声明 PVC → 绑定 → Pod 挂载的标准流程并深入访问模式、StorageClass 与绑定匹配规则等关键细节最后进阶到动态卷供给、卷扩容与回收策略、RBAC 与加密等安全加固实践。无论是为有状态应用规划存储架构还是排查 PVC 无法绑定的问题本文提供的清单、命令与决策原则都可以直接落地复用。掌握 PV/PVC就等于掌握了 Kubernetes 中有状态应用的数据底座。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表