EmptyDir 卷
学习目标
- 理解 EmptyDir 卷的概念和特性
- 掌握 EmptyDir 的配置方法
- 了解 EmptyDir 的应用场景
核心概念
一句话解释
EmptyDir 是 Kubernetes 中最简单的卷类型,在 Pod 创建时创建一个空目录,Pod 删除时数据丢失。
EmptyDir 特性
┌─────────────────────────────────────┐
│ Pod │
│ ┌─────────────────────────────┐ │
│ │ Container 1 │ │
│ │ - 读写 /data │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ Container 2 │ │
│ │ - 共享 /data │ │
│ └─────────────────────────────┘ │
│ ┌─────────────────────────────┐ │
│ │ EmptyDir │ │
│ │ - Pod 创建时创建 │ │
│ │ - Pod 删除时删除 │ │
│ │ - 容器重启数据保留 │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
EmptyDir vs 其他存储
| 特性 | EmptyDir | hostPath | PersistentVolume |
|---|---|---|---|
| 生命周期 | Pod | 节点 | 独立 |
| 持久性 | 临时 | 持久 | 持久 |
| 跨节点 | 否 | 否 | 是 |
| 典型用途 | 缓存、临时数据 | 主机文件访问 | 数据库、文件存储 |
EmptyDir 配置
apiVersion: v1
kind: Pod
metadata:
name: emptydir-demo
spec:
containers:
- name: app
image: busybox
command: ["sh", "-c", "echo 'Hello' > /data/test.txt && sleep 3600"]
volumeMounts:
- name: cache-volume
mountPath: /data
volumes:
- name: cache-volume
emptyDir: {}
EmptyDir 介质类型
volumes:
- name: cache-volume
emptyDir:
medium: "" # 默认:使用节点存储
sizeLimit: "1Gi" # 可选:限制大小
| 介质类型 | 说明 | 性能 |
|---|---|---|
| "" (空) | 使用节点磁盘 | 一般 |
| "Memory" | 使用内存(tmpfs) | 快 |
内存介质(tmpfs)
volumes:
- name: memory-volume
emptyDir:
medium: "Memory"
sizeLimit: "256Mi"
特性:
- 数据存储在内存中
- 读写速度快
- 容器重启数据保留
- Pod 删除数据丢失
- 计入容器内存限制
EmptyDir 应用场景
场景 1:缓存
- 应用缓存数据
- 临时文件存储
场景 2:临时数据
- 日志缓冲
- 临时处理文件
场景 3:容器间通信
- 共享数据
- 文件交换
场景 4:初始化数据
- initContainer 生成数据
- 主容器使用数据
大小限制
volumes:
- name: data-volume
emptyDir:
sizeLimit: "1Gi" # 限制卷大小
注意:
- 大小限制不是强制的
- 超过限制可能会被驱逐
- 建议设置合理的限制
实践练习
练习 1:基本 EmptyDir
创建 Pod 使用 EmptyDir:
apiVersion: v1
kind: Pod
metadata:
name: emptydir-basic
spec:
containers:
- name: writer
image: busybox
command: ["sh", "-c", "echo 'Hello from writer' > /data/message && sleep 3600"]
volumeMounts:
- name: shared-data
mountPath: /data
- name: reader
image: busybox
command: ["sh", "-c", "cat /data/message && sleep 3600"]
volumeMounts:
- name: shared-data
mountPath: /data
readOnly: true
volumes:
- name: shared-data
emptyDir: {}
验证:
kubectl logs emptydir-basic -c reader
# 输出:Hello from writer
练习 2:内存介质
创建 Pod 使用内存 EmptyDir:
apiVersion: v1
kind: Pod
metadata:
name: emptydir-memory
spec:
containers:
- name: app
image: busybox
command: ["sh", "-c", "echo 'Fast storage' > /cache/data.txt && sleep 3600"]
volumeMounts:
- name: cache-volume
mountPath: /cache
volumes:
- name: cache-volume
emptyDir:
medium: "Memory"
sizeLimit: "128Mi"
验证:
kubectl exec emptydir-memory -- mount | grep /cache
# 输出应该显示 tmpfs 类型
练习 3:大小限制
创建 Pod 限制 EmptyDir 大小:
apiVersion: v1
kind: Pod
metadata:
name: emptydir-sizelimit
spec:
containers:
- name: app
image: busybox
command: ["sh", "-c", "dd if=/dev/zero of=/data/bigfile bs=1M count=100 && sleep 3600"]
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
emptyDir:
sizeLimit: "50Mi"
验证:
# 观察 Pod 状态,可能会被驱逐
kubectl get pod emptydir-sizelimit
kubectl describe pod emptydir-sizelimit
练习 4:initContainer 使用 EmptyDir
创建 Pod 使用 initContainer 生成数据:
apiVersion: v1
kind: Pod
metadata:
name: emptydir-init
spec:
initContainers:
- name: init
image: busybox
command: ["sh", "-c", "echo 'Generated by init' > /data/init.txt"]
volumeMounts:
- name: init-data
mountPath: /data
containers:
- name: app
image: busybox
command: ["sh", "-c", "cat /data/init.txt && sleep 3600"]
volumeMounts:
- name: init-data
mountPath: /data
volumes:
- name: init-data
emptyDir: {}
验证:
kubectl logs emptydir-init
# 输出:Generated by init
小结
| 要点 | 说明 |
|---|---|
| EmptyDir | 最简单的卷类型 |
| 生命周期 | Pod 创建时创建,Pod 删除时删除 |
| 介质类型 | 磁盘(默认)或内存(tmpfs) |
| 大小限制 | sizeLimit 配置 |
| 典型用途 | 缓存、临时数据、容器间通信 |
| 数据持久性 | 容器重启保留,Pod 删除丢失 |
练习编辑器
bash
Loading...