CFN Cloud
Cloud Future New Life
en zh
2025-10-09 · 0 次浏览

临时卷(Ephemeral Volume)

临时卷与 Pod 生命周期绑定,适合缓存与中间文件。

临时卷会随着 Pod 的删除而消失,常用于缓存、构建产物或临时文件。它们轻量、易用,但不适合保存需要长期保留的数据。

本节补充了临时卷类型、容量配置、资源限制与调度影响,帮助你在实际场景中做出正确选择。

什么是临时卷

最常用的是 emptyDir。另外 Kubernetes 也支持 generic ephemeral volume,可通过 StorageClass 动态分配短期存储。

典型场景

  • 运行时缓存与临时文件
  • 数据处理中的中间结果
  • sidecar 与主容器共享数据
  • CI/批处理任务的临时空间

emptyDir 基础

emptyDir 在 Pod 调度时创建,Pod 删除后释放:

volumes:
  - name: scratch
    emptyDir:
      sizeLimit: 1Gi

挂载到容器:

volumeMounts:
  - name: scratch
    mountPath: /tmp

内存盘 emptyDir

需要更高性能时可用内存盘:

emptyDir:
  medium: Memory
  sizeLimit: 512Mi

它会占用节点内存,容量过大可能导致 OOM。

Generic Ephemeral Volume

可以通过 StorageClass 分配短期 PVC:

volumes:
- name: cache
  ephemeral:
    volumeClaimTemplate:
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: fast-ssd
        resources:
          requests:
            storage: 5Gi

该 PVC 会随 Pod 创建和删除,适合批处理或短期任务。

Sidecar 共享示例

主容器写日志,sidecar 读取并处理:

containers:
- name: app
  image: my-app:latest
  volumeMounts:
  - name: shared
    mountPath: /var/log/app
- name: shipper
  image: busybox
  command: ["sh", "-c", "tail -F /var/log/app/app.log"]
  volumeMounts:
  - name: shared
    mountPath: /var/log/app

最佳实践

  • 尽量为 emptyDir 设置 sizeLimit。
  • 缓存可重建,避免存放关键数据。
  • 需要极低延迟的临时数据可用内存盘。
  • 统一临时目录路径,便于清理脚本生效。

示例:构建工作区

CI 或构建任务需要短期空间,可用临时卷:

volumes:
  - name: workspace
    emptyDir: {}
volumeMounts:
  - name: workspace
    mountPath: /workspace

构建产物要在 Pod 退出前上传到对象存储或持久卷。

调度与磁盘压力

临时存储会受到节点磁盘压力影响,空间不足时 Pod 可能被驱逐。可以通过事件观察 eviction 或 disk pressure:

kubectl describe node <node>

资源请求与限制

可以为临时存储设置 requests/limits:

resources:
  requests:
    cpu: "100m"
    memory: "256Mi"
    ephemeral-storage: "1Gi"
  limits:
    cpu: "500m"
    memory: "512Mi"
    ephemeral-storage: "2Gi"

这样调度器会保证节点有足够空间。

生命周期与清理

临时卷与 Pod 生命周期绑定,Pod 被重建或迁移到其他节点时,数据会丢失。缓存类数据要可重建,避免依赖临时卷保存关键状态。

大小限制与行为

emptyDir.sizeLimit 是软限制,超过后可能被驱逐。建议同时设置 ephemeral-storage requests/limits,提升调度可预测性。

Generic Ephemeral 与 PVC 的区别

Generic Ephemeral Volume 会随 Pod 创建和删除,适合短期任务或批处理;PVC 适合需要长期保留的数据。不要用临时卷替代数据库存储。

容器日志与磁盘压力

容器日志同样会占用节点临时存储。日志过多会触发 disk pressure 导致 Pod 被驱逐,建议配置日志轮转或集中采集。

示例:初始化缓存

用 init 容器预热缓存:

initContainers:
- name: warm-cache
  image: busybox
  command: ["sh", "-c", "echo warm > /cache/seed.txt"]
  volumeMounts:
  - name: cache
    mountPath: /cache
containers:
- name: app
  image: my-app:latest
  volumeMounts:
  - name: cache
    mountPath: /cache

可观测性

查看节点临时存储与 Pod 消耗:

kubectl describe node <node>
kubectl top pod -A

在 Pod 内部查看磁盘使用:

kubectl exec -it <pod-name> -- df -h

安全注意事项

临时卷位于节点文件系统,不适合存放敏感数据。若必须使用,建议采用内存盘并严格控制大小。

涉及合规数据时,优先避免写入临时卷或在写入前加密。

不适合临时卷的场景

  • 数据库或需要长期保存的数据
  • 审计日志或合规数据
  • 用户上传文件

常见问题

  • Pod Pending:节点临时存储不足。
  • Evicted:磁盘压力触发驱逐。
  • IO 慢:节点磁盘被其他工作负载占满。

排查命令:

kubectl describe pod <pod-name>
kubectl get events -A

如频繁驱逐,减少缓存占用或把任务分散到更多节点。

实操要点

  • 先做快速盘点:kubectl get nodeskubectl get pods -Akubectl get events -A
  • 对比“期望状态”和“实际状态”,kubectl describe 往往能解释漂移或失败原因。
  • 名称、Label、Selector 要一致,避免 Service 或控制器找不到 Pod。

快速检查清单

  • 资源定义与业务意图一致。
  • Namespace、权限、镜像与环境匹配。
  • 上线前具备健康探针与可观测日志。
  • 临时存储使用量有边界。

实战补充

把快速入门应用到真实业务时,建议固定一套检查项:资源 requests、就绪探针、日志覆盖、告警阈值、回滚步骤。清单要短小、可重复,并随仓库一起维护,这样每次发布都能快速对齐标准。

排障路径

从现象入手,不要先猜原因。先看事件,再看日志,最后验证流量路径和配置版本是否一致。若访问异常,先确认 readiness 和 endpoints,再逐段排查入口到后端的链路。记录每一步改动,方便回滚和复盘。

小练习

在测试环境做几次常见操作:扩缩容、重启单个 Pod、调整一项配置并验证效果。通过这些小练习,你能更直观地感受到系统收敛速度和异常时的行为。

维护与责任

明确服务归属、值班人和升级窗口,准备常见故障的处理步骤。依赖服务也需要纳入监控和备份计划,确保问题出现时能快速定位和恢复。

交付提醒

发布后用用户视角快速验证一次:访问核心接口、观察延迟和错误率,确认新旧 Pod 的状态稳定。如果涉及存储或网络,顺手核对磁盘用量、DNS 和 endpoints 是否正常。

回滚预案

写下最小可行的回滚步骤,包括需要恢复的配置、镜像版本和校验方式。这样在出现异常时可以迅速还原,而不是现场临时拼步骤。

参考链接