0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一图解析K8S OOM和CPU节流

马哥Linux运维 来源:sysdig 2023-02-15 17:17 次阅读

介绍

使用 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,10Oct20191113+0200
LastState:Terminated
Reason:OOMKilled
ExitCode:137
Started:Thu,10Oct20191103+0200
Finished:Thu,10Oct20191111+0200

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

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

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

在容器上设置的 Kubernetes Limit。

在命名空间上设置的 Kubernetes ResourceQuota。

节点的实际内存大小。

de371d70-aa86-11ed-bfe3-dac502259ad0.png

内存过量使用

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

监控 Kubernetes OOM

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

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

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

Kubernetes CPU 节流

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

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

在容器上设置的 Kubernetes Limit。

在命名空间上设置的 Kubernetes ResourceQuota。

节点的实际CPU大小。

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

CPU 就是路。

车辆代表进程,每个车辆都有不同的大小。

多条通道代表有多个核心。

一个 request 将是一条专用道路,如自行车道。这里的节流表现为交通堵塞:最终,所有进程都会运行,但一切都会变慢。

de476a90-aa86-11ed-bfe3-dac502259ad0.gif

Kubernetes 中的 CPU 进程

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

deffc478-aa86-11ed-bfe3-dac502259ad0.png

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

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

df11bdea-aa86-11ed-bfe3-dac502259ad0.png

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

CPU 过度使用

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

监控 Kubernetes CPU 节流

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

(sumby(namespace,pod,container)(rate(container_cpu_usage_seconds_total
{container!=""}[5m]))/sumby(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 使用率并了解您在容器和命名空间中的实际限制。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10803

    浏览量

    210780
  • Unix系统
    +关注

    关注

    0

    文章

    15

    浏览量

    9625
  • LINUX内核
    +关注

    关注

    1

    文章

    316

    浏览量

    21605
  • CFS
    CFS
    +关注

    关注

    0

    文章

    7

    浏览量

    9044

原文标题:图解 K8S OOM 和 CPU 节流

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何利用K8S全面拥抱微服务架构?

    K8S是第个将“切以服务为中心,切围绕服务运转”作为指导思想的创新型产品,它的功能和架构设计自始至终都遵循了这指导思想,构建在
    的头像 发表于 10-08 15:59 2.7w次阅读

    OpenStack与K8s结合的两种方案的详细介绍和比较

    OpenStack与K8S结合主要有两种方案。K8S部署在OpenStack平台之上,二是K8S和OpenStack组件集成。
    的头像 发表于 10-14 09:38 2.7w次阅读

    如何使用kubernetes client-go实践个简单的与K8s交互过程

    【导读】Kubernetes项目使用Go语言编写,对Go api原生支持非常便捷。 本篇文章介绍了如何使用kubernetes client-go实践个简单的与K8s交互过程
    的头像 发表于 02-02 11:16 6709次阅读
    如何使用kubernetes client-go实践<b class='flag-5'>一</b>个简单的与<b class='flag-5'>K8s</b>交互过程

    关于K8s最详细的解析

    个目标:容器操作;两地三中心;四层服务发现;五种Pod共享资源;六个CNI常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿,K8s有亿:亿级日服务人次。
    的头像 发表于 04-08 13:55 7204次阅读
    关于<b class='flag-5'>K8s</b>最详细的<b class='flag-5'>解析</b>

    Docker不香吗为什么还要用K8s

    Docker 虽好用,但面对强大的集群,成千上万的容器,突然感觉不香了。 这时候就需要我们的主角 Kubernetes 上场了,先来了解K8s 的基本概念,后面再介绍实践,由浅入深步步为营
    的头像 发表于 06-02 11:56 3392次阅读

    简单说明k8s和Docker之间的关系

    这篇文章主要介绍了k8s和Docker关系简单说明,本文利用图文讲解的很透彻,有需要的同学可以研究下 最近项目用到kubernetes(以下简称k8sks之间有
    的头像 发表于 06-24 15:48 3322次阅读

    K8S集群服务访问失败怎么办 K8S故障处理集锦

    问题1:K8S集群服务访问失败?     原因分析:证书不能被识别,其原因为:自定义证书,过期等。 解决方法:更新证书即可。 问题2:K8S集群服务访问失败? curl: (7) Failed
    的头像 发表于 09-01 11:11 1.6w次阅读
    <b class='flag-5'>K8S</b>集群服务访问失败怎么办 <b class='flag-5'>K8S</b>故障处理集锦

    K8S(kubernetes)学习指南

    K8S(kubernetes)学习指南
    发表于 06-29 14:14 0次下载

    mysql部署在k8s上的实现方案

    的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之。这里主要讲 mysql 部署在 k8s 上,mysql 部署在 k8s 上的优势主要有以下几点。
    的头像 发表于 09-26 10:39 2439次阅读

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    k8s是什么意思? kubernetes简称K8s,是个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful
    发表于 07-19 13:14 1084次阅读

    什么是K3sK8sK3sK8s有什么区别?

    Kubernetes,通常缩写为 K8s,是领先的容器编排工具。该开源项目最初由 Google 开发,帮助塑造了现代编排的定义。该系统包括了部署和运行容器化系统所需的切。
    的头像 发表于 08-03 10:53 7138次阅读

    k8s生态链包含哪些技术

    1. Apache APISIX Ingress 定义   在 K8s 生态中,Ingress 作为表示 K8s 流量入口的种资源,想要让其生效,就需要有个 Ingress Con
    的头像 发表于 08-07 10:56 1145次阅读
    <b class='flag-5'>k8s</b>生态链包含哪些技术

    跑大模型AI的K8s与普通K8s的区别分析

    Kubernetes是个在大量节点上管理容器的系统,其主要功能总结起来,就是在想要启动容器的时候,负责“找个「空闲」节点,启动容器”。但是它默认考虑的启动因素(资源类)主要就是“CPU+内存”。就是容器指定“我要多少
    发表于 09-03 12:07 849次阅读

    K8S落地实践经验分享

    k8s 即 Kubernetes,是个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理。
    的头像 发表于 01-02 11:45 1001次阅读
    <b class='flag-5'>K8S</b>落地实践经验分享

    k8s云原生开发要求

    Kubernetes(K8s)云原生开发对硬件有定要求。CPU方面,建议至少配备2个逻辑核心,高性能CPU更佳。内存至少4GB,但8GB或
    的头像 发表于 10-24 10:03 138次阅读
    <b class='flag-5'>k8s</b>云原生开发要求