Kubernetes管理的Node本地存储卷(Volume)的类型如下。

  • EmptyDir:与Pod同生命周期的Node临时存储。
  • HostPath:Node目录。
  • Local:基于持久卷(PV)管理的Node目录。

对如何以存储卷的形式使用说明如下:

1. EmptyDir

这种类型的Volume在Pod被调度到Node时进行创建,在初始状态下目录中是空的,所以命名为“空目录”(Empty Directory),它与Pod具有相同的生命周期,当Pod被销毁时,Node上相应的目录也会被删除。同一个Pod中的多个容器都可以挂载这种Volume。
由于EmptyDir类型的存储卷的临时性特点,它通常可以用于以下应用场景中。

  • 基于磁盘进行合并排序操作时需要的暂存空间。
  • 长时间计算任务的中间检查点文件。
  • 为某个Web服务提供的临时网站内容文件。

默认情况下,kubelet会在Node的工作目录下为Pod创建EmptyDir目录,这个目录的存储介质呢能是本地磁盘,SSD磁盘或者网络存储设备。另外EmptyDir可以通过medium字段设置存储介质为“Memory”,表示使用基于内存的文件系统(tmpfs、RAM-backed filesystem)。

下面是使用EmptyDir类型的存储卷的Pod的YAML配置示例,该类型的存储卷的参数只有一对花括号{}:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - image: busybox
    name: test-container
    command: ["sh", "-c"]
    args:
    - while true; do
        sleep 3600;
      done;
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

2.HostPath

HostPath类型的存储卷用于将Node文件系统的目录或文件系统挂载到容器内部使用。对于大部分容器应用来说,都不需要使用宿主机的文件系统。适合使用HostPath存储卷的一些应用场景如下:

  • 容器应用的关键数据需要被持久化到宿主机上。
  • 需要使用Docker中的某些内部数据,可以将主机的/var/lib/docker目录挂载到容器内。
  • 监控系统,例如cAdvisor需要采集宿主机/sys目录下的内容。
  • Pod的启动以来于宿主机上的某个目录或文件就绪的场景。

HostPath存储卷的主要配置参数为path,设置为宿主机的目录或文件路径;还可以设置一个可选参数type,表示宿主机路径的类型。目前支持的type配置参数和校验规则如下表:

type配置参数 校验规则
系统默认值,为向后兼容的设置,意为系统在挂载path时不做任何校验
DirectoryOrCreate path指定的路径必须是目录,如果不存在,则系统将自动创建该目录,将权限设置为0755,与kubelet具有相同的owner和group
Dictory path指定的目录必须存在,否则挂载失败
FileOrCreate path指定的路径必须是文件,如果不存在,则系统将自动创建该文件,将权限设置为0644,与kubelet具有相同的owner和group
FIle path指定的文件必须存在,否则挂载失败
Socket path指定的UNIX socket必须存在,否则挂载失败
CharDevice path指定的字符设备(character device)必须存在,否则挂载失败
BlockDevice path指定的块设备(block device)必须存在,否则挂载失败

下面是使用HostPath类型的存储卷的Pod的YAML配置示例,其中将宿主机的/data目录挂载为容器内的/host-data目录:

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - image: busybox
    name: test-container
    command: ["sh", "-c"]
    args:
    - while true; do
        sleep 3600;
      done;
    volumeMounts:
    - mountPath: /host-data
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data         # 宿主机目录
      type: Directory     # 可选,“Directory”表示该目录必须存在

对于type为FileOrCreate模式的情况,需要注意的是,如果挂载文件有上层目录,则系统不会自动创建上层目录,当上层目录不存在时,Pod将启动失败。这种情况下,可以将上层目录页设置一个hostPath类型的Volume,并设置type为DirectoryOrCreate,确保目录不存在时,系统会将该目录自动创建出来。

apiVersion: v1
kind: Pod
metadata:
  name: test-webserver
spec:
  containers:
  - name: test-webserver
    image: busybox
    command: ["sh", "-c"]
    args:
    - while true; do
        sleep 3600;
      done;
    volumeMounts:
    - mountPath: /data/aaa
      name: mydir
    - mountPath: /data/aaa/1.txt
      name: myfile
  volumes:
  - name: mydir
    hostPath:
      path: /data/aaa
      type: DirectoryOrCreate
  - name: myfile
    hostPath:
      path: /data/aaa/1.txt
      type: FileOrCreate

参考:《kubernetes权威指南:(第五版)》