emptyDir、hostPath、local
emptyDir # 在 Pod 的生命周期中的空目录
该类型的 Volume 会随着 Pod 的摧毁重建而自动还原成初始状态。Pod 会创建一个逻辑上的 volume,把该 volum 挂载到一个 Pod 中每个 container 所定义的目录,所有 container 对自己挂载 volume 的目录进行的操作都会在其余 container 挂载该 volume 的目录中看到(每个 container 用于挂载的目录可以不一样,但是用到的 volume 都是同一个)。
- medium:指定 volum 的存储媒介(即 volum 使用的存储资源),默认使用 memory,这样两个容器的数据交互速度会非常快 
- sizeLimit:容量大小限制,限制 volume 的最大存储空间,如果不做限制,那么对于设备来说,用户数据交互的 volume 会非常浪费资源 
- 获取 emptyDir 类型的 volume 在宿主机的路径的方式: - 首先通过 kubectl get pod PODNAME -o yaml | grep uid 来获取 pod 的标识符 
- 然后在目录/var/lib/kubelet/pods/PodID/volumes/kubernets.io~empty-dir/下面找到所有该 pod 所挂载的 empty 类型的 volume,该目录与 pod 中的目录是同步的,在该目录增删改的信息同样也会影响到 pod 对应的目录中。 
 
hostPath # Node 上的文件或目录
hostPath 类型的 Volume 会将节点上的文件或目录挂载到 Pod 中。
hostPath 常用于将节点上的目录挂载到容器中,以便让容器可以读取目录中的内容执行一些操作,比如:
- 运行一个需要访问节点日志的容器(比如 Loki),使用 hostPath 类型的卷挂载节点上的 /var/log/pods 目录到容器中。以便 Loki 可以采集宿主机的日志。 
- 在容器中运行 cAdvisor 时,以 hostPaht 的方式挂载节点的 /sys 目录。 
- 使用 hostPath 作为 volume 时,有两个参数需要指定: - path:指明 Node 上的哪个文件或者目录作为 volume 提供给 container 
- type:Node 上目录或文件的使用行为,比如 - DirectoryOrCreate # 如果指定 path 不存在,则自动创建,并设置权限为 0755,具有有 kubelet 相同的组和所有权 
- Directory # 指定 path 必须存在,不存在则报报错 
- ….等等,详见官网 
 
 
注意:
- hostPath 类型的 volume 关联的目录,并不会自动变更权限,自动创建出来后,如果 容器 不以 root 身份运行,则有可能会没有权限对该目录进行读写操作 
- hostPath 类型的 volume 不会随着 Pod 的摧毁重建而自动还原成初始状态。这种类型会把 Node 上的本地存储资源当作 volume 给 container 使用,保证了数据的持久性,但是当 pod 重建时,如果不被分配到原 Node,则该数据会变成另一个 Node 上的数据,没法使用原数据了,不够灵活。 
local # 指定 Node 上的存储设备(如 磁盘、分区、目录)
注意:local 类型的卷暂时只能在静态的 Persistent Volume 持久卷 中使用。
- local 会根据容器所需要的权限,自动更改关联目录的权限 
- 相比于 hostPath 卷,local 卷更像是存储数据所用,而 hostPath 更偏向于容器共享宿主机目录。只不过 local 卷只能在 PV 中使用,并必须指定节点亲和性,以便将 PV 绑定到指定的节点上。这样,pod 在使用对应 PVC 时,则会自动调度到 PV 所在的 节点上,而不用给 pod 手动指定 nodeselector 了。 
Manifests 示例
hostPath 类型
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
    - image: k8s.gcr.io/test-webserver
      name: test-container
      volumeMounts:
        - mountPath: /test-pd # 指定要改volume要挂载到容器的哪个目录下
          name: test-volume # 指定要使用的volume,该字段的值为.volumes.name中的值
  volumes:
    - name: test-volume # 指定volume的名字,用于pod挂载volume时所用
      hostPath: # 指定volume的类型,该字段下面的字段为该类型的参数,不同的类型有不通的参数
        path: /data
        type: Directory
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.