我在一个相当新的集群上遇到了一些问题,其中几个节点(似乎总是成对发生,但可能只是巧合)将变为 NotReady,并且
kubectl describe
会说 Kubelet 停止发布内存、磁盘的节点状态,PID并准备好。
所有正在运行的 pod 都陷入了终止状态(可以使用 k9s 连接到集群并看到这一点),我找到的唯一解决方案是封锁并排空节点。几个小时后,它们似乎被删除并创建了新的。或者,我可以使用 kubectl 删除它们。
它们完全无法通过 ssh 访问(超时),但 AWS 报告 EC2 实例没有问题。
这种情况在过去一周已经发生了三次。一切都恢复得很好,但显然存在一些问题,我想弄清楚它的真相。
如果我根本无法进入箱子,我该如何了解发生了什么? (实际上我只是想到也许可以拍摄该卷的快照并安装它,因此如果再次发生这种情况我会尝试,但欢迎任何其他建议)
运行 kubernetes v1.18.8
我遇到了同样的问题,20-30 分钟后,我的节点进入
NotRready
状态,并且链接到这些节点的所有 pod 都陷入 Terminating
状态。top
命令来检查正在运行的进程。kswapd0
。kswapd0
进程消耗超过 50% 的 CPU!根本原因:
某些 Pod 消耗了 400% 的内存请求(定义于Kubernetes 部署),因为它们最初配置不足。因此,当我的节点启动时,Kubernetes 将它们放置在每个 pod 仅有 32Mb 内存请求(我定义的值)的节点上,但这还不够。
解决方案:
解决方案是增加容器请求:
requests:
memory: "32Mi"
cpu: "20m"
limits:
memory: "256Mi"
cpu: "100m"
使用这些值(就我而言):
requests:
memory: "256Mi"
cpu: "20m"
limits:
memory: "512Mi"
cpu: "200m"
重要:
之后,我对节点进行了滚动更新(cordon > drain > delete),以确保 Kubernetes 为我新启动的 pod 直接保留足够的内存。
结论:
定期检查 Pod 的内存消耗,并随着时间的推移调整您的资源请求。
目标是永远不要让您的节点因内存饱和而感到惊讶,因为交换对于您的节点来说可能是致命的。
这里有两种最常见的可能性,都很可能是由大负载引起的:
Out of Memory
错误。可以通过在--kubelet-extra-args
上添加适当的BootstrapArguments
来解决。例如:--kubelet-extra-args "--kube-reserved memory=0.3Gi,ephemeral-storage=1Gi --system-reserved memory=0.2Gi,ephemeral-storage=1Gi --eviction-hard memory.available<200Mi,nodefs.available<10%"
问题解释这里:
kubelet 有时无法修补其节点状态,因为超过 250 个 资源保留在节点上,kubelet 无法观看超过 250 个流 同时使用 kube-apiserver。所以,我只是调整 kube-apiserver --http2-max-streams-per-connection 到 1000 以减轻痛苦。
您可以调整上面提供的值,或者尝试找到高负载/IOPS 的原因并尝试将其调低。
答案是 iops 问题,因为 du 命令来自(我认为)cadvisor。我已经转移到 io1 盒子,并且从那时起就保持了稳定性,因此将其标记为已关闭,并将 ec2 实例类型的移动作为解决方案
感谢您的帮助!
就我而言,OKE 集群中的节点资源存在问题。 2 个 cpu 和 2 GB 内存不够,因此在创建节点并加入集群几分钟后 kubelet 停止响应。我换成4个cpu和4GB内存