如何限制 pod 的根磁盘空间

如何限制 pod 的根磁盘空间

我已将 pod 部署在具有 100gb 卷的节点上。我只希望 pod 具有 50gb 根磁盘空间。

所以我有这样的配置deployment.yaml

         resources:
            requests:
              ephemeral-storage: "50G"
            limits:
              ephemeral-storage: "70G"

但当我检查容器时(容器中只有 1 个容器),我发现节点上的所有磁盘空间都分配给了容器。从这里,我认为ephemeral-storage控制为 pod 分配多少磁盘空间。

# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         100G  6.5G   94G   7% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/nvme0n1p1  100G  6.5G   94G   7% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           1.9G     0  1.9G   0% /proc/acpi
tmpfs           1.9G     0  1.9G   0% /sys/firmware

知道我做错了什么吗?

答案1

整个空间(/)对您可见并不意味着该空间可用/可分配。

Kubelet将监控您的临时存储的使用情况Pod并采取相应措施(通过驱逐Pod超出限制的):

临时存储消耗管理

如果 kubelet 将本地临时存储作为资源进行管理,则 kubelet 会通过以下方式测量存储使用情况:

  • emptyDir卷,除了临时文件 emptyDir
  • 保存节点级日志的目录
  • 可写容器层如果 Pod 使用的临时存储超出您允许的范围,则 kubelet 会设置一个驱逐信号,触发 Pod 驱逐。

--Kubernetes.io:文档:概念:配置:管理资源容器:资源临时存储消耗


请看下面的例子:

假设您有以下Pod清单:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        ephemeral-storage: "2Gi"
      limits:
        ephemeral-storage: "4Gi"

为临时存储配置的限制是4Gi。要检查会发生什么,您可以运行:

  • kubectl exec -it nginx -- fallocate -l 10GB /evict.img

附注!

fallocate用于操作文件分配的磁盘空间,可以解除分配或预分配。

--Man7.org:Linux:手册页:Fallocate

一段时间后你应该会看到:

  • $ kubectl describe pod nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         XYZ
Start Time:   Mon, 05 Jul 2021 09:47:08 +0200
Labels:       <none>
Annotations:  <none>
Status:       Failed # <-- IMPORTANT!
Reason:       Evicted  # <-- IMPORTANT!
Message:      Pod ephemeral local storage usage exceeds the total limit of containers 4Gi.  # <-- IMPORTANT!
<-- REDACTED --> 
    Limits:
      ephemeral-storage:  4Gi # <-- IMPORTANT!
    Requests:
      ephemeral-storage:  2Gi
<-- REDACTED --> 
Events:
  Type     Reason     Age   From               Message
  ----     ------     ----  ----               -------
  Normal   Scheduled  32s   default-scheduler  Successfully assigned default/nginx to XYZ
  Normal   Pulling    31s   kubelet            Pulling image "nginx"
  Normal   Pulled     31s   kubelet            Successfully pulled image "nginx" in 360.098619ms
  Normal   Created    31s   kubelet            Created container nginx
  Normal   Started    31s   kubelet            Started container nginx
  Warning  Evicted    3s    kubelet            Pod ephemeral local storage usage exceeds the total limit of containers 4Gi. # <-- IMPORTANT!
  Normal   Killing    3s    kubelet            Stopping container nginx  # <-- IMPORTANT!
  • $ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
nginx   0/1     Evicted   0          9m7s

其他资源:

相关内容