找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

375

积分

0

好友

51

主题
发表于 昨天 03:56 | 查看: 7| 回复: 0

在应用上云与容器化的大潮中,Kubernetes 已成为事实上的标准平台。而在所有核心能力中,存储体系往往是最易被忽视、却最需要理解清楚的一环。因为 Pod 会销毁,但数据不能丢

1、为什么容器需要持久化存储?

Kubernetes 中的 Pod 是短暂的、易变的:

  • 重建 → 目录重置
  • 调度到新节点 → 本地文件丢失
  • 版本升级 → 数据不保证存在

这意味着: ⛔ 写入容器本地 /data 目录的文件无法在 Pod 重启后保留。 ✔ 必须使用 Kubernetes Volume 或 PV/PVC/SC 来实现真正的持久化。

2、Volume:最基础的存储单元

Volume 是挂载到 Pod 里的目录,生命周期跟随 Pod。它是容器访问外部存储的接口,但并不解决存储资源的全生命周期管理。

常用 Volume 类型包括 hostPath、emptyDir、NFS、云存储插件(如 AWS EBS, Google Persistent Disk)以及后来更为主流的 PersistentVolumeClaim

Volume类型示意图

3、PV(PersistentVolume):集群级资源

PV 是集群管理员提供的“存储池”,代表了集群中的一块真实、独立的网络存储资源,类似于云盘、NAS或分布式存储卷。

PV 有两种提供方式:

  • 静态供应(Static Provisioning):管理员手动创建 PV。
  • 动态供应(Dynamic Provisioning):依赖 StorageClass 自动创建(推荐)。

以下是一个 NFS 类型 PV 的示例:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data
    server: 10.0.0.10

4、PVC(PersistentVolumeClaim):用户对存储的需求声明

PVC 是用户(开发者)提交的“存储申请单”,它不关心底层存储的具体细节,只声明所需存储的容量、访问模式等规格。系统会自动寻找符合要求的 PV 与之绑定。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

当 PVC 与 PV 成功绑定后,Pod 即可挂载该 PVC 来使用持久化存储。

5、StorageClass:动态供应的关键

如果你不想每次都让管理员手动创建 PV,那么 StorageClass 就是实现自动化供应的“工厂模板”。它定义了提供存储的驱动(Provisioner)和参数,当用户创建 PVC 并指定对应的 StorageClass 时,Kubernetes 会自动按需创建 PV。

常见的 Provisioner 包括 ebs.csi.aws.comdiskplugin.csi.alibabacloud.com 等,其强大的动态供应能力是云原生架构中存储管理的核心。

典型 StorageClass 示例:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
  type: cloud_ssd
reclaimPolicy: Retain

当 PVC 指定 storageClassName: fast-ssd 时,系统将自动完成 PV 创建、绑定到 PVC 的全过程。

6、三者关系图解

用户(开发者)
        │ 申请
        ▼
PVC(需求声明:我要多大?什么模式?)
        │ 匹配/动态创建
        ▼
PV(实际卷:NFS、云盘、Ceph、NAS)
        │ 与 Pod 挂载
        ▼
Pod(业务容器读取/写入数据)

如果启用了 StorageClass,流程简化为:PVC → 触发 StorageClass 自动创建 PV → 挂载到 Pod,实现存储的按需、自动化分配。

一句话概括:Pod 通过 PVC 申请存储,PVC 绑定到 PV,而 PV 可由 StorageClass 动态创建。

7、实战示例:Pod 挂载持久化卷

以下示例展示了如何在 Pod 中挂载一个已存在的 PVC:

apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
  - name: web
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: html-volume
  volumes:
  - name: html-volume
    persistentVolumeClaim:
      claimName: data-claim

Pod 被删除后,数据依然安全地保留在底层的 PV 中。

8、关键参数与最佳实践

AccessModes(访问模式)

  • ReadWriteOnce (RWO):可被单个节点读写挂载。
  • ReadOnlyMany (ROX):可被多个节点只读挂载。
  • ReadWriteMany (RWX):可被多个节点读写挂载。通常由 NFS、CephFS 等文件系统提供。

ReclaimPolicy(回收策略)

  • Retain:保留数据,管理员手动清理。最安全。
  • Delete:PVC 删除后自动删除后端存储(如云盘)。需谨慎。
  • Recycle:已废弃。

最佳实践建议

生产环境优先使用 CSI (Container Storage Interface) 插件,功能更强大、标准化。 ✔ 建议 RWX 访问模式使用 NAS / CephFS 等文件存储,RWO 使用块存储(如云盘)。 ✔ 利用 StorageClass 实现存储资源的自动化供应与管理。 ✔ 严禁在生产环境使用 hostPath,存在安全与数据可靠性风险。

9、总结

Kubernetes 持久化存储是 Stateful(有状态)应用落地的关键基石。Volume、PV、PVC、StorageClass 四者协同工作,构建了一套灵活、自动化的存储管理体系。

  • Volume:是 Pod 内的挂载点。
  • PV:是集群中的实际存储资源。
  • PVC:是用户对存储资源的需求声明。
  • StorageClass:是按需、自动创建 PV 的工厂模板。

理解并掌握这套机制,是你在 Kubernetes 上成功部署数据库、消息队列、文件服务等有状态服务的基础。对于构建健壮的云原生应用架构至关重要。




上一篇:OpenStack多节点部署实战指南:Ubuntu 24.04环境从零到一完整搭建
下一篇:Kubernetes cgroup v2避坑指南:Java应用内存识别错误与OOM解决
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-6 23:55 , Processed in 0.109811 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表