K8s新手实操|emptyDir卷超详细实战(附完整命令+核心理解)

作为K8s新手,刚接触存储卷时,最容易混淆的就是emptyDir卷------它是K8s中最基础、最常用的临时存储卷,核心特点是"随Pod而生,随Pod而灭",很多新手会把它和容器内部目录搞混,今天结合完整实操和个人理解,一次性讲透emptyDir,看完就能上手实战!

先抛核心理解(新手直接背,不踩坑):emptyDir是Pod级别的临时共享存储卷,当Pod被分配到某个Node节点时,emptyDir会自动在该节点创建;Pod中所有容器可共享这个卷的数据,卷的真实路径映射在Node节点上,而非Pod内部;只有Pod被删除时,emptyDir才会被永久删除,单纯容器崩溃重启,数据不会丢失

下面结合我自己写的YAML配置、完整实操命令,一步步拆解emptyDir的创建、验证和删除,全程可复制运行,新手也能零障碍上手。

一、emptyDir核心原理(新手必懂)

在K8s中,容器本身的生命周期很短,一旦容器崩溃或删除,容器内的数据会直接丢失。而emptyDir卷的出现,就是为了解决"Pod内容器数据共享"和"临时数据存储"的问题,它的核心特性的可以总结为4点(结合个人理解,通俗好记):

  1. 归属关系:emptyDir是Pod的属性,不属于任何一个容器,是Pod层面的公共资源,由Pod统一管理。

  2. 创建与销毁:Pod被调度到某个Node节点时,emptyDir自动在该节点创建(初始为空);当Pod被删除时,emptyDir及其内部数据会被永久删除,彻底清理。

  3. 共享特性:同一个Pod内的所有容器,都可以通过挂载的方式访问同一个emptyDir卷,哪怕每个容器的挂载路径不同,也能实现数据互通(读写同步)。

  4. 数据安全性:容器崩溃或重启,不会导致emptyDir删除,数据依然保留;只有Pod被删除,数据才会丢失------因为emptyDir的生命周期和Pod完全绑定。

补充说明:emptyDir的真实物理路径在Pod所在的Node节点上(默认路径为/var/lib/kubelet/pods/<PodUID>/volumes/kubernetes.io~empty-dir/),而非Pod内部,我们可以通过命令查看其真实挂载位置,后面实操会详细演示superscript:8

二、完整实操流程(可直接复制命令,零踩坑)

本次实操目标:创建一个包含emptyDir卷的Pod,验证卷的挂载、数据共享(单容器场景,多容器共享可直接扩展),最后清理资源,全程贴合新手实操习惯。

步骤1:编写emptyDir配置文件(YAML详解)

创建名为emptydir.yml的配置文件,核心配置包含Pod定义、容器定义和emptyDir卷定义,每一行都有详细注释,新手可直接复制使用:

bash 复制代码
cat > emptydir.yml <<EOF
apiVersion: v1          # API版本,固定为v1(Pod属于核心API资源)
kind: Pod               # 资源类型,本次创建的是Pod
metadata:
  name: emptydir        # Pod的名称,自定义,后续操作需用到
spec:
  containers:           # 容器配置,本次创建1个httpd容器
  - image: httpd        # 容器使用的镜像(httpd为基础web镜像,轻量易操作)
    imagePullPolicy: IfNotPresent  # 镜像拉取策略:本地有则不用拉取,避免浪费时间
    name: test-container           # 容器名称,自定义
    volumeMounts:       # 容器挂载卷的配置(关键:将emptyDir挂载到容器内部)
    - mountPath: /cache # 容器内部的挂载路径(容器可通过该路径访问emptyDir卷)
      name: cache-volume           # 挂载的卷名称,必须和下方volumes的name一致(关联卷和容器)
  volumes:              # Pod层面定义卷(emptyDir属于Pod的属性,在这里声明)
  - name: cache-volume  # 卷的名称,和上方volumeMounts.name对应,自定义
    emptyDir:           # 卷的类型为emptyDir
      sizeLimit: 2G     # 卷的大小限制,可选配置,这里限制为2G,避免占用过多节点资源
EOF

关键解读:

  • volumes字段在spec下,属于Pod层级,说明emptyDir是Pod的属性,不是容器的属性;

  • volumeMounts字段在容器配置下,作用是将Pod的emptyDir卷,映射到当前容器的/cache路径下,容器对/cache路径的读写,本质就是对emptyDir卷的读写;

  • sizeLimit: 2G是可选配置,用于限制emptyDir卷的最大容量,防止卷无限膨胀占用节点资源,默认不限制容量。

步骤2:创建Pod,验证emptyDir卷挂载

使用kubectl命令创建Pod,查看Pod状态和运行节点,确认Pod和emptyDir卷正常创建:

bash 复制代码
# 1. 创建Pod(根据emptydir.yml配置文件)
kubectl create -f emptydir.yml 

# 2. 查看Pod详细信息,包括运行节点、状态(确保Pod处于Running状态)
kubectl get -f emptydir.yml -o wide

运行结果说明:

执行kubectl get命令后,会显示Pod的名称(emptydir)、状态(Running)、运行节点(Node)、IP等信息,其中"NODE"列显示的就是Pod被调度到的节点,emptyDir卷就创建在该节点上。

此时,emptyDir卷已自动在对应Node节点创建,并且通过volumeMounts挂载到了test-container容器的/cache路径下,容器可以正常访问该卷。

步骤3:查看emptyDir卷的真实挂载路径

前面提到,emptyDir的真实路径在Pod所在的Node节点上,我们可以通过crictl命令(容器运行时命令)查看容器的挂载信息**(需到对应节点查看)**,找到emptyDir的真实路径:

bash 复制代码
# 1. 查看test-container容器的ID(筛选包含test-container的容器)
crictl ps | grep -i test-container

# 2. 查看容器的详细挂载信息,筛选包含cache的内容(找到emptyDir的真实路径)
# 注意:将命令中的容器ID(0397f786c92d0)替换为上一步查询到的实际容器ID
crictl inspect 0397f786c92d0 | grep cache

运行结果说明:

执行crictl inspect命令后,会输出容器的挂载详情,其中包含"hostPath"字段,该字段对应的路径就是emptyDir卷在Node节点上的真实物理路径(类似/var/lib/kubelet/pods/xxxx/volumes/kubernetes.io~empty-dir/cache-volume)superscript:8

这也印证了我们的核心理解:emptyDir的真实路径在Node节点上,而非Pod内部,容器只是通过mountPath挂载的方式,实现了对该路径的访问。

步骤4:清理资源(实验完成后必做)

实验完成后,需要及时删除创建的Pod,避免占用集群资源。删除Pod的同时,emptyDir卷也会被自动删除,其内部数据会永久清理:

bash 复制代码
# 删除Pod(根据emptydir.yml配置文件删除,同时删除关联的emptyDir卷)
kubectl delete -f emptydir.yml

# 验证删除结果(确认Pod已不存在)
kubectl get pods | grep -i emptydir

补充说明:删除Pod后,再次执行crictl inspect命令,会提示"容器不存在";同时,Node节点上的emptyDir真实路径也会被自动清理,数据彻底丢失------这就是emptyDir"随Pod而灭"的核心特性。

三、核心总结(新手必背,面试加分)

结合本次实操和个人理解,整理出emptyDir卷的核心知识点,新手直接背诵即可,避免踩坑:

  1. 归属:emptyDir是Pod级别的存储卷,属于Pod的属性,不是容器的属性,由Pod统一管理。

  2. 生命周期:与Pod完全绑定------Pod创建→emptyDir创建(Node节点上);Pod删除→emptyDir删除(数据永久丢失);容器崩溃重启→emptyDir及数据保留。

  3. 挂载与访问:容器通过volumeMounts将emptyDir挂载到自身指定路径(如本次的/cache),容器对该路径的读写,本质是对Node节点上emptyDir真实路径的读写。

  4. 共享特性:同一个Pod内的多个容器,可通过挂载同一个emptyDir卷,实现数据共享(哪怕挂载路径不同),这是emptyDir最常用的场景之一superscript:4

  5. 适用场景:临时缓存、Pod内容器间数据交换、临时日志存储等,不适合需要持久化保存的数据(数据随Pod删除而丢失)。

四、新手常见误区(避坑指南)

结合自己的学习经历,整理3个新手最容易踩的坑,帮大家避坑:

  1. 误区1:认为emptyDir卷的路径在Pod内部 → 纠正:emptyDir的真实路径在Pod所在的Node节点上,Pod和容器只是通过挂载的方式访问该路径。

  2. 误区2:容器崩溃后,emptyDir的数据会丢失 → 纠正:不会!只有Pod被删除,emptyDir才会删除;容器崩溃重启,Pod依然存在,emptyDir数据也会保留。

  3. 误区3:不配置sizeLimit,emptyDir可以无限占用节点资源 → 纠正:默认情况下,emptyDir无容量限制,建议根据需求配置sizeLimit,避免占用过多节点磁盘空间。

五、结尾总结

emptyDir卷是K8s新手入门存储卷的首选,它结构简单、实操容易,核心就是"Pod的临时共享文件夹"------随Pod而生,随Pod而灭,适合临时数据存储和容器间数据共享。

本次实操全程使用新手友好的命令和配置,所有命令可直接复制运行,结合核心理解,相信大家能快速掌握emptyDir的用法。后续会分享多容器共享emptyDir、emptyDir与hostPath的区别等内容,感兴趣的可以关注我~

如果在实操过程中遇到Pod创建失败、crictl命令报错、无法找到emptyDir真实路径等问题,欢迎在评论区留言,我会一一回复!觉得有用的话,记得点赞+收藏,新手一起进步~

相关推荐
liux35282 小时前
K8s 核心接口:CNI、CSI、CRI、LB 一篇讲透
云原生·容器·kubernetes
香气袭人知骤暖2 小时前
人大金仓(KingbaseES)Docker 容器自动备份方案
运维·docker·容器
Devin~Y2 小时前
从内容社区到AIGC客服:Spring Boot、Redis、Kafka、K8s、RAG的三轮大厂Java面试对话(附标准答案)
java·spring boot·redis·spring cloud·kafka·kubernetes·micrometer
大熊程序猿3 小时前
MarkItDown Docker安装
运维·docker·容器
IT策士3 小时前
第25篇 k8s之Deployment 基础:声明式管理与副本控制
云原生·容器·kubernetes
IT策士3 小时前
第 26 篇 k8s之Deployment 进阶:滚动更新、回滚与暂停
云原生·容器·kubernetes
老毛肚4 小时前
Docker Desktop 介绍
运维·docker·容器
张忠琳4 小时前
【kubernetes v1.21】(kubelet 2)容器运行时与CRI
云原生·架构·kubernetes·kubelet
张忠琳4 小时前
【kubernetes v1.21】(kubelet 3)PLEG、健康检查、Eviction 与状态管理
云原生·架构·kubernetes·kubelet