1. emptyDir 卷(内存级临时共享存储)
核心特性
- 本质是基于内存的临时共享存储,可将内存空间挂载到Pod的多个容器之间共享
- 适用场景:IO需求大、延迟要求低的共享场景,前提是内存容量充足、存储数据量不大
优缺点对比
- 优势:读写速度极快,性能远高于文件存储
- 劣势:属于易失性存储,安全性和可靠性低于文件存储,Pod删除后emptyDir中的数据会丢失
- 选型建议:可根据业务对速度和可靠性的需求按需选择,内存存储适合临时、非核心数据,文件存储适合需要持久化的核心数据
2. hostPath 卷(主机路径共享存储)
定义
将主机节点上的文件/目录直接挂载到Pod的容器内部,容器可直接访问主机上的对应路径内容。
典型适用场景
- 访问Docker内部数据:将主机的
/var/lib/docker路径共享到容器,即可在容器内访问Docker容器的相关信息,例如监控其他容器的运行状态 - 部署监控服务:谷歌开发的cAdvisor(国内因logo为猫头鹰常称猫头鹰服务)是单机容器资源监控工具,可收集当前节点所有容器的资源使用量,且接口符合Prometheus规范;若要以容器方式部署cAdvisor收集其他容器数据,需要将主机的
/dev/cgroups路径共享到cAdvisor容器内部
前置检测机制
使用hostPath卷前,可配置检测规则,要求指定路径在Pod运行前满足特定条件,包括是否存在、是否自动创建、创建后的权限/类型要求,该规则通过type字段配置。
3. hostPath 卷 type 字段可选值及含义
| type 取值 | 含义说明 |
|---|---|
| 空值(不配置) | 挂载hostPath卷前不进行任何检查,无论路径是否存在、内容是什么均可挂载 |
| DirectoryOrCreate | 要求路径为目录,若路径不存在则自动创建空目录,权限为0755,目录属主属组与节点kubelet一致 |
| Directory | 要求路径必须是目录,若路径不存在不会自动创建,若路径为文件/套接字等非目录类型则报错 |
| FileOrCreate | 要求路径为文件,若路径不存在则自动创建空文件,权限为0644,文件属主属组与节点kubelet一致 |
| File | 要求路径必须是文件,若路径不存在不会自动创建,若路径为目录/套接字等非文件类型则报错 |
| Socket | 要求路径必须是套接字 |
| CharDevice | 要求路径必须是字符设备 |
| BlockDevice | 要求路径必须是块设备 |
4. hostPath 卷使用注意事项
- 节点行为不一致风险:不同节点的主机路径内容可能不同,即使Pod配置完全相同,调度到不同节点上后,访问hostPath得到的结果也可能存在差异。例如节点A的
/test存储内容1,节点B的/test存储内容2,相同Pod调度到不同节点读到的内容不同 - 调度不感知存储资源:kube-scheduler做资源感知调度时,无法识别hostPath背后存储的容量、资源使用情况,不会将hostPath的存储资源作为调度依据。例如节点分别挂载SCSI、MFS、SATA存储时,调度器无法感知存储类型和容量差异
- 权限限制:主机上创建的文件/目录默认只有root用户可写,若容器需要写入hostPath路径,需要配置特权模式或对应权限,否则会出现权限不足无法写入的问题
5. 实验演示
emptyDir 卷实验
- 准备包含emptyDir类型Volume配置的
16pod.yaml资源清单 - 执行
kubectl apply -f 16pod.yaml创建资源 - 执行
kubectl get pod查看Pod状态,确认所有容器正常运行,emptyDir卷可在Pod的多个容器间共享内存数据
hostPath 卷实验
- 编写资源清单:配置Pod的Volume为hostPath类型,路径设为
/test,type设为Directory(要求路径为目录,不存在不自动创建),将Volume挂载到Pod的/test-pd目录 - 首次创建失败排查:执行
kubectl create -f 17pod.yaml创建Pod,执行kubectl get pod发现容器处于ContainerCreating状态;执行kubectl describe pod <Pod名>排查,发现Pod已调度到node01节点,但kubelet初始化卷失败:所有节点均不存在根目录下的/test目录,Directory类型不会自动创建目录,因此类型检测失败 - 问题解决:在所有节点执行
mkdir /test创建目标目录,同时在/test下写入index.html文件,内容为对应节点的主机名 - 验证挂载成功:重新创建Pod,待Pod运行后进入容器的
/test-pd目录,可看到index.html文件,cat文件内容为当前Pod所在节点的主机名;修改节点上/test/index.html的内容,Pod内可同步看到修改结果,证明hostPath已成功将主机路径挂载到容器内部
6. 下节预告
下一小节将讲解PV/PVC(持久卷/持久卷声明)方案,解决多真实服务器场景下的共享存储需求,适配生产环境的持久化存储场景。
AI 总结
本节课核心讲解了Kubernetes两种基础Volume类型:emptyDir是内存级临时共享存储,读写性能极高,适合高IO、低延迟、数据量小的临时共享场景,但属于易失性存储,可靠性低;hostPath可将主机节点路径挂载到Pod,支持多种前置类型检测,适用于访问主机资源、部署监控组件等特殊场景,但存在节点行为不一致、调度不感知存储资源、权限限制等问题,不适用于生产环境的持久化存储需求,下节将讲解更适配生产场景的PV/PVC持久卷方案。