本文讨论如何在 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 不同的 APIcgroup
。 如果有任何应用程序直接访问cgroup
文件系统,请将其更新为支持cgroup
v2 的更高版本。 例如:第三方监视和安全代理:
某些监视和安全代理依赖于
cgroup
文件系统。 将这些代理更新为支持cgroup
v2 的版本。Java 应用程序:
使用完全支持
cgroup
v2 的版本:- OpenJDK/HotSpot:
jdk8u372
、11.0.16
、15
和更高版本。 - IBM Semeru Runtimes:
8.0.382.0
、11.0.20.0
、17.0.8.0
和更高版本。 - IBM Java:
8.0.8.6
和更高版本。
- OpenJDK/HotSpot:
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 中跟踪此工作进度。
作为解决方案的一部分,我们计划根据修复的结果调整逐出阈值或更新 资源预留。
参考
- cgroupv2 上的节点内存使用率报告高于 cgroupv1 (GitHub 问题)
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 对这些产品的性能和可靠性不作任何明示或默示担保。
第三方联系人免责声明
Microsoft 会提供第三方联系信息来帮助你查找有关本主题的其他信息。 此联系信息可能会更改,恕不另行通知。 Microsoft 不保证第三方联系信息的准确性。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。