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权威指南:(第五版)》