部署工作负载时,Kubernetes 集群中不断出现“未达到最低可用性”的错误

部署工作负载时,Kubernetes 集群中不断出现“未达到最低可用性”的错误

我目前在 n1 standard1 节点(1vCPU 和 3.75GB 内存)上运行 Kubernetes 集群。我尝试部署 4 个工作负载。

我已将每次部署的资源请求和限制设置为 100m 和 128Mi(对于容器),但是当我尝试部署第 3 个 pod 时,即使该节点同时仅使用 9% 的 CPU,我仍然没有足够的 CPU 可用性。

有人知道发生了什么吗?任何回复都将不胜感激!

答案1

出现以下错误的最可能原因是:

  • “没有最低可用性”

GKE 工作负载

是不是有一些对象(如Pods)没有在集群内部分配。

有一些链接引用了同一条消息:


特别关注问题中显示的例子。

设置如下:

  • 1 个GKE节点,具有:1 vCPU3.75GBRAM

该单节点集群上调度的资源:

  • 4Deployments其中每个具有以下字段:
        resources:
          requests: # <-- IMPORTANT
            cpu: "100m" # <-- IMPORTANT
            memory: "128Mi"
          limits:
            cpu: "100m"
            memory: "128Mi"

举个例子,我试图复制尽可能接近问题中的设置:

  • $ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
nginx-four-99d88fccb-v664b     0/1     Pending   0          51m
nginx-one-8584c66446-rcw4p     1/1     Running   0          53m
nginx-three-5bcb988986-jp22f   1/1     Running   0          51m
nginx-two-6c9545d7d4-mrpw6     1/1     Running   0          52m

如您所见,有一个Pod处于Pending状态。进一步的调查表明:

  • $ kubectl describe pod/nginx-four-99d88fccb-v664b

将显示很多信息Pod,但需要检查的部分是Events

Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  56m (x2 over 56m)  default-scheduler  0/1 nodes are available: 1 Insufficient cpu.
  Normal   Scheduled         56m                default-scheduler  Successfully assigned default/nginx-two-6c9545d7d4-mrpw6 to gke-gke-old-default-pool-641f10b7-36qb
  Normal   Pulling           56m                kubelet            Pulling image "nginx"
  Normal   Pulled            56m                kubelet            Successfully pulled image "nginx"
  Normal   Created           56m                kubelet            Created container nginx
  Normal   Started           56m                kubelet            Started container nginx

从上面的输出可以看出:

  • FailedScheduling: ... 0/1 nodes are available: 1 Insufficient cpu

正如问题中所说:

尽管节点在同一时间只使用了 9% 的 CPU,我仍然遇到 CPU 可用性不足的问题。

CPU 可用性与分配的资源。您的 CPU 使用率可能在 10% 左右,并且仍然会收到Insufficient CPU消息。原因如下:

当您创建 Pod 时,Kubernetes 调度程序会选择一个节点供 Pod 运行。每个节点对每种资源类型都有最大容量:它可以为 Pod 提供的 CPU 和内存量。调度程序确保对于每种资源类型,调度容器的资源请求总和小于节点的容量。请注意,尽管节点上的实际内存或 CPU 资源使用率非常低,但如果容量检查失败,调度程序仍会拒绝将 Pod 放置在节点上。当资源使用量随后增加时(例如,在请求率达到每日峰值期间),这可以防止节点出现资源短缺的情况。

--Kubernetes.io:文档:概念:配置:管理资源容器:如何调度带有资源请求的 Pod

看一下我之前包含的resources.requests部分中的部分Deployment。那里指定了每个PodDeployment希望保证在集群中可用100m的时间。4x = 。CPU100m400m

如果您运行(应用工作负载后):

  • $ kubectl describe node
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource                      Requests          Limits
  --------                      --------          ------
  cpu                          -->939m (99%)<--     501m (53%)
  memory                        1081Mi (40%)      1721Mi (65%)
  ephemeral-storage             0 (0%)            0 (0%)
  hugepages-2Mi                 0 (0%)            0 (0%)
  attachable-volumes-gce-pd     0                 0

已经939M1000M( 3/4 Pods) 分配了 CPU。这就是无法调度其中一个的原因Pod(即使CPU使用率为 10%)。

附注!

这对于每个集群都是特定的,但是这个集群报告是在安排任何工作负载之前请求639m的。CPU

要修复此问题,您可以:

  • 更改.resources.requests部分
  • 使用虚拟专用网络推荐requestslimits
  • 使用不同的节点类型
  • 启用自动缩放

其他资源:

答案2

请使用kubectl describe node XXX来描述您无法分配更多资源的节点。您可能需要通过部署新节点池来增加节点资源,或者将工作负载分散到更多节点上,从而实现自动扩展。

相关内容