Myluzh Blog

K8S 存储卷使用总结

发布时间: 2025-1-15 文章作者: myluzh 分类名称: 朗读文章


使用场景 推荐方式
持久化存储(文件、数据库等) PVC 或 volumeClaimTemplates
配置和凭据管理 ConfigMap 和 Secret
临时数据存储 EmptyDir
访问主机文件 HostPath
动态云存储卷分配 CSI

0x01 PersistentVolumeClaim (PVC)
最通用的持久化存储方式。适用于绝大多数需要持久化数据的场景,例如数据库存储、文件共享。与各种存储插件兼容。
典型场景:数据库(MySQL、PostgreSQL、MongoDB)。
volumes:
  - name: app-data
    persistentVolumeClaim:
      claimName: app-data-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

0x02 volumeClaimTemplates
与 StatefulSet 一起使用,为每个 Pod 提供独立的持久化存储。动态分配存储,生命周期与 Pod 绑定,适合需要水平扩展的有状态应用。
典型场景:分布式数据库(Cassandra、Etcd),有状态应用(Kafka、ZooKeeper)。
volumeMounts:
  - name: mysql-data
    mountPath: /var/lib/mysql
---
volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      storageClassName: standard # 指定存储类,不写就是默认存储类。
修改默认存储类
如果需要更改默认存储类,可以执行以下命令
kubectl patch storageclass <storage-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

0x03 ConfigMap 和 Secret
配置管理的核心功能,用于存储配置信息或敏感数据。易于动态更新,无需修改 Pod。
典型场景:环境变量注入(数据库连接信息、API 密钥)。配置文件(应用程序配置、证书)。
volumes:
  - name: app-config
    configMap:
      name: app-config

0x04 EmptyDir
临时存储,使用简单,数据不需要持久化时非常适合。性能高,因为数据存储在节点本地的内存或磁盘中。
典型场景:临时数据缓存(如编译缓存、中间文件)。数据处理任务的中间结果。Pod 中不同容器的数据共享,当多个容器运行在同一个 Pod 中时,它们可以共享 EmptyDir 中的数据。由于所有容器都挂载了同一个 EmptyDir 卷,它们可以直接访问并共享这个卷中的文件。
volumes:
  - name: temp-storage
    emptyDir: {}

0x05 HostPath
直接访问主机文件系统,非常灵活,但存在安全和可移植性问题。常用于调试或需要主机特定路径时。
典型场景:调试日志或配置文件。主机特定文件(如 GPU 驱动程序)。
volumes:
  - name: host-storage
    hostPath:
      path: /data/host

0x06 CSI(Container Storage Interface)
原生存储的核心组件,支持动态存储卷分配和管理。与各种存储后端兼容(如 AWS EBS、Ceph、Google Persistent Disk)。
典型场景:云环境中动态分配存储卷。高级存储功能(如快照、克隆)。
volumes:
  - name: csi-storage
    csi:
      driver: ebs.csi.aws.com
      volumeHandle: volume-id




发表评论