在 Kubernetes(K8s)中,卷(Volume) 是用于解决容器内数据持久化、容器间数据共享以及与外部存储交互的核心机制。它本质上是一个可供 Pod 中容器访问的存储目录,生命周期独立于容器(容器重启或销毁后,卷中的数据可保留)。
一、卷的核心作用
- 数据持久化:容器本身是临时的(销毁后数据丢失),卷可将数据存储在容器外部(如本地磁盘、网络存储),确保数据不随容器消失。
- 容器间共享:同一 Pod 内的多个容器可通过挂载同一个卷实现数据共享(如前端容器生成的文件供后端容器处理)。
- 对接外部存储:卷支持多种存储类型(本地磁盘、NFS、云存储等),让 Pod 能便捷使用集群外的存储资源。
二、卷的类型与常见实例
K8s 支持多种卷类型,适用于不同场景,以下是常用类型及实例:
1. 临时卷(Ephemeral Volumes)
-
特点:生命周期与 Pod 一致(Pod 销毁后卷也删除),但数据不依赖单个容器,适合临时缓存、日志等。
-
常见类型:
emptyDir
:Pod 创建时自动生成的空目录,所有容器可读写,Pod 销毁后数据删除。
实例:同一 Pod 内的两个容器共享数据
yaml
apiVersion: v1 kind: Pod metadata: name: shared-pod spec: containers: - name: container-1 image: busybox command: ["sh", "-c", "echo 'hello from container1' > /shared/data.txt; sleep 3600"] volumeMounts: # 挂载卷到容器内目录 - name: shared-volume mountPath: /shared - name: container-2 image: busybox command: ["sh", "-c", "cat /shared/data.txt; sleep 3600"] volumeMounts: # 挂载同一个卷 - name: shared-volume mountPath: /shared volumes: # 定义卷 - name: shared-volume emptyDir: {} # 使用 emptyDir 类型
2. 持久卷(Persistent Volumes)
- 特点:生命周期独立于 Pod(集群级资源),数据长期保留,需配合 PVC(PersistentVolumeClaim) 使用(详见前文 PV/PVC 概念)。
- 实例:通过 PVC 挂载持久卷
yaml
apiVersion: v1 kind: Pod metadata: name: pvc-pod spec: containers: - name: app image: nginx volumeMounts: - name: pv-storage mountPath: /usr/share/nginx/html volumes: - name: pv-storage persistentVolumeClaim: claimName: my-pvc # 关联已创建的 PVC
3. 本地卷(Local Volumes)
- 特点:使用节点(Node)本地磁盘作为存储,性能高但数据仅存于单个节点(节点故障可能丢失数据),适合对性能要求高的场景(如数据库临时缓存)。
- 实例:挂载节点的
/data/local
目录yaml
apiVersion: v1 kind: Pod metadata: name: local-volume-pod spec: containers: - name: app image: busybox command: ["sleep", "3600"] volumeMounts: - name: local-storage mountPath: /mnt/local volumes: - name: local-storage hostPath: path: /data/local # 节点上的实际目录 type: DirectoryOrCreate # 若目录不存在则创建
4. 网络卷(Network Volumes)
- 特点:数据存储在网络中的远程服务器,可跨节点访问,适合多 Pod 共享数据(如 NFS、Ceph、云存储等)。
- 实例:挂载 NFS 网络存储
yaml
apiVersion: v1 kind: Pod metadata: name: nfs-pod spec: containers: - name: app image: busybox command: ["sleep", "3600"] volumeMounts: - name: nfs-storage mountPath: /mnt/nfs volumes: - name: nfs-storage nfs: server: 172.25.254.254 # NFS 服务器 IP path: /nfs/shared # NFS 共享目录
三、卷的使用流程
- 定义卷:在 Pod 的
volumes
字段中声明卷的名称和类型(如emptyDir
、hostPath
、persistentVolumeClaim
等)。 - 挂载卷:在容器的
volumeMounts
字段中,将卷挂载到容器内的指定路径(mountPath
)。 - 使用数据:容器通过挂载路径读写卷中的数据,实现数据共享或持久化。
四、核心总结
- 本质:卷是 Pod 内的存储目录,生命周期独立于容器,解决数据持久化和共享问题。
- 类型:根据场景选择(临时存储用
emptyDir
,持久化用 PV/PVC,本地高性能用hostPath
,跨节点共享用 NFS 等网络卷)。 - 关键:卷是 Pod 级资源,同一 Pod 内的容器可共享卷;跨 Pod 共享需依赖网络存储或 PV/PVC。
通过卷,K8s 实现了容器与存储的解耦,让应用数据管理更灵活、可靠。