
# Volume
容器中的文件在磁盘上是临时存放的，当容器重建时，容器中的文件将会丢失，另外当在一个Pod中同时运行多个容器时，常常需要在这些容器之间共享文件，这也是容器不好解决的问题。 Kubernetes抽象出了Volume来解决这两个问题，也就是存储卷，Kubernetes的Volume是Pod的一部分，Volume不是单独的对象，不能独立创建，只能在Pod中定义。
Pod中的所有容器都可以访问Volume，但必须要挂载，且可以挂载到容器中任何目录。
实际中使用容器存储如下图所示，将容器的内容挂载到Volume中，通过Volume两个容器间实现了存储共享。
![](https://support.huaweicloud.com/basics-cce/zh-cn_image_0259669841.png "点击放大")
Volume的生命周期与挂载它的Pod相同，但是Volume里面的文件可能在Volume消失后仍然存在，这取决于Volume的类型。
#### Volume的类型
Kubernetes的Volume有非常多的类型，在实际使用中使用最多的类型如下。
- emptyDir：一种简单的空目录，主要用于临时存储。
- hostPath：将主机某个目录挂载到容器中。
- ConfigMap、Secret：特殊类型，将Kubernetes特定的对象类型挂载到Pod，在[ConfigMap](https://support.huaweicloud.com/basics-cce/kubernetes_0020.html)和[Secret](https://support.huaweicloud.com/basics-cce/kubernetes_0021.html)章节介绍过如何将ConfigMap和Secret挂载到Volume中。
- persistentVolumeClaim：Kubernetes的持久化存储类型，详细介绍请参考[PV、PVC和StorageClass](https://support.huaweicloud.com/basics-cce/kubernetes_0030.html)中会详细介绍。
 
#### EmptyDir
EmptyDir是最简单的一种Volume类型，根据名字就能看出，这个Volume挂载后就是一个空目录，应用程序可以在里面读写文件，emptyDir Volume的生命周期与Pod相同，Pod删除后Volume的数据也同时删除掉。
emptyDir的一些用途：
- 缓存空间，例如基于磁盘的归并排序。
- 为耗时较长的计算任务提供检查点，以便任务能从崩溃前状态恢复执行。
emptyDir配置示例如下。
```
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - image: nginx:alpine
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}
```
emptyDir实际是将Volume的内容写在Pod所在节点的磁盘上，另外emptyDir也可以设置存储介质为内存，如下所示，medium设置为Memory。
```
volumes:
  - name: html
    emptyDir:
      medium: Memory
```
#### HostPath
HostPath是Kubernetes中一种基于节点本地文件系统的持久化存储卷类型，可将节点上的特定文件或目录挂载到Pod内部，使Pod能够直接访问节点的文件资源。与主要用于临时存储的emptyDir相比，HostPath存在以下特点：
- 数据生命周期与节点绑定：在节点磁盘未发生损坏的前提下，即使Pod被删除、重建或调度至其他节点时，数据仍可恢复使用。
- 支持跨Pod共享节点级资源：节点上的多个Pod（在权限允许的情况下），可通过挂载相同的HostPath路径实现数据共享。
- 可直接复用节点预存数据：HostPath能挂载节点上已存在的文件或目录（如系统配置文件、硬件驱动程序等），容器可直接读取或修改这些预存内容。
HostPath适用于开发调试、系统组件部署或需要访问宿主机资源的场景，如需要在Pod中挂载宿主机日志目录、Docker引擎或本地缓存路径等。此外，HostPath存在一定局限性，使用时需谨慎：
- 因与节点强绑定，既无法灵活迁移（缺乏可移植性），也不支持跨节点共享数据和动态分配存储。
- 安全风险突出，若挂载节点敏感路径（如/etc、/var/run/docker.sock），可能导致容器越权访问节点资源。
- 数据持久性较弱，一旦节点故障或磁盘损坏，存储的数据易丢失。
因此，像数据库这类对数据安全性、可靠性要求高的生产环境，并不适合使用HostPath。
```
apiVersion: v1
kind: Pod
metadata:
  name: test-hostpath
spec:
  containers:
  - image: nginx:alpine
    name: hostpath-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data
```
