为何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-storagelimits/requests,都是基于实际已使用的磁盘物理空间来计算的,而不是文件的名义显示大小。 - 只有当Pod实际使用的存储(包括容器根文件系统、emptyDir卷等的真实磁盘占用)超过限制时,才会触发驱逐或限制行为。
- 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
相关产品推荐
相关产品推荐

