对象定位
emptyDir 是随 Pod 创建的临时目录:Pod 被调度到节点时建立,容器重启时内容保留,Pod 被删除或迁移到其他节点时数据清空。适用平台是 Kubernetes。它最典型的用法是同一 Pod 内多个容器共享一个目录,比如主容器写日志、sidecar 从同一目录读取并转发,从而避免把日志塞进容器文件系统。
基本信息
| 适用平台 | Kubernetes,Pod 级卷类型 |
|---|---|
| 生命周期 | 与 Pod 一致:容器重启保留,Pod 删除或重调度即清空 |
| 存储位置 | 默认落在节点磁盘(kubelet 数据目录下),可用 medium 改成 Memory |
| 容量约束 | 可用 sizeLimit 限制,超过后该 Pod 会被驱逐 |
典型使用场景
- 日志采集:应用容器写、日志 sidecar 读并转发到远端
- 构建缓存:编译类任务把中间产物放在临时目录,Pod 结束即释放
- 只读根文件系统:主容器根文件系统只读,单独挂一个可写的 emptyDir 放运行期数据
- 内存盘加速:把临时文件放 medium: Memory 提高读写速度(占用节点内存)
- 初始化传递:init 容器准备数据、主容器读取,通过共享目录交接
共享目录示例
共享目录示例
volumes:
- name: shared
emptyDir: {}
- name: cache
emptyDir:
sizeLimit: 1Gi
containers:
- name: app
volumeMounts:
- name: shared
mountPath: /var/log/app
- name: shipper
image: registry.example.com/shipper:2.1.0
volumeMounts:
- name: shared
mountPath: /mnt/incoming核对与清理
核对与清理
kubectl get pod web-x -o jsonpath='{.spec.volumes[*].emptyDir}' # 配置
kubectl exec -it web-x -- df -h /var/log/app # 用量
kubectl exec -it web-x -- du -sh /var/log/app # 实际占用
kubectl describe pod web-x | grep -i -A2 Evicted # 是否因超限被驱逐
kubectl get pod web-x -o jsonpath='{.status.reason}'与持久卷的差别
| 维度 | emptyDir | PVC |
|---|---|---|
| 生命周期 | 随 Pod 结束消失 | 独立于 Pod 存在 |
| 跨节点 | 不能迁移,重调度即新建空目录 | 可跟随 Pod 挂载 |
| 容量控制 | sizeLimit 限制,超出驱逐 Pod | 按申请量供应 |
| 适用数据 | 缓存、临时文件、容器间交换 | 数据库、上传文件等需要留存的数据 |
默认落在节点磁盘(kubelet 根目录下);写入超过 sizeLimit 时该 Pod 会被驱逐,监控要覆盖临时目录用量。
medium: Memory 的 emptyDir 会从节点内存分配并按内存计量,计入 Pod 的内存使用,适合小体积高频读写,不适合放大文件。
与其他卷的配合
- 与 PVC 并存:需要留存的数据放 PVC,临时缓存放 emptyDir,同一 Pod 可同时挂两类卷
- 与 init 容器配合:init 负责往共享目录写初始数据,主容器只读消费,职责清晰
- 与只读根文件系统配合:根目录只读时,程序需要的可写路径用 emptyDir 单独挂出来
- 与 sidecar 配合:共享目录是日志与指标中转的标准做法,注意明确目录属主避免写不进去