部署工作负载时,Kubernetes 集群中不断出现“不具有最低可用性”的信息

Bin*_*Ves 5 kubernetes google-kubernetes-engine

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

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

有谁知道会发生什么?任何回应将不胜感激!

小智 2

显示以下错误的最可能原因:

\n
    \n
  • “没有最低可用性\xe2\x80\x9d
  • \n
\n

GKE 工作负载

\n

是否有一些对象(例如Pods)未在集群内部分配。

\n

有一些链接引用相同的消息:

\n\n
\n

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

\n

设置如下:

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

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

\n
    \n
  • 4 个Deployments,其中每个都有以下字段:
  • \n
\n
        resources:\n          requests: # <-- IMPORTANT\n            cpu: "100m" # <-- IMPORTANT\n            memory: "128Mi"\n          limits:\n            cpu: "100m"\n            memory: "128Mi"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
    \n
  • $ kubectl get pods
  • \n
\n
NAME                           READY   STATUS    RESTARTS   AGE\nnginx-four-99d88fccb-v664b     0/1     Pending   0          51m\nnginx-one-8584c66446-rcw4p     1/1     Running   0          53m\nnginx-three-5bcb988986-jp22f   1/1     Running   0          51m\nnginx-two-6c9545d7d4-mrpw6     1/1     Running   0          52m\n
Run Code Online (Sandbox Code Playgroud)\n

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

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

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

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

从上面的输出可以看出:

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

正如问题中所发布的:

\n
\n

即使节点同时只使用 9% 的 cpu,我仍然遇到没有足够的 cpu 可用性的情况。

\n
\n

此 CPU 可用性与分配的资源严格相关。您的 CPU 使用率可能在 10% 左右,但仍然会遇到Insufficient CPU消息。原因如下:

\n
\n

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

\n

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

\n
\n

看一下我之前包含的resources.requests部分中的部分Deployment。那里指定每个Pod成员都Deployment希望保证集群中的100m时间CPU可用。4x 100m= 400m.

\n

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

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

939M 已经从1000M(已调度的)分配了CPU 3/4 Pods。这就是为什么Pod无法安排其中一项的原因(即使CPU使用率为 10%)。

\n
\n

附注!

\n

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

\n
\n

要解决这个问题,您可以:

\n
    \n
  • 更改.resources.requests部分
  • \n
  • 使用VPA推荐requestslimits
  • \n
  • 使用不同的节点类型
  • \n
  • 启用自动缩放
  • \n
\n
\n

其他资源:

\n\n