首页 > 其他分享 >K8S的OOM和cpu节流

K8S的OOM和cpu节流

时间:2023-06-16 14:04:55浏览次数:56  
标签:container 节流 Kubernetes OOM CPU 内存 进程 K8S cpu

介绍

使用 Kubernetes 时,内存不足 (OOM) 错误和 CPU 节流是云应用程序中资源处理的主要难题。

这是为什么?

云应用程序中的 CPU 和内存要求变得越来越重要,因为它们与您的云成本直接相关。

通过 limits 和 requests ,您可以配置 pod 应如何分配内存和 CPU 资源,以防止资源匮乏并调整云成本。

如果节点没有足够的资源, Pod 可能会通过抢占或节点压力被驱当一个进程运行内存不足 (OOM) 时,它会被终止,因为它没有所需的资源。

如果 CPU 消耗高于实际限制,进程将开始节流。

但是,如何主动监控 Kubernetes Pod 到达 OOM 和 CPU 节流的距离有多近?

Kubernetes OOM

Pod 中的每个容器都需要内存才能运行。

Kubernetes limits 是在 Pod 定义或 Deployment 定义中为每个容器设置的。

所有现代 Unix 系统都有一种方法来终止进程,以防它们需要回收内存。这将被标记为错误 137 或OOMKilled.

State:          Running
      Started:      Thu, 10 Oct 2019 11:14:13 +0200
    Last State:     Terminated
      Reason:       OOMKilled
      Exit Code:    137
      Started:      Thu, 10 Oct 2019 11:04:03 +0200
      Finished:     Thu, 10 Oct 2019 11:14:11 +0200

此退出代码 137 表示该进程使用的内存超过允许的数量,必须终止。

这是 Linux 中存在的一个特性,内核oom_score为系统中运行的进程设置一个值。此外,它允许设置一个名为 oom_score_adj 的值,Kubernetes 使用该值来允许服务质量。它还具有一个 OOM Killer功能,它将审查进程并终止那些使用比他们应该使用上限更多的内存的进程。

请注意,在 Kubernetes 中,进程可以达到以下任何限制:

  • 在容器上设置的 Kubernetes Limit。
  • 在命名空间上设置的 Kubernetes ResourceQuota。
  • 节点的实际内存大小。

K8S的OOM和cpu节流_K8S

内存过量使用

Limits 可以高于 requests,因此所有限制的总和可以高于节点容量。这称为过度使用,这很常见。实际上,如果所有容器使用的内存都比请求的多,它可能会耗尽节点中的内存。这通常会导致一些 pod 被杀死以释放一些内存。

监控 Kubernetes OOM

在 Prometheus 中使用 node exporter 时,有一个指标称为node_vmstat_oom_kill. 跟踪 OOM 终止发生的时间很重要,但您可能希望在此类事件发生之前提前了解此类事件。

相反,您可以检查进程与 Kubernetes 限制的接近程度:

(sum by (namespace,pod,container)
(rate(container_cpu_usage_seconds_total{container!=""}[5m])) / sum by
(namespace,pod,container)
(kube_pod_container_resource_limits{resource="cpu"})) > 0.8

Kubernetes CPU 节流

CPU 节流 是一种行为,当进程即将达到某些资源限制时,进程会变慢。

与内存情况类似,这些限制可能是:

  • 在容器上设置的 Kubernetes Limit。
  • 在命名空间上设置的 Kubernetes ResourceQuota。
  • 节点的实际CPU大小。

想想下面的类比。我们有一条有一些交通的高速公路,其中:

  • CPU 就是路。
  • 车辆代表进程,每个车辆都有不同的大小。
  • 多条通道代表有多个核心。
  • 一个 request 将是一条专用道路,如自行车道。这里的节流表现为交通堵塞:最终,所有进程都会运行,但一切都会变慢。

K8S的OOM和cpu节流_OOM_02

Kubernetes 中的 CPU 进程

CPU 在 Kubernetes 中使用 shares 处理。每个 CPU 核心被分成 1024 份,然后使用 Linux 内核的 cgroups(控制组)功能在所有运行的进程之间分配。

K8S的OOM和cpu节流_cpu节流_03

如果 CPU 可以处理所有当前进程,则不需要任何操作。如果进程使用超过 100% 的 CPU,那么份额就会到位。与任何 Linux Kernel 一样,Kubernetes 使用 CFS(Completely Fair Scheduler)机制,因此拥有更多份额的进程将获得更多的 CPU 时间。

与内存不同,Kubernetes 不会因为节流而杀死 Pod。

K8S的OOM和cpu节流_kubernetes_04

可以在 /sys/fs/cgroup/cpu/cpu.stat 中查看 CPU 统计信息

CPU 过度使用

正如我们在 限制和请求一文 中看到的,当我们想要限制进程的资源消耗时,设置限制或请求很重要。然而,请注意不要将请求总数设置为大于实际 CPU 大小,因为这意味着每个容器都应该有一定数量的 CPU。

监控 Kubernetes CPU 节流

您可以检查进程与 Kubernetes 限制的接近程度:

(sum by (namespace,pod,container)(rate(container_cpu_usage_seconds_total
{container!=""}[5m])) / sum by (namespace,pod,container)
(kube_pod_container_resource_limits{resource="cpu"})) > 0.8

如果我们想跟踪集群中发生的节流量,cadvisor 提供container_cpu_cfs_throttled_periods_total和container_cpu_cfs_periods_total. 有了这两个,你就可以轻松计算出所有 CPU 周期的 throttling 百分比。

最佳实践

注意 limits 和 requests

限制是在节点中设置最大资源上限的一种方法,但需要谨慎对待这些限制,因为您可能最终会遇到一个进程被限制或终止的情况。

做好被驱逐的准备

通过设置非常低的请求,您可能认为这会为您的进程授予最少的 CPU 或内存。但是kubelet会首先驱逐那些使用率高于请求的 Pod,因此您将它们标记为第一个被杀死!

如果您需要保护特定 Pod 免遭抢占(当kube-scheduler需要分配新 Pod 时),请为最重要的进程分配优先级。

节流是无声的敌人

通过设置不切实际的限制或过度使用,您可能没有意识到您的进程正在受到限制,并且性能受到影响。主动监控您的 CPU 使用率并了解您在容器和命名空间中的实际限制。


上文学习自https://sysdig.com/blog/troubleshoot-kubernetes-oom/

标签:container,节流,Kubernetes,OOM,CPU,内存,进程,K8S,cpu
From: https://blog.51cto.com/jowin/6499303

相关文章

  • Adobe Lightroom Classic 2022 V11【图片后期处理软件】直装版安装教程
    Lightroom2022是一款功能强大、非常专业的图片编辑软件,由著名公司Adobe制作,可以为用户编辑照片。这个软件和我们熟悉的ps有很大的不同。它主要帮助用户简单方便地管理电脑上的照片,甚至完成照片的一些修改,比如去除不需要的物体,校正照片,增强照片的颜色。在生活中,很多人经常处理照片,但......
  • K8S中pod状态详解
    Pod有以下几个状态:Pending等待中Running运行中Succeeded正常终止Failed异常停止Unkonwn未知状态Pod状态详解PendingPod已经被创建,但还没有完成调度,可能处在:写数据到etcd,调度,pull镜像,启动容器这四个阶段中的任何一个阶段,pending伴随的事件通常会有:ADDED,Modified这两个事件的......
  • k8s实战案例之基于StatefulSet控制器运行MySQL一主多从
    1、前言Pod调度运⾏时,如果应⽤不需要任何稳定的标示、有序的部署、删除和扩展,则应该使⽤⼀组⽆状态副本的控制器来部署应⽤,例如Deployment或ReplicaSet更适合⽆状态服务需求,⽽StatefulSet适合管理所有有状态的服务,⽐如MySQL、MongoDB集群等。2、StatefulSet控制器运行MySQL一......
  • 初识k8s,安装k8s,kubesphere一键安装
     1.轻量级的容器系统是是现在的主流,但一个成熟的项目可能需要成百上千的应用(容器)来支撑,如此一来,大量分布在不同服务器上的容器就靠人工就非常难以管理,而Kubernetes的出现就是为了解决这个问题,它将大量的容器编排管理起来。 2.容器编排系统角逐历史mesosapache分布式资......
  • 【Docker/K8s】启动容器镜像,使其空转不退出
    场景描述有些时候,我们仅仅想启动一个Docker容器,而不需要它执行预置的命令。比如一个场景是我想检查集群的网络状况,那我需要启动一个容器,然后进入到容器里执行命令来调试。大部分的镜像都带有默认的启动cmd,导致直接dockerrun启动的话,很快就会因为预置命令执行失败导致退出。解决......
  • cgroup cpu 子系统参数深入理解
    shares这个容易理解,无论cpuset.cpus中有多少个cpu,它都是按照比例用。cpu.cfs_quota_us这个就有点坑了,用起来会有些费劲。8核机器,aptasks里有20个线程并行执行,设置cpu.cfs_quota_us为30000(period为100000),预期是cpu能用到30%*8=240%,而实际上只用到了30%。也就是......
  • k8s集群根据进程PID获取Pod名称
    简单说明在实际的应用场景中,我们如果看到某个进程资源或服务异常,需要根据这个进程排查到底是哪个服务的Pod,这里我们介绍一种根据PID快速寻找Pod名称的方法。实际操作查看进程PID这里我们以GPU任务为例说明,可以看到占用显卡的任务PID为8241[root@centos~]#nvidia-smiThuJu......
  • k8s pod 状态异常状态分析和处理方法
    pod状态一般分为以下几种:1、terminating2、pending3、containercreating或waiting4、CrashloopBackoff5、imagePullBackoff6、imageinspectError7、unknown8、Error1、一般处于imageinspectError通常指的是镜像文件损坏了,可以尝试删除损坏的镜像重新拉取。2、Error状......
  • 记一次加锁导致ECS服务器CPU飙高的处理
    导航火线告警,CPU飚了版本回退,迅速救火猜测:分布式锁是罪魁祸首代码重构,星夜上线防患未然,功能可开关高度戒备,应对早高峰实时调整方案,稳了结语参考本文首发于智客工坊-《记一次加锁导致ECS服务器CPU飙高分析》,感谢您的阅读,预计阅读时长3min。每一次版本的上线都应该......
  • 一文实战K8S中的服务发现和负载均衡
    开篇在Kubernetes集群中,服务发现和负载均衡是非常重要的概念和功能。它们可以帮助我们管理应用程序的访问和流量分发,确保应用程序的高可用性和性能。在本文中,我们将通过一个实战案例,探索Kubernetes中的服务发现和负载均衡机制,并演示如何在集群中部署和管理具有负载均衡能力的应用......