Volume 存储卷

容器被删除或重建后,文件系统里的数据会随之消失;同一 Pod 的多个容器之间也需要共享数据。Volume(存储卷)把外部存储挂载到容器的指定目录,让数据脱离容器生命周期,并支持同一 Pod 内多容器共享。

emptyDir:Pod 级临时共享

emptyDir 随 Pod 创建、随 Pod 删除而清空,适合边车容器交换数据、临时缓存:

apiVersion: v1
kind: Pod
metadata:
  name: share-demo
spec:
  containers:
    - name: writer
      image: busybox
      command: ["sh", "-c", "echo hi > /data/a.txt; sleep 3600"]
      volumeMounts:
        - name: tmp
          mountPath: /data
    - name: reader
      image: busybox
      command: ["sh", "-c", "cat /data/a.txt; sleep 3600"]
      volumeMounts:
        - name: tmp
          mountPath: /data
  volumes:
    - name: tmp
      emptyDir: {}

同一 Pod 内多个容器挂同一个卷即可互相读写。默认用节点磁盘,改成内存(tmpfs)速度更快但不落盘:

volumes:
  - name: tmp
    emptyDir:
      medium: Memory

hostPath:使用节点目录

hostPath 直接挂载工作节点上的目录,Pod 调度到哪台节点就读写哪台节点的路径:

volumes:
  - name: node-log
    hostPath:
      path: /var/log/myapp      # 节点上的绝对路径
      type: DirectoryOrCreate

适合读取节点系统数据等运维场景。风险在于数据与节点绑定:Pod 漂移后数据不在原节点、多副本也无法真正共享,普通应用应避免。

CSI:容器存储接口

CSI(Container Storage Interface)是存储接入的标准接口:存储厂商实现插件,Kubernetes 统一调用,用户不必关心底层差异。常用插件有 NFS、云厂商云盘、文件存储等。例如直接挂一个 NFS 卷:

apiVersion: v1
kind: Pod
metadata:
  name: nfs-demo
spec:
  containers:
    - name: app
      image: nginx
      volumeMounts:
        - name: share
          mountPath: /data
  volumes:
    - name: share
      nfs:
        server: 192.168.1.100     # NFS 服务器地址
        path: /exports/data       # 共享目录

与 PV/PVC 的分工

以上卷都要在 Pod 里写死存储细节(地址、类型),既难复用也不便管理。下一章将介绍的 PV 与 PVC 把「存储的提供」和「存储的使用」分开:管理员准备存储(PV),应用只声明需要多大(PVC),Pod 通过 PVC 引用,存储细节对应用透明,这才是持久化存储的标准姿势。

小结:emptyDir 适合 Pod 内临时共享、hostPath 直连节点目录但绑定节点需慎用、CSI 统一接入 NFS/云盘等外部存储;需要跨 Pod 存活的持久数据时,就该交给 PV/PVC。

笔记加载中…