Kubernetes 1.25 或更高版本中报告的内存使用率增加

本文讨论如何在 Azure Kubernetes 1.25 或更高版本中解决 Microsoft报告内存使用率 增加的问题。

症状

你遇到以下一个或多个症状:

  • 将 Microsoft Azure Kubernetes 服务 (AKS) 群集升级到 Kubernetes 1.25 或更高版本后,Pod 报告增加了内存使用量。

  • 当运行 kubectl top node 命令时,节点将报告大于 Kubernetes 早期版本中的内存使用情况。

  • 节点内发生 Pod 逐出和内存压力增加。

原因

此增加是由于 Linux 控制组 (cgroup) API 版本 2 中的内存会计变化造成的。 Cgroup v2 现在是 AKS 上的 Kubernetes 1.25 的默认 cgroup 版本。

备注

此问题不同于由不知道 cgroup v2 的应用程序或框架导致的节点中的内存饱和度。 有关详细信息,请参阅 群集升级到 Kubernetes 1.25 后 Pod 中的内存饱和度。

解决方案

  • 如果在节点上观察到频繁的内存压力,请升级订阅以增加虚拟机(VM)可用的内存量。

  • 如果在 Pod 上看到更高的逐出率, 请使用更高的限制和 Pod 请求。

  • cgroup v2 使用与 v1 不同的 API cgroup 。 如果有任何应用程序直接访问 cgroup 文件系统,请将其更新为支持 cgroup v2 的更高版本。 例如:

    • 第三方监视和安全代理

      某些监视和安全代理依赖于 cgroup 文件系统。 将这些代理更新为支持 cgroup v2 的版本。

    • Java 应用程序

      使用完全支持 cgroup v2 的版本:

      • OpenJDK/HotSpot: jdk8u37211.0.1615和更高版本。
      • IBM Semeru Runtimes: 8.0.382.011.0.20.017.0.8.0和更高版本。
      • IBM Java: 8.0.8.6 和更高版本。
    • uber-go/automaxprocs
      如果使用包 uber-go/automaxprocs ,请确保版本为 v1.5.1 或更高版本。

  • 另一种临时解决方案是使用 DaemonSet 还原 cgroup 节点上的版本。 有关详细信息,请参阅 “还原为 cgroup v1 DaemonSet”。

重要

  • 谨慎使用 DaemonSet。 在应用于生产环境之前,在较低的环境中对其进行测试,以确保兼容性并防止中断。
  • 默认情况下,DaemonSet 适用于群集中的所有节点,并重新启动它们以实现 cgroup 更改。
  • 若要控制 DaemonSet 的应用方式,请将 a nodeSelector 配置为面向特定节点。

备注

如果仅在内存使用量增加的情况下,没有“症状”部分提到的任何其他症状,则无需采取任何作。

Status

我们正在积极与 Kubernetes 社区合作,以解决根本问题。 可以在 Azure/AKS 问题 #3443跟踪此工作进度。

作为解决方案的一部分,我们计划根据修复的结果调整逐出阈值或更新 资源预留

参考

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 对这些产品的性能和可靠性不作任何明示或默示担保。

第三方联系人免责声明

Microsoft 会提供第三方联系信息来帮助你查找有关本主题的其他信息。 此联系信息可能会更改,恕不另行通知。 Microsoft 不保证第三方联系信息的准确性。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区