我正在裸机 Kubernetes 集群(版本 1.22.1)上测试我的应用程序,并且在将我的应用程序作为作业启动时遇到问题。
我的集群有两个节点(主节点和工作节点),但工作节点被封锁。在主节点上,21GB 内存可供应用程序使用。
我试图同时将我的应用程序作为三个不同的工作启动。由于我将 16GB 的内存设置为资源请求和限制,因此只启动了一个 Job,其余两个处于 Pending 状态。我已将 backoffLimit: 0 设置为 Jobs。
NAME READY STATUS RESTARTS AGE
app1--1-8pp6l 0/1 Pending 0 42s
app2--1-42ssl 0/1 Pending 0 45s
app3--1-gxgwr 0/1 Running 0 46s
第一个 Pod 完成后,应该只启动两个处于 Pending 状态的 Pod 中的一个。但是,一个已启动,另一个处于 OutOfMemory 状态,即使 Pod 中没有启动任何容器。
NAME READY STATUS RESTARTS AGE
app1--1-8pp6l 0/1 Running 0 90s
app2--1-42ssl 0/1 OutOfmemory 0 93s
app3--1-gxgwr 0/1 Completed 0 94s
OutOfMemory Pod 的事件如下:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 3m41s (x2 over 5m2s) default-scheduler 0/2 nodes are available: 1 Insufficient memory, 1 node(s) were unschedulable.
Normal Scheduled 3m38s default-scheduler Successfully assigned test/app2--1-42ssl to master
Warning OutOfmemory 3m38s kubelet Node didn't have enough resource: memory, requested: 16000000000, used: 31946743808, capacity: 37634150400
似乎 Pod 已分配给节点,即使没有足够的空间给它,因为另一个 Pod 刚刚启动。
我想这不是 Kubernetes 的预期行为,有人知道这个问题的原因吗?
这是版本的已知问题
1.22.x
- 您可以找到有关此的多个 GitHub 和 Stackoverflow 主题,例如:该问题的修复包含在 1.23 版本中:
因此,请将您的 Kubernetes 集群升级到最新的稳定版本。
我希望它会对您有所帮助,但请记住,即使应用了修复程序,Github 上仍存在另一个类似问题(此处提到大约 10 天前 - 状态为 2022 年 1 月 13 日):
那么,可能唯一的解决方案就是降级到 1.21 版本。
您可以发布 pod 的 yaml 吗?
我在我的一个客户那里遇到过类似的情况,他们在内存限制(860m 而不是 860Mi)处有错字,值得一看