Kubernetes存储指南:从临时卷到持久化方案
Kubernetes存储全解析:从临时卷到持久化方案
一、卷(Volume)基础概念
在Kubernetes中,Volume(卷)是Pod中能够被多个容器访问的共享目录,解决了容器文件系统短暂性和数据共享的问题。
二、临时卷(emptyDir)
概念
emptyDir是最简单的卷类型,在Pod被分配到Node时创建,初始为空目录。Pod删除时,emptyDir中的数据也会被永久删除。
典型场景
- 临时数据交换
- 容器间共享文件
- 缓存目录
YAML示例
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: nginx-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
实践建议
- 适合临时性数据,重要数据不要依赖emptyDir
- 可通过
sizeLimit
设置存储大小限制 - 默认使用节点磁盘,也可指定为内存(tmpfs)
三、持久卷(PV)与持久卷声明(PVC)
架构关系
持久卷(PV)示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: slow
hostPath:
path: /data/pv0001/
持久卷声明(PVC)示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
storageClassName: slow
实践建议
- 生产环境避免使用hostPath,推荐网络存储(如NFS、Ceph、云存储)
注意
accessModes
的三种模式区别:- ReadWriteOnce(RWO):单节点读写
- ReadOnlyMany(ROX):多节点只读
- ReadWriteMany(RWX):多节点读写
回收策略(persistentVolumeReclaimPolicy):
- Retain:手动回收
- Recycle:自动删除数据(已废弃)
- Delete:自动删除PV(云存储支持)
四、存储类(StorageClass)
动态供给流程
StorageClass示例
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
fsType: ext4
实践建议
- 不同云平台使用对应的provisioner
合理设置volumeBindingMode:
- Immediate:立即绑定
- WaitForFirstConsumer:延迟绑定(适合拓扑敏感的存储)
- 利用
allowVolumeExpansion: true
支持卷扩容
五、配置与密钥管理
ConfigMap使用示例
# 创建ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: |
color=blue
size=large
# Pod中引用
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: app-config
Secret使用示例
# 创建Secret(base64编码)
echo -n 'admin' | base64
echo -n 'password123' | base64
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4=
password: cGFzc3dvcmQxMjM=
# Pod中引用
spec:
containers:
- name: db
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: db-secret
key: username
实践建议
Secret虽然经过base64编码,但不是加密的,需要:
- 启用KMS加密
- 使用RBAC限制访问
- 考虑Vault等专业方案
ConfigMap更新后,需要:
- 重启Pod(默认方式)
- 或使用sidecar监控变更(如Reloader)
- 大型配置文件建议使用
volume
方式挂载
六、存储方案选型指南
需求场景 | 推荐方案 | 注意事项 |
---|---|---|
临时数据 | emptyDir | 适合缓存、临时文件 |
单节点持久化 | PV+PVC(RWO模式) | 避免使用hostPath |
多节点共享 | PV+PVC(RWX模式) | 需要存储系统支持(如NFS) |
动态供给 | StorageClass | 云平台或CSI驱动支持 |
配置管理 | ConfigMap | 小于1MB数据 |
敏感信息 | Secret | 需要额外加密措施 |
七、常见问题排查
PVC一直处于Pending状态
- 检查StorageClass是否正确
- 检查PV是否可用(kubectl get pv)
- 检查存储后端是否正常
Pod挂载Volume失败
- 检查volumeMounts路径是否冲突
- 检查PVC是否已绑定(kubectl get pvc)
- 检查节点存储插件是否正常
ConfigMap更新不生效
- 确认使用
volume
方式挂载(支持热更新) - 检查更新时间戳(kubectl get cm -o yaml)
- 考虑使用Reloader等工具
- 确认使用
通过合理选择存储方案,可以满足从开发测试到生产环境的各种数据持久化需求。建议在非生产环境充分测试不同方案的性能和可靠性。