Kubernetes存储全解析:从临时卷到持久化方案

一、卷(Volume)基础概念

在Kubernetes中,Volume(卷)是Pod中能够被多个容器访问的共享目录,解决了容器文件系统短暂性和数据共享的问题。

图1

二、临时卷(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: {}

实践建议

  1. 适合临时性数据,重要数据不要依赖emptyDir
  2. 可通过sizeLimit设置存储大小限制
  3. 默认使用节点磁盘,也可指定为内存(tmpfs)

三、持久卷(PV)与持久卷声明(PVC)

架构关系

图2

持久卷(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

实践建议

  1. 生产环境避免使用hostPath,推荐网络存储(如NFS、Ceph、云存储)
  2. 注意accessModes的三种模式区别:

    • ReadWriteOnce(RWO):单节点读写
    • ReadOnlyMany(ROX):多节点只读
    • ReadWriteMany(RWX):多节点读写
  3. 回收策略(persistentVolumeReclaimPolicy):

    • Retain:手动回收
    • Recycle:自动删除数据(已废弃)
    • Delete:自动删除PV(云存储支持)

四、存储类(StorageClass)

动态供给流程

图3

StorageClass示例

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  fsType: ext4

实践建议

  1. 不同云平台使用对应的provisioner
  2. 合理设置volumeBindingMode:

    • Immediate:立即绑定
    • WaitForFirstConsumer:延迟绑定(适合拓扑敏感的存储)
  3. 利用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

实践建议

  1. Secret虽然经过base64编码,但不是加密的,需要:

    • 启用KMS加密
    • 使用RBAC限制访问
    • 考虑Vault等专业方案
  2. ConfigMap更新后,需要:

    • 重启Pod(默认方式)
    • 或使用sidecar监控变更(如Reloader)
  3. 大型配置文件建议使用volume方式挂载

六、存储方案选型指南

需求场景推荐方案注意事项
临时数据emptyDir适合缓存、临时文件
单节点持久化PV+PVC(RWO模式)避免使用hostPath
多节点共享PV+PVC(RWX模式)需要存储系统支持(如NFS)
动态供给StorageClass云平台或CSI驱动支持
配置管理ConfigMap小于1MB数据
敏感信息Secret需要额外加密措施

七、常见问题排查

  1. PVC一直处于Pending状态

    • 检查StorageClass是否正确
    • 检查PV是否可用(kubectl get pv)
    • 检查存储后端是否正常
  2. Pod挂载Volume失败

    • 检查volumeMounts路径是否冲突
    • 检查PVC是否已绑定(kubectl get pvc)
    • 检查节点存储插件是否正常
  3. ConfigMap更新不生效

    • 确认使用volume方式挂载(支持热更新)
    • 检查更新时间戳(kubectl get cm -o yaml)
    • 考虑使用Reloader等工具

通过合理选择存储方案,可以满足从开发测试到生产环境的各种数据持久化需求。建议在非生产环境充分测试不同方案的性能和可靠性。

添加新评论