KUBERNETES中的OOM KILLER优化技巧

Kubernetes 中的内存不足 (OOM) 杀手:如何优化容器内存管理并保持应用程序稳定性

译自OOM Killer in Kubernetes: Optimization Tips,作者 Karina Babcock。

在 Kubernetes 上大规模运行容器化应用程序需要仔细的资源管理。一个非常复杂但常见的挑战是防止内存不足 (OOM) 杀死,当容器的内存消耗超过其分配的限制时就会发生这种情况。这种由 Kubernetes 内核的 OOM 杀手进行的粗暴终止会破坏应用程序的稳定性,并可能影响应用程序的可用性和整个环境的健康状况。

在本文中,我们将探讨 OOM 杀死可能发生的原因,并提供应对和防止它们的策略。

在深入研究之前,值得注意的是,OOM 杀死是一种症状,可能有多种根本原因。对于组织来说,实施一个能够快速准确地解决根本原因分析问题的系统非常重要,这样可靠性工程团队就可以快速响应,并有可能从一开始就防止这些事件发生。

深入了解 OOM 杀死

Kubernetes中的内存不足 (OOM) 杀死发生在容器超过其内存限制时,导致 Kubernetes 内核的 OOM 杀手终止容器。这会影响应用程序的稳定性,需要立即关注。

以下几个因素可能会在您的 Kubernetes 环境中触发 OOM 杀死:

  • 内存限制超过:这是最常见的原因。如果容器持续超过其指定的内存上限,OOM 杀手就会介入以防止系统崩溃。
  • 内存泄漏:应用程序可能会随着时间的推移而出现内存泄漏,它们分配内存但无法正确释放。这种隐藏的、意外的增长最终会导致 OOM 杀死。
  • 资源过度承诺:将太多资源密集型 Pod 共同放置在一个节点上会导致可用内存耗尽。当组合的内存使用量超过容量时,OOM 杀手就会启动。
  • 突发工作负载:具有尖峰工作负载的应用程序可能会经历突然的内存激增,从而突破其限制,触发 OOM 杀死。

例如,一个出现内存泄漏代码错误的 Web 服务器可能会逐渐消耗越来越多的内存,直到 OOM 杀手介入以防止崩溃。

另一种情况可能是当 Kubernetes 集群通过在单个节点上调度太多 Pod 来过度承诺资源时。OOM 杀手可能需要介入以释放内存并确保系统稳定性。

OOM 杀死的破坏性影响:为什么它们很重要

OOM 杀死通常不会发生。它们会对您的应用程序和集群的整体健康状况造成一系列负面影响,例如:

  • 应用程序停机:当容器被 OOM 杀死时,它会突然终止,导致应用程序立即停机。用户可能会遇到服务中断和停机。
  • 数据丢失:依赖内存中数据或有状态会话的应用程序在 OOM 杀死期间可能会丢失关键信息。
  • 性能下降:频繁的 OOM 杀死会导致容器反复重启。这种持续的波动会降低应用程序的整体性能和用户体验。
  • 服务中断:应用程序通常相互交互。一个容器中的 OOM 杀死可能会中断服务间通信,导致级联故障和更广泛的服务中断。

如果运行关键数据库服务的容器遇到 OOM 杀死,可能会导致数据丢失和损坏。这会导致依赖数据库获取信息的其它容器的服务中断,从而导致整个应用程序生态系统出现级联故障。

应对 OOM 杀死

有一些不同的策略可以用来应对 OOM 杀死,以尝试运行一个内存高效的 Kubernetes 环境。

设置适当的资源请求和限制

例如,您可以在 Kubernetes 部署中为特定容器设置 200Mi 的内存请求和 300Mi 的内存限制。请求确保容器至少获得 200Mi 的内存,而限制将其限制在 300Mi 以防止过度消耗。

resources:  requests:    memory: "200Mi"  limits:    memory: "300Mi"

虽然这可能会缓解潜在的内存使用问题,但这是一个非常手动化的过程,并且根本没有处理我们使用 Kubernetes 可以实现的动态特性。它也不能解决源问题,源问题可能是触发内存泄漏或 GC 进程失败的代码级问题。

转向自动扩展

利用自动扩展功能是资源分配的核心动态选项。有两种自动扩展方法:

  • 垂直 Pod 自动伸缩 (VPA):VPA根据实时内存使用模式动态调整资源限制。这确保容器拥有足够的内存来运行,但避免过度配置。
  • 水平 Pod 自动伸缩 (HPA):HPA根据内存使用情况向上或向下扩展运行应用程序的 Pod 数量。这将内存使用情况分布在多个 Pod 上,防止任何单个 Pod 超出其限制。以下 HPA 配置显示了根据内存使用情况进行扩展的示例:
apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata:  name: my-app-hpaspec:  scaleTargetRef:    apiVersion: apps/v1    kind: Deployment    name: my-app  minReplicas: 2  maxReplicas: 10  metrics:  - type: Resource    resource:      name: memory      target:        type: Utilization        averageUtilization: 80

监控内存使用情况

主动监控是关键。例如,您可以配置Prometheus每 15 秒从您的 Kubernetes Pod 中抓取内存指标,并设置Grafana仪表板以可视化内存使用趋势。此外,您可以在 Prometheus 中创建警报,以便在内存使用量超过某个阈值时触发通知。

优化应用程序内存使用情况

不要低估代码优化的力量。解决应用程序中的内存泄漏,并实施内存高效的数据结构以最大程度地减少内存消耗。

Pod 中断预算 (PDB)

在部署更新时,PDB确保即使在推出期间,也保持最少的 Pod 可用。这减轻了在部署期间广泛发生 OOM 杀死的风险。以下是一个 PDB 配置示例,有助于确保最小的 Pod 可用性。

apiVersion: policy/v1kind: PodDisruptionBudgetmetadata:  name: my-app-pdbspec:  minAvailable: 80%  selector:    matchLabels:      app: my-app

管理节点资源

您可以应用节点选择器以确保内存密集型 Pod 仅调度到具有至少 8GB 内存的节点上。此外,您可以使用污点和容忍度将具有高内存容量的特定节点专门用于内存密集型应用程序,从而防止由于资源限制而导致的 OOM 杀死。

nodeSelector:  disktype: ssdtolerations:- key: "key"  operator: "Equal"  value: "value"  effect: "NoSchedule"

使用 QoS 类别

Kubernetes 提供服务质量 (QoS) 类别,这些类别优先考虑对关键应用程序的资源分配。将最高 QoS 类别分配给最不能容忍 OOM 杀死的应用程序。以下是一个带有 QoS 参数的资源配置示例:

resources:  requests:    memory: "1Gi"    cpu: "500m"  limits:    memory: "1Gi"    cpu: "500m"

这些只是一些可能有助于防止 OOM 杀死的策略。挑战在于它们发生的频率以及发生时对应用程序的风险。

可以想象,在 Kubernetes 环境中,不可能手动管理资源利用率并保证容器化应用程序的稳定性和性能。

手动阈值 = 僵化和风险

这些技术可以帮助降低 OOM 杀死的风险。但是,问题并没有完全解决。通过设置手动阈值和限制,您将消除 Kubernetes 的许多动态优势。

解决 OOM 杀死问题的更理想方法是使用自适应的动态资源分配。即使您在初始部署时正确地分配了资源,也会有许多因素会改变应用程序消耗资源的方式。还存在风险,因为应用程序和资源问题不仅会影响一个 Pod 或一个容器。资源问题可能会波及集群的各个部分,并降低其他正在运行的应用程序和服务的性能。

哪种策略最有效地防止 OOM 杀死?

垂直 Pod 自动伸缩 (VPA) 和水平 Pod 自动伸缩 (HPA) 是用于管理 Kubernetes 容器中资源限制的常用策略。VPA 根据实时内存使用模式调整资源限制,而 HPA 根据内存使用情况扩展 Pod。

使用 Prometheus 等工具进行监控可能有助于解决内存使用趋势问题。优化应用程序内存使用情况并非易事,因为确定是基础设施还是代码导致问题尤其具有挑战性。

Pod Disruption Budgets (PDB) 可以帮助确保在部署期间始终保持最少数量的 Pod 可用,而节点选择器和污点则可以用于管理节点资源。服务质量 (QoS) 类别会优先为关键应用程序分配资源。

有一点是肯定的:OOM 杀死是使用传统监控工具和方法管理的常见且代价高昂的挑战。

Causely,我们专注于应用因果推理软件来帮助组织保持应用程序的健康和弹性。通过自动化根本原因分析,可以立即解决诸如 OOM 杀死之类的问题,并避免新版本或应用程序更改的意外后果。

本文在云云众生https://yylives.cc/)首发,欢迎大家访问。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,030评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,310评论 3 415
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,951评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,796评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,566评论 6 407
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,055评论 1 322
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,142评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,303评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,799评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,683评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,899评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,409评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,135评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,520评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,757评论 1 282
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,528评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,844评论 2 372

推荐阅读更多精彩内容