本文讨论解决内存饱和问题的方法。 如果至少一个应用程序或进程需要比容器主机可以提供的内存多,或者主机耗尽其可用内存,则会发生内存饱和。
先决条件
- Kubernetes kubectl 命令行工具。 若要使用 Azure CLI 安装 kubectl,请运行 az aks install-cli 命令。
- 用于高级进程级别内存分析的开源项目 Inspektor 小工具 。 有关详细信息,请参阅 如何在 AKS 群集中安装 Inspektor 小工具。
现象
下表概述了内存饱和的常见症状。
症状 | 说明 |
---|---|
不可计划 Pod | 如果节点接近其设置内存限制,则无法计划其他 Pod。 |
Pod 逐出 | 如果节点内存不足,kubelet 可以逐出 Pod。 尽管控制平面尝试在具有资源的其他节点上重新计划被逐出的 Pod,但不能保证其他节点有足够的内存来运行这些 Pod。 |
节点未就绪 | 内存饱和可能导致 kubelet 无 containerd 响应,最终导致节点就绪性问题。 |
内存不足 (OOM) 终止 | 如果 Pod 逐出无法阻止节点问题,则会出现 OOM 问题。 |
故障排除清单
若要减少内存饱和度,请使用有效的监视工具并应用最佳做法。
步骤 1:识别内存饱和的节点
使用以下任一方法标识内存饱和的节点:
在 Web 浏览器中,使用 Azure 门户 中 AKS 的容器见解功能。
在控制台中,使用 Kubernetes 命令行工具(kubectl)。
Container Insights 是 AKS 中的一项功能,用于监视容器工作负荷性能。 有关详细信息,请参阅为 Azure Kubernetes 服务 (AKS) 群集启用容器见解。
在Azure 门户上,搜索并选择 Kubernetes 服务。
在 Kubernetes 服务列表中,选择群集的名称。
在群集的导航窗格中,找到 “监视 ”标题,然后选择“ 见解”。
设置适当的 时间范围 值。
选择“节点”选项卡。
在“指标”列表中,选择“内存工作集”(从 Allocatable 计算)。
在百分位选择器中,将示例设置为 “最大”,然后选择 “最大百分比 ”列标签两次。 此操作按所用内存的最大百分比(从高到低)对表节点进行排序。
由于第一个节点的内存使用率最高,因此请选择该节点来调查节点上运行的 Pod 的内存使用情况。
注意
Pod 的 CPU 或内存使用量百分比取决于为容器指定的 CPU 请求。 它不表示节点的 CPU 或内存使用量的百分比。 因此,请查看实际的 CPU 或内存使用率,而不是 Pod CPU 或内存使用量的百分比。
确定使用高内存的 Pod 后,可以识别 Pod 上运行的应用程序,或识别可能占用过多内存的进程。
步骤 2:确定进程级内存使用情况
若要进行高级进程级内存分析,请使用 Inspektor 小工具 监视 Pod 中进程级别的实时内存使用情况:
使用文档中的说明安装 Inspektor 小工具
运行 top_process小工具 以识别使用大量内存的进程。 可以使用
--fields
来选择特定的列,并使用--filter
根据特定字段值筛选事件,例如筛选那些之前识别出的内存消耗量较高的 pods 的名称。 您还可以:确定群集中前 10 个占用内存的进程:
kubectl gadget run top_process --sort -memoryRelative --max-entries 10
确定特定节点上消耗最大的内存进程:
kubectl gadget run top_process --sort -memoryRelative --filter k8s.node==<node-name>
确定特定命名空间中消耗最大的内存进程:
kubectl gadget run top_process --sort -memoryRelative --filter k8s.namespace==<namespace>
确定特定 Pod 中占用内存最多的进程:
kubectl gadget run top_process --sort -memoryRelative --filter k8s.podName==<pod-name>
Inspektor 小工具
top_process
命令的输出如下所示:K8S.NODE K8S.NAMESPACE K8S.PODNAME PID COMM MEMORYVIRTUAL MEMORYRSS MEMORYRELATIVE aks-agentpool-3…901-vmss000001 default memory-stress 21676 stress 944 MB 943 MB 5.6 aks-agentpool-3…901-vmss000001 default memory-stress 21678 stress 944 MB 943 MB 5.6 aks-agentpool-3…901-vmss000001 default memory-stress 21677 stress 944 MB 872 MB 5.2 aks-agentpool-3…901-vmss000001 default memory-stress 21679 stress 944 MB 796 MB 4.8
可以使用此输出来标识节点上消耗最多内存的进程。 输出可以包括节点名称、命名空间、Pod 名称、容器名称、进程 ID(PID)、命令名称(COMM)、CPU 和内存使用情况,请查看 文档 以了解更多详细信息。
步骤 3:查看避免内存饱和的最佳做法
请查看下表,了解如何实现避免内存饱和的最佳做法。
最佳做法 | 说明 |
---|---|
使用内存 请求和限制 | Kubernetes 提供了用于指定容器的最小内存大小(请求)和最大内存大小(限制)的选项。 通过在 Pod 上配置限制,可以避免节点上的内存压力。 请确保正在运行的所有 Pod 的聚合限制不超过节点的可用内存。 这种情况称为 过度使用。 Kubernetes 计划程序根据 通过服务质量 (QoS)设置请求和限制分配资源。 如果没有适当的限制,计划程序可能会在单个节点上规划过多的 Pod。 这最终可能会关闭节点。 此外,当 kubelet 逐出 Pod 时,它会优先处理内存使用量超过其定义的请求的 Pod。 建议将内存请求设置为接近实际使用情况。 |
启用水平 Pod 自动缩放程序 | 通过缩放群集,可以跨多个 Pod 均衡请求,以防止内存饱和。 此方法可以减少特定节点上的内存占用。 |
使用 反关联标记 | 对于内存不受设计限制的方案,可以使用节点选择器和相关性或反相关性标记,它们可将工作负载隔离到特定节点。 通过使用反相关性标记,可以阻止其他工作负载在这些节点上计划 Pod。 这可以减少内存饱和问题。 |
选择 更高的 SKU VM | 具有更多随机访问内存 (RAM) 的虚拟机 (VM) 更适合处理高内存使用率。 若要使用此选项,必须创建新的节点池,封锁节点(使其不可计划),并清空现有节点池。 |
隔离 系统和用户工作负荷 | 建议在用户节点池上运行应用程序。 此配置可确保你可以将特定于 Kubernetes 的 Pod 隔离到系统节点池中,并保持群集性能。 |
详细信息
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 对这些产品的性能和可靠性不作任何明示或默示担保。
第三方联系人免责声明
Microsoft 会提供第三方联系信息来帮助你查找有关本主题的其他信息。 此联系信息可能会更改,恕不另行通知。 Microsoft 不保证第三方联系信息的准确性。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。