You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Kubernetes作业突破临时存储限制仍未被驱逐?

为什么Kubernetes Job创建超出emptyDir大小限制的文件后未被驱逐?

我定义了如下Kubernetes Job:

apiVersion: batch/v1
kind: Job
metadata:
  name: ephemeral-limit-test
spec:
  template:
    spec:
      containers:
      - name: ephemeral-limit-test
        image: alpine
        command: ["sh", "-c"]
        args: ["cd /tmp && truncate -s 200M dummy && pwd && ls -lh dummy"]
        resources:
          requests:
            ephemeral-storage: "100Mi"
          limits:
            ephemeral-storage: "100Mi"
        volumeMounts:
        - name: ephemeral
          mountPath: "/tmp"
      restartPolicy: Never
      volumes:
        - name: ephemeral
          emptyDir:
            sizeLimit: "100Mi"
  backoffLimit: 4

我将ephemeral-storage的请求和限制均设置为100Mi,与emptyDir的sizeLimit一致,但Job执行后输出显示成功创建了200M的文件:

/tmp           
-rw-r--r--    1 root     root      200.0M Sep 18 14:01 dummy

核心原因:你创建的是稀疏文件,实际未占用100Mi以上的磁盘空间

  • truncate命令的特性:truncate -s 200M dummy只是修改了文件的元数据,将其名义大小设为200M,但并没有向磁盘写入任何实际数据。这类文件被称为稀疏文件,磁盘上实际只占用了极小的存储空间(仅文件元数据对应的块),远低于你设置的100Mi限制。

  • Kubernetes存储限制的判定逻辑:

    • emptyDir的sizeLimit、容器的ephemeral-storage limits/requests,都是基于实际已使用的磁盘物理空间来计算的,而不是文件的名义显示大小。
    • 只有当Pod实际使用的存储(包括容器根文件系统、emptyDir卷等的真实磁盘占用)超过限制时,才会触发驱逐或限制行为。

验证真实存储限制的方法

如果要测试真实的存储占用触发限制的场景,需要写入实际数据而非创建稀疏文件,比如把命令改成:

cd /tmp && dd if=/dev/zero of=/tmp/dummy bs=1M count=200 && pwd && ls -lh dummy

这个命令会真正向磁盘写入200M的零数据,此时实际占用的磁盘空间会超过100Mi的限制,Kubernetes会触发emptyDir的大小限制,Pod会被驱逐或者命令执行失败(取决于具体的节点存储监控机制)。

内容的提问来源于stack exchange,提问作者franDayz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:18:58