kubernetes - Kubernetes 节点未就绪:ContainerGCFailed / ImageGCFailed 上下文期限已超过
问题描述
工作节点进入“NotReady”状态,在kubectl describe node的输出中出现错误:
ContainerGCFailed rpc 错误:代码 = DeadlineExceeded desc = 超出上下文期限
环境:
Ubuntu,16.04 LTS
Kubernetes 版本:v1.13.3
Docker 版本:18.06.1-ce
在 Kubernetes GitHub k8 git上有一个已关闭的问题,由于与 Docker 问题相关,该问题已关闭。
解决问题的步骤:
- kubectl describe node - 发现有问题的错误(根本原因尚不清楚)。
journalctl -u kubelet - 显示此相关消息:
跳过 pod 同步 - [容器运行时状态检查可能尚未完成,但 PLEG 不健康:pleg 尚未成功]
它与这个 open k8 issue Ready/NotReady with PLEG issues 有关
使用 cloudwatch 检查 AWS 上的节点运行状况——一切似乎都很好。
- journalctl -fu docker.service:检查 docker 是否有错误/问题 - 输出没有显示任何与此相关的错误。
- systemctl restart docker - 重新启动 docker 后,节点进入“就绪”状态,但在 3-5 分钟后再次变为“未就绪”。
当我将更多 pod 部署到节点(接近其资源容量但不认为它是直接依赖)或停止/启动实例(重启后没问题,但一段时间后节点未就绪)时,这一切似乎都开始了)。
问题:
错误的根本原因是什么?
如何监控这类问题并确保它不会发生?
有没有解决这个问题的方法?
解决方案
错误的根本原因是什么?
从我能发现的情况来看,当联系 Docker 出现问题时,似乎会发生错误,要么是因为它超载,要么是因为它没有响应。这是基于我的经验以及您提供的 GitHub 问题中提到的内容。
如何监控这类问题并确保它不会发生?
似乎对此没有明确的缓解或监控。但似乎最好的方法是确保您的节点不会被 pod 超载。我已经看到它并不总是显示在节点的磁盘或内存压力上 - 但这可能是分配给 Docker 的资源不足并且无法及时响应的问题。建议的解决方案是为您的 pod 设置限制,以防止节点过载。
对于 GKE 中的托管 Kubernetes(不确定,但其他供应商可能有类似的功能),有一个称为node auto-repair的功能。这不会阻止节点压力或 Docker 相关问题,但是当它检测到不健康的节点时,它可以耗尽并重新部署节点。
如果您已经拥有资源和限制,那么确保不会发生这种情况的最佳方法似乎是增加 pod 的内存资源请求。这将意味着每个节点的 pod 更少,并且每个节点上实际使用的内存应该更低。
另一种监控/识别这一点的方法可以通过 SSH 进入节点检查内存、进程PS
、监控syslog
和命令 $docker stats --all
推荐阅读
- solr - SOLR 多对多,带有额外的列映射
- c# - 允许用户在基本计算器中使用点表示十进制数
- python - TypeError:无法将 JpegImageFile 连接到字节
- c# - IdentityServer4 with ASP.Net Core App:性能问题 - 太慢了
- javascript - 在(更改)事件回调上具有旧值的角反应形式
- angular - 测试广播服务
- reactjs - React Render 在组件内部不起作用
- node.js - Hyperledger Fabric:如何使用 JS/Node 中的链码捕获交易错误?
- dns - 我可以使用 ANAME(别名)将域指向 CloudFlare CDN 吗?
- python - ansi_re.append(re.compile(br'\xc0\xa8\x02\x17')) 需要正则表达式的含义