我目前在 n1 standard1 节点(1vCPU 和 3.75GB 内存)上运行 Kubernetes 集群。我尝试部署 4 个工作负载。
我已将每次部署的资源请求和限制设置为 100m 和 128Mi(对于容器),但是当我尝试部署第 3 个 pod 时,即使该节点同时仅使用 9% 的 CPU,我仍然没有足够的 CPU 可用性。
有人知道发生了什么吗?任何回复都将不胜感激!
答案1
出现以下错误的最可能原因是:
- “没有最低可用性”
是不是有一些对象(如Pods
)没有在集群内部分配。
有一些链接引用了同一条消息:
特别关注问题中显示的例子。
设置如下:
- 1 个
GKE
节点,具有:1 vCPU
和3.75
GBRAM
该单节点集群上调度的资源:
- 4
Deployments
其中每个具有以下字段:
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 放置在节点上。当资源使用量随后增加时(例如,在请求率达到每日峰值期间),这可以防止节点出现资源短缺的情况。
看一下我之前包含的resources.requests
部分中的部分Deployment
。那里指定了每个Pod
都Deployment
希望保证在集群中可用100m
的时间。4x = 。CPU
100m
400m
如果您运行(应用工作负载后):
$ 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
已经939M
从1000M
( 3/4
Pods
) 分配了 CPU。这就是无法调度其中一个的原因Pod
(即使CPU
使用率为 10%)。
附注!
这对于每个集群都是特定的,但是这个集群报告是在安排任何工作负载之前请求
639m
的。CPU
要修复此问题,您可以:
- 更改
.resources.requests
部分 - 使用虚拟专用网络推荐
requests
和limits
- 使用不同的节点类型
- 启用自动缩放
其他资源:
答案2
请使用kubectl describe node XXX
来描述您无法分配更多资源的节点。您可能需要通过部署新节点池来增加节点资源,或者将工作负载分散到更多节点上,从而实现自动扩展。