49·配置管理进阶

EmptyDir 卷

kubernetesvolumestorageemptydir

EmptyDir 卷

学习目标

  1. 理解 EmptyDir 卷的概念和特性
  2. 掌握 EmptyDir 的配置方法
  3. 了解 EmptyDir 的应用场景

核心概念

一句话解释

EmptyDir 是 Kubernetes 中最简单的卷类型,在 Pod 创建时创建一个空目录,Pod 删除时数据丢失。

EmptyDir 特性

┌─────────────────────────────────────┐
│           Pod                       │
│  ┌─────────────────────────────┐   │
│  │  Container 1                 │   │
│  │  - 读写 /data               │   │
│  └─────────────────────────────┘   │
│  ┌─────────────────────────────┐   │
│  │  Container 2                 │   │
│  │  - 共享 /data               │   │
│  └─────────────────────────────┘   │
│  ┌─────────────────────────────┐   │
│  │  EmptyDir                    │   │
│  │  - Pod 创建时创建            │   │
│  │  - Pod 删除时删除            │   │
│  │  - 容器重启数据保留          │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘

EmptyDir vs 其他存储

特性EmptyDirhostPathPersistentVolume
生命周期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...

继续学习

完成本课后,建议继续学习下一课「HostPath 卷」 以巩固所学知识。