AKS 中的临时存储 — 实践动手实验
Source: Dev.to
请提供您希望翻译的具体内容(文本、Markdown 等),我将按照要求保留源链接并仅翻译正文部分。谢谢!
为什么使用临时存储?
临时存储非常适合那些 不需要 数据在 Pod 生命周期结束后仍然保留的工作负载,例如:
- CI/CD 流水线
- 批处理作业
- 视频转码
- ETL 流程
- AI 预处理
在这些情况下使用持久卷会:
- 增加成本
- 增加生命周期复杂性
- 泄漏未使用的 PVC
- 放慢 I/O
临时存储原语速度快,自动清理,并且位于节点本地磁盘或内存。
短暂存储原语
Kubernetes 提供了多种内置的临时存储机制:
| 原语 | 支持介质 | 特性 |
|---|---|---|
emptyDir(磁盘) | 节点本地磁盘 | 本地存储快速,随 Pod 删除而删除 |
emptyDir(内存) | RAM(tmpfs) | 极快,零磁盘 I/O,内存超限时会驱逐 Pod |
| 通用短暂 PVC | 动态供应器(通过 StorageClass) | 作用域限定在 Pod,Pod 被移除时自动删除 |
emptyDir(磁盘支持)
最简单的短暂存储形式。Pod 启动时创建,Pod 运行期间存在,Pod 删除时移除。
apiVersion: v1
kind: Pod
metadata:
name: emptydir-disk
spec:
containers:
- name: writer
image: busybox
command: ["/bin/sh", "-c"]
args:
- |
dd if=/dev/zero of=/scratch/test.img bs=1M count=100
sleep 600
volumeMounts:
- mountPath: /scratch
name: scratch
volumes:
- name: scratch
emptyDir: {}
结果:在 /scratch 下创建一个 100 MiB 的文件。数据位于节点本地磁盘,Pod 删除时即消失——非常适合 CI 构建产物或临时数据转换。
emptyDir(内存支持)
通过设置 medium: Memory 将 emptyDir 挂载到 RAM,实际创建一个 tmpfs 挂载。
apiVersion: v1
kind: Pod
metadata:
name: emptydir-memory
spec:
containers:
- name: writer
image: busybox
command: ["/bin/sh", "-c"]
args:
- |
dd if=/dev/zero of=/scratch/test.img bs=1M count=100
sleep 600
volumeMounts:
- mountPath: /scratch
name: memvol
volumes:
- name: memvol
emptyDir:
medium: Memory
特性:
- 极快(RAM 访问)
- 零磁盘 I/O
- 适用于缓存或临时处理
⚠️ 注意:如果超过内存限制,Pod 可能会被驱逐。
通用短暂 PVC(动态)
Kubernetes 可以为 Pod 创建一个临时的 PersistentVolumeClaim(PVC),Pod 结束时 PVC 会自动删除。
apiVersion: v1
kind: Pod
metadata:
name: eph-pvc
spec:
containers:
- name: app
image: busybox
command: ["/bin/sh", "-c"]
args:
- |
echo "using temporary storage"
sleep 600
volumeMounts:
- mountPath: /data
name: eph
volumes:
- name: eph
ephemeral:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
工作流:
- Pod 启动时,Kubernetes 创建 PVC 并使用默认的
StorageClass供应后端卷。 - Pod 删除时,PVC 及其卷会自动移除——无泄漏,无需手动清理。
典型使用场景包括:
- 数据处理任务
- 机器学习训练的临时空间
- 大规模临时工作负载
短暂存储选项比较
| 特性 | emptyDir(磁盘) | emptyDir(内存) | 通用短暂 PVC |
|---|---|---|---|
| 支持存储 | 节点本地磁盘 | 内存(tmpfs) | 动态供给的卷(例如 Azure Disk、AWS EBS) |
| 性能 | 快速本地 I/O | 超高速(内存) | 取决于供给器(通常为网络附加) |
| 大小限制 | 节点磁盘容量 | 节点内存限制 | 在 PVC 规范中定义 |
| 自动清理 | 是(Pod 删除时) | 是(Pod 删除时) | 是(Pod 删除时) |
| 使用场景 | 构建产物、临时文件 | 缓存、临时处理 | 需要更大、可能基于网络的存储的作业 |
典型工作流
CI/CD 流水线
- Job start – 将仓库克隆到
emptyDir中。 - Build – 在同一个
emptyDir中生成制品。 - Publish – 推送 Docker 镜像或上传制品。
- Job end – Pod 退出;
emptyDir自动被移除。
数据处理作业
- Download 将数据集下载到临时 PVC 中。
- Transform 在本地转换数据。
- Upload 将结果上传到外部存储。
- Terminate – PVC 被删除,不留下残余费用。
最佳实践
- 始终为
ephemeral-storage资源请求和限制 Pod 设置。 - 对于小型、快速的临时空间,首选
emptyDir;当需要最小化 I/O 延迟时,使用基于内存的emptyDir。 - 当需要更大的卷或特定存储类(例如 Azure Managed Disk)时,使用 Generic Ephemeral PVC。
- 将临时卷与 本地 SSD 节点、临时 OS 磁盘 或 自动伸缩节点池 结合使用,以实现最高性能和成本效率。
何时使用持久卷
避免使用临时存储,如果符合以下任意情况:
- 数据必须在 Pod 重启或节点故障后仍然存在。
- 多个 Pod 需要共享同一数据。
- 需要备份、快照或长期保留。
在这些场景下,创建普通的 PersistentVolume 和 PersistentVolumeClaim。
结论
临时存储在 Kubernetes 中是一项被严重低估的优化。对于临时工作负载——CI/CD 流水线、批处理、媒体转码、AI 预处理——它能够提供:
- 速度(本地或内存支持的 I/O)
- 简洁性(无需手动清理)
- 成本效益(没有残留的存储费用)
将临时存储设为短生命周期工作负载的默认选项,可显著提升性能,降低运维开销,并削减云端支出。