Administrator
发布于 2026-08-16 / 2 阅读
0
0

第七章.k8s存储-volume-2

来源链接:https://www.bilibili.com/video/BV1PbeueyE8V?spm_id_from=333.788.videopod.episodes&vd_source=d8c71ff24a3359a807967fc4b5daa0e4&p=50

1. emptyDir 卷(内存级临时共享存储)

核心特性

  • 本质是基于内存的临时共享存储,可将内存空间挂载到Pod的多个容器之间共享
  • 适用场景:IO需求大、延迟要求低的共享场景,前提是内存容量充足、存储数据量不大

优缺点对比

  • 优势:读写速度极快,性能远高于文件存储
  • 劣势:属于易失性存储,安全性和可靠性低于文件存储,Pod删除后emptyDir中的数据会丢失
  • 选型建议:可根据业务对速度和可靠性的需求按需选择,内存存储适合临时、非核心数据,文件存储适合需要持久化的核心数据

2. hostPath 卷(主机路径共享存储)

定义

将主机节点上的文件/目录直接挂载到Pod的容器内部,容器可直接访问主机上的对应路径内容。

典型适用场景

  1. 访问Docker内部数据:将主机的/var/lib/docker路径共享到容器,即可在容器内访问Docker容器的相关信息,例如监控其他容器的运行状态
  2. 部署监控服务:谷歌开发的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 卷使用注意事项

  1. 节点行为不一致风险:不同节点的主机路径内容可能不同,即使Pod配置完全相同,调度到不同节点上后,访问hostPath得到的结果也可能存在差异。例如节点A的/test存储内容1,节点B的/test存储内容2,相同Pod调度到不同节点读到的内容不同
  2. 调度不感知存储资源:kube-scheduler做资源感知调度时,无法识别hostPath背后存储的容量、资源使用情况,不会将hostPath的存储资源作为调度依据。例如节点分别挂载SCSI、MFS、SATA存储时,调度器无法感知存储类型和容量差异
  3. 权限限制:主机上创建的文件/目录默认只有root用户可写,若容器需要写入hostPath路径,需要配置特权模式或对应权限,否则会出现权限不足无法写入的问题

5. 实验演示

emptyDir 卷实验

  1. 准备包含emptyDir类型Volume配置的16pod.yaml资源清单
  2. 执行kubectl apply -f 16pod.yaml创建资源
  3. 执行kubectl get pod查看Pod状态,确认所有容器正常运行,emptyDir卷可在Pod的多个容器间共享内存数据

hostPath 卷实验

  1. 编写资源清单:配置Pod的Volume为hostPath类型,路径设为/test,type设为Directory(要求路径为目录,不存在不自动创建),将Volume挂载到Pod的/test-pd目录
  2. 首次创建失败排查:执行kubectl create -f 17pod.yaml创建Pod,执行kubectl get pod发现容器处于ContainerCreating状态;执行kubectl describe pod <Pod名>排查,发现Pod已调度到node01节点,但kubelet初始化卷失败:所有节点均不存在根目录下的/test目录,Directory类型不会自动创建目录,因此类型检测失败
  3. 问题解决:在所有节点执行mkdir /test创建目标目录,同时在/test下写入index.html文件,内容为对应节点的主机名
  4. 验证挂载成功:重新创建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持久卷方案。


评论