Kubernetes管理的Node的本地存储卷(Volume)的类型:
| 类型 | 描述 |
| EmptyDir | 与Pod同生命周期的Node临时存储 |
| HostPath | Node目录 |
| Local | 基于持久(PV)管理的Ndoe目录 |
一、EmptyDir
这种类型的Volume将在Pod被调度到Node时进行创建,在初始化状态下目录中时空的,所里命名为“空目录”(Empty Directory),它与Pod具有相同的生命周期,当Pod被销毁时,Node上相应的目录也会被删除。用一个Pod中的多个Container都可以挂载这种Volume,
由于EmptyDir类型的存储卷的临时性特点,它通常应用于下面场景:
- 基于磁盘进行合并排序操作时需要的暂存空间
- 长时间计算任务的中间检查点文件
- 为某个Web服务提供的临时网站内容文件
在默认情况下,kubelet会在Node的工作目录下为Pod创建EmptyDir目录,这个目录的存储介质可能是本地磁盘、SSD磁盘或者网络存储设置,取决于环境的配置。
另外EmptyDir可以通过medium字段设置存储介质为“Memory”,表示使用基于内存文件系统(tmpfs、RAM-backed filesystem)。虽然tmpfs的读写速度非常快,但与磁盘中目录不同,在主机重启之后,tmpfs的内容就会被清空。此外tmpfs的数据将被统计为容器内存使用量,受到容器级别内存资源上线(Memory Resource Limit)的限制。
apiVersion: v1
kind: Pod
metadata:
name: emptydir-mount-test-pod
spec:
containers:
- name: emptydir-mount
image: tomcat
volumeMounts:
- name: cache-volume
mountPath: /cache
volumes:
- name: cache-volume
emptyDir: {}
二、HostPath
HostPath类型的存储卷用于将Node文件系统的目录或文件挂载到容器内部使用,对于大多数容器应用来说,都不需要使用宿主机的文件系统。适合使用HostPath存储卷的场景:
- 容器应用的关键数据需要被持久化到宿主机上
- 需要使用Docker中的某些内部数据,可将宿主机的/var/lib/docker目录挂载到容器内
- 监控系统,例如cAdvisor需要采集宿主机/sys目录下内容
- Pod启动依赖于宿主机的某个目录或文件就绪的场景
HostPath存储卷主要配置参数path,设置为宿主机的目录或文件路径:还可以设置一个可选的参数type,表示宿主机路径的类型。
| type配置参数 | 校验规则 |
| 空 | 系统默认值,为向后兼容设置,意为系统在挂载path时不做任何校验 |
| DirectoryOrCreate | path指定的路径必须是目录,如果不存在,则系统自动创建该目录,将权限设置为0755,与kubelet具有相同的ower和group |
| Directory | path指定的目录必须存在,否则挂载失败 |
| FileOrCreate | path指定的路径必须是文件,如果不存在,则系统将自动创建该文件,将权限设置为0644,与kubelet具有相同的ower和group |
| file | path指定的文件必须存在,否则挂载失败 |
| socket | path指定的UNIX socket必须存在,否则挂载失败 |
| CharDevice | path指定的字符设备(character device)必须存在,否则挂载失败 |
| BlockDevice | path指定的块设备(block device)必须存在,否则挂载失败 |
HostPath所使用的是宿主机的文件系统,使用时需要注意:
- 对于具有相同HostPath设置的多个Pod(例如通过PodTemplate创建的)来说,可能被Master调度到多个Node上运行,但如果多个Node上的HostPath中文件系统(例如配置文件不同),则各Pod应用运行会出现不同的结果
- 如果管理员设置基于存储资源情况的调度策略,则HostPath目录下的磁盘空间将无法计入Node的可用资源范围内,可能出现与预期不同的调度结果
- 如果之前不存在的路径,则由kubelet自动创建出来的目录或文件的owner将是root,这意味着如果容器内运行的用户不是(User)不是root,则无法对该目录进行写操作,除非将容器设置为特权模式(Privileged),或者由管理员修改HostPath的权限以使非root用户可写
- HostPath设置的宿主机目录或文件不会随着Pod的销毁而删除,在Pod不存在之后,需要管理员手动删除
apiVersion: v1 kind: Pod metadata: name: host-path-test-container spec: containers: - name: test-container image: tomcat volumeMounts: - name: test-volume mountPath: /host-data volumes: - name: test-volume hostPath: path: /host-path-test #宿主机目录 type: DirectoryOrCreate #宿主机目录不存在是kubelet将会创建,权限为0755与Kubelet具有相同的owner和group,容器内用户不是root无法使用对于type为FileOrCreate模式的情况,需要注意的是如果挂载文件有上层目录,则系统不会字段创建上层目录,当上层目录不存在时,Pod将启动失败。这种情况下,可以将上层目录也设置为一个hostPath类型的Volume,并且设置type为DirectoryOrCreate,确保目录不存在时,系统将会自动创建该目录。
apiVersion: v1 kind: Pod metadata: name: hostpath-test-pod spec: containers: - name: test-container image: tomcat volumeMounts: - name: my-dir mountPath: /var/local/aaa - name: my-file mountPath: /var/local/aaa/1.txt volumes: - name: my-dir hostPath: path: /var/local/data #文件1.txt的上层目录 type: DirectoryOrCreate #确保目录文件存在 - name: my-file hostPath: path: /var/local/data/1.txt type: FileOrCreate #确保文件存在



