K8S 存储卷使用总结
作者:myluzh 分类: Kubernetes 长度:2644 阅读:304
使用场景 | 推荐方式 |
---|---|
持久化存储(文件、数据库等) | 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