Kubernetes支持的内置(in-tree)持久卷类型包括hostPath(宿主机目录)、FC(fibre Channel)、iSCSI(iSCSI存储设备)、Local(本地持久化存储)、NFS(基于NFS协议的网络文件系统)等资源。它们不作为PV资源对象被创建,而是直接在Pod的Volume字段被设置和使用。下面就常用的hostPath和NFS做简要介绍。
hostPath
hostPath类型的Volume用于将Node文件系统的目录或文件挂载到容器内部,并且在Pod删除后数据仍然被保留。
由于hostPath直接使用宿主机的文件系统,无法被Kubernetes直接管理,因此存在很多安全风险,建议尽量不要使用。在必须要用时尽量以只读的方式将其挂载到容器内,以尽量减少对容器应用可能造成的破坏。
使用场景
- 容器应用的关键数据需要持久化保存到宿主机上;
- 需要使用docker中的某些内部机制,可以将主机的/var/lib/docker目录挂载到容器内;
- 监控系统,例如cAdvisor需要采集宿主机/sys/目录下的内容;
- Pod的启动依赖于宿主机上的某个目录或文件就绪。
hostPath的主要配置参数为path,表示宿主机目录或文件路径;还可以设置一个可选的参数type,表示路径的操作类型。
type的配置参数如下:
type参数 | 检校规则 |
---|---|
空 | 默认值,系统在挂载path时不做任何检校 |
DirectoryOrCreate | path指定的路径必须是目录,如果不存在系统将自动创建该目录,并将目录的权限设置为0755,具有与Kubelet相同的owner和group |
Directory | path指定的路径必须是目录,否则挂载失败 |
FileOrCreate | path指定的路径必须是文件,如果不存在,系统将自动创建该文件,并将文件的权限设置为0644,具有与Kubelet相同的owner和group |
File | path指定的路径必须是文件,否则挂载失败 |
Socket | Path指定的UNIX Socket必须存在,否则挂载失败 |
CharDevice | path指定的字符设备必须存在,否则挂载失败 |
BlockDevice | path指定的块设备必须存在,否则挂载失败 |
对于type为FileOrCreate模式的情况,如果挂载文件有上层目录,则系统不会自动创建上层目录,当上层目录不存在时,Pod启动失败。在这种情况下,可以将上层目录也设置为一个hostPath类型的Volume,并且设置type为DirectoryOrCreate,确保当目录不存在时,系统会自动创建出来。
注意事项
- 通过hostPath可能会将宿主机的某些具有特殊权限的文件挂载到容器内,例如Kubelet和容器运行时的Socket,使得容器的进程也能够越权对宿主机进行某些操作;
- 对具有相同hostPath设置的多个Pod来说,可能会被master调度到多个Node上运行,但如果这些Node上的hostPath中的文件夹的内容(如配置文件这些)不同,则各个Pod的运行结果可能会出现差异;
- 如果管理员设置了某些基于存储资源情况的调度策略,则hostPath目录下的磁盘空间将无法计入Node的可用资源范围内,可能出现与预期不同的调度结果;
- 如果是之前不存在的路径,由Kubelet自动创建的文件或目录的owner和group将是root。这意味着如果容器内运行的用户(user)不是root,则将无法对该目录进行写操作,除非将容器设置为特权容器,或者由管理员修改hostPath的权限;
- hostPath设置的宿主机目录或文件不会随着Pod的销毁而被删除,而是在Pod被销毁之后,由管理员手动删除。
NFS
NFS类型的Volume用于将基于NFS协议的网络网络文件系统中的目录或文件挂载到容器内使用,并且在Pod被删除后数据仍然被保留。
在Pod使用NFS协议的Volume之前,需要确保NFS服务正常运行。另外,也不能像PV那样使用mountOptions字段来定义挂载项。
NFS卷可以在不同节点的Pod间共享数据。本地NFS客户端可以透明的读写位于远端NFS服务器上的 文件,就像访问本地文件一样。
评论 (0)