emptyDir 顾名思义,是一个临时的存储卷,他是在k8s在pod调度到节点的时候自动创建的,生命周期随着pod的删除或转移而销毁,里面的数据也随之删除。一般用于非持久化的pod。同一个pod如果启动了多个容器,那它们之前是可以互相访问这个卷,如果不同的pod则彼此隔离。即便这2个pod是在同一个node节点上,
默认存储在pod所在的node节点的/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~empty-dir/<volume-name> 目录。
一、典型使用场景
1. 容器间数据共享
- 场景:多个容器协作处理数据(如生产者-消费者模型)。
- 示例:
- 日志收集:Sidecar 容器从主容器读取日志并上传到云端。
- 数据处理流水线:容器 A 生成中间数据,容器 B 处理并输出结果。
2. 临时缓存
- 场景:应用需要临时存储缓存文件(如编译中间文件、下载的依赖包)。
- 优势:避免占用容器镜像层空间,提升容器启动速度。
3. 内存级高性能存储
- 场景:需要低延迟读写的临时数据(如临时会话数据、实时计算中间结果)。
- 配置:通过
medium: Memory
将卷挂载为内存文件系统(tmpfs
)。
二、配置示例
yaml演示
apiVersion: v1
kind: Pod
metadata:
name: emptydir-demo
spec:
containers:
- name: writer
image: m.daocloud.io/docker.io/nginx
command: ["sh", "-c", "echo 'Data' > /data/file.txt && sleep 3600"]
volumeMounts:
- name: shared-data
mountPath: /data
- name: reader
image: m.daocloud.io/docker.io/nginx
command: ["sh", "-c", "cat /data/file.txt && sleep 3600"]
volumeMounts:
- name: shared-data
mountPath: /data
volumes:
- name: shared-data
emptyDir: {} # 默认使用节点磁盘
上面的例子是一个pod创建了2个容器,一个为writer,一个为reader,他们共享了一个名为shared-data的卷名,并且都挂载在各自的/data目录。
最下面创建了一个名为shared-data的卷,名为shared-data的卷,类型为emptydir
从上面的配置可以看出来,2个pod共享了同一个卷,如果reader读取成功说明这个共享卷被2个容器共享。
结果验证,发现reader的容器是可以读取到这里面的内容。
本地验证,通过命令可以得知这个pod的id为 《770f49aa-4426-421a-9516-7ff0f7f81141》
# 获取方式 kubectl get pod <pod-id> -o jsonpath='{.metadata.uid}'
# kubectl get pod emptydir-demo -o jsonpath='{.metadata.uid}'
770f49aa-4426-421a-9516-7ff0f7f81141
进入/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~empty-dir/<volume-name> 目录查看是否存在files.txt以及内容
并且可以通过/var/lib/kubelet/pods/<pod-id>/containers/ 查看到下面有writer和reader2个容器,和上面yaml文件中保持一致