AKS 中的临时存储 — 实践动手实验

发布: (2026年3月1日 GMT+8 18:10)
7 分钟阅读
原文: Dev.to

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: MemoryemptyDir 挂载到 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

工作流

  1. Pod 启动时,Kubernetes 创建 PVC 并使用默认的 StorageClass 供应后端卷。
  2. Pod 删除时,PVC 及其卷会自动移除——无泄漏,无需手动清理。

典型使用场景包括:

  • 数据处理任务
  • 机器学习训练的临时空间
  • 大规模临时工作负载

短暂存储选项比较

特性emptyDir(磁盘)emptyDir(内存)通用短暂 PVC
支持存储节点本地磁盘内存(tmpfs动态供给的卷(例如 Azure Disk、AWS EBS)
性能快速本地 I/O超高速(内存)取决于供给器(通常为网络附加)
大小限制节点磁盘容量节点内存限制在 PVC 规范中定义
自动清理是(Pod 删除时)是(Pod 删除时)是(Pod 删除时)
使用场景构建产物、临时文件缓存、临时处理需要更大、可能基于网络的存储的作业

典型工作流

CI/CD 流水线

  1. Job start – 将仓库克隆到 emptyDir 中。
  2. Build – 在同一个 emptyDir 中生成制品。
  3. Publish – 推送 Docker 镜像或上传制品。
  4. Job end – Pod 退出;emptyDir 自动被移除。

数据处理作业

  1. Download 将数据集下载到临时 PVC 中。
  2. Transform 在本地转换数据。
  3. Upload 将结果上传到外部存储。
  4. Terminate – PVC 被删除,不留下残余费用。

最佳实践

  • 始终为 ephemeral-storage 资源请求和限制 Pod 设置。
  • 对于小型、快速的临时空间,首选 emptyDir;当需要最小化 I/O 延迟时,使用基于内存的 emptyDir
  • 当需要更大的卷或特定存储类(例如 Azure Managed Disk)时,使用 Generic Ephemeral PVC。
  • 将临时卷与 本地 SSD 节点临时 OS 磁盘自动伸缩节点池 结合使用,以实现最高性能和成本效率。

何时使用持久卷

避免使用临时存储,如果符合以下任意情况:

  • 数据必须在 Pod 重启或节点故障后仍然存在。
  • 多个 Pod 需要共享同一数据。
  • 需要备份、快照或长期保留。

在这些场景下,创建普通的 PersistentVolumePersistentVolumeClaim

结论

临时存储在 Kubernetes 中是一项被严重低估的优化。对于临时工作负载——CI/CD 流水线、批处理、媒体转码、AI 预处理——它能够提供:

  • 速度(本地或内存支持的 I/O)
  • 简洁性(无需手动清理)
  • 成本效益(没有残留的存储费用)

将临时存储设为短生命周期工作负载的默认选项,可显著提升性能,降低运维开销,并削减云端支出。

0 浏览
Back to Blog

相关文章

阅读更多 »

vCluster(虚拟集群)

驯服 Kubernetes 野兽:您的 vCluster 虚拟集群指南 曾经觉得在管理 Kube 时自己像在玩弄一千把燃烧的链锯吗……