Kubernetes Kubelet 的 Cgroups 资源限制机制分析

前言

容器技术的两大技术基石,想必大家都有所了解,即 namespace 和 cgroups。但你知道 cgroups 是如何在 kubernetes 中发挥作用的吗?kubelet 都设置了哪些 cgroups 参数来实现对容器的资源限制的呢?本文就来扒一扒 Kubernetes kubelet 的 cgroups 资源限制机制。

层级化的资源限制方式

kubelet 基于 cgroups 的树形结构,采用层级式的方式管理容器的资源限制,如下图所示:
在这里插入图片描述

Node Level Cgroups

Node 层级的资源限制主要是为了避免容器过度占用系统资源,导致节点资源耗尽,影响系统级(如 systemd)和 Kubernetes 依赖组件(如 kubelet 和 containerd)的正常运行,可以通过预留系统资源的方式,确保容器使用的资源总量在控制的范围内。

system-reserved
  • 默认行为:System Reserved Cgroups 默认不配置,需要通过参数显式启用
  • 执行时机:每次 kubelet 启动时执行检查和设置

下表描述了 system-reserved 可能设置的 cgroups 限制:

在这里插入图片描述
上述表格中的资源限制数值均由参数 --system-reserved 控制,不再赘述。

kube-reserved
  • 默认行为:Kube Reserved Cgroups 默认不配置,需要通过参数显式启用
  • 执行时机:每次 kubelet 启动时执行检查和设置

下表描述了 kube-reserved 可能设置的 cgroups 限制:

在这里插入图片描述
上述表格中的资源限制数值均由参数 --kube-reserved 控制,不再赘述。

kubepods
  • 默认行为:kubepods 默认启用配置,且无论如何都会刷新
    这是因为作为 Pods 顶级 cgroups 限制,操作系统默认设置的 cpu.shares=1024cpu.weight=100 过小,很可能出现 CPU 限流,使容器性能变差,因此需要显式刷新。
  • 执行时机:每次 kubelet 启动时执行检查和设置(部分参数同时会被 QoS Manager 周期性和触发式刷新)

在这里插入图片描述

上述表格中的资源限制数值计算规则如下:

--enforce-node-allocatable 包含 pods--cgroups-per-qos=true 时(默认行为):

  • Memory Limit = [Node Capacity] - [Kube Reserved] - [System Reserved]
  • CPU Shares = [Node Capacity] - [Kube Reserved] - [System Reserved]
  • Pid Limit = [Node Capacity] - [Kube Reserved] - [System Reserved]
  • HugePages Limit = [Node Capacity] - [Kube Reserved] - [System Reserved]

否则

  • Memory Limit = [Node Capacity]
  • CPU Shares = [Node Capacity]
  • Pid Limit = [Node Capacity]
  • HugePages Limit = [Node Capacity]

当启用 cgroups v2 而且开启了 MemoryQoS 门控(默认不启用) 时,设置

  • Memory Min = [Guaranteed Memory Request] + [Burstable Memory Request],这个参数由 QOS Manager 独立协程执行,不仅每分钟刷新一次,而且在同步 Pod 变化时也会被显式调用执行。

HugePages Limit 启动时被设置一次,随后也会被 QOS Manager 独立协程执行刷新,不仅每分钟刷新一次,而且在同步 Pod 变化时也会被显式刷新。

QOS Level Cgroups

QOS 层级的资源限制主要是为了区分三类 Pod 的服务等级,确保 guaranteed Pod 的资源不被 burstable 和 besteffort 类型的 Pod 争抢,确保 burstable Pod 的 Request 最低资源占用不被 besteffort 类型的 Pod 争抢,从而确保服务质量遵循 guaranteed > burstable > besteffort 的规则。

guaranteed

guaranteed 类型的 Pod 由于 Request 严格等于 Limit,因此该类型的 Pod 不需要再为其创建一层父级 cgroups 进行资源限制,故这一层在 Kubernetes 系统中实际上是不存在的。或者,你可以认为 kubepods 就等同于 guaranteed cgroups。guaranteed 类型的 Pod 直接挂载在 kubepods cgroups 目录下。

burstable
  • 默认行为:默认启用,可以通过设置 --cgroups-per-qos=false 禁用
  • 执行时机:QOS Manager 独立协程执行刷新,不仅每分钟刷新一次,而且在同步 Pod 变化时也会被显式刷新

在这里插入图片描述

  • CPU Shares = [burstable 类型 Pods 的 CPU Request 总和]
  • HugePages Limit = 最大值(1 << 62 = 4611686018427387904),即不限制

Memory 的设置依赖几个开关,其中:

  • 当启用 cgroups v2 而且开启了 MemoryQoS 门控(默认不启用) 时,设置 Memory Min = [Burstable Memory Request],以保留内存资源
  • 当启用了 QOSReserved 门控(默认不启用) 时,设置 [Memory Limit] = [Node Available] - [Guaranteed Memory Request]*[百分比]

这里,[Node Available] 指的是节点资源总量减去系统保留资源后可供 Pod 使用的资源总量,[百分比] 来控制 burstable 类型的 Pod 是否可以争抢 Guaranteed 类型 Pod 的 Request 占用内存,100% 表示完全禁止争抢,0% 则表示完全放开,自由竞争。

默认情况下,这些开关处于关闭状态,内存是处于自由竞争的状态。

besteffort
  • 默认行为:默认启用,可以通过设置 --cgroups-per-qos=false 禁用
  • 执行时机:QOS Manager 独立协程执行刷新,不仅每分钟刷新一次,而且在同步 Pod 变化时也会被显式刷新

在这里插入图片描述

  • CPU Shares = 最小值(cgroups v1 value 为 2;cgroups v2 value 为 1)
  • HugePages Limit = 最大值(1 << 62 = 4611686018427387904),即不限制

Memory 的设置依赖开关设置:

  • 当启用了 QOSReserved 门控(默认不启用) 时,设置 [Memory Limit] = [Burstable Memory Limit] - [Burstable Memory Request]*[百分比]
    其中 [Burstable Memory Limit] = [Node Available] - [Guaranteed Memory Request]*[百分比]
    即 besteffort 可用内存是节点 Pods 可用内存减去为 Guaranteed 和 Burstable Request 保留内存后,剩余的内存资源

默认情况下,QOSReserved 处于关闭状态,内存处于自由竞争的状态。

注意 besteffort 类型的 Pod 顶层限制 cpu.shares 权重为最小值 2,更容易出现 CPU 限流

Pod Level Cgroups

Pod 层级的资源限制主要是为了限制 Pod 内包含的所有 Container 资源占用不超过设置的资源上限。提供 Pod 层资源限制的主要优点是能够屏蔽底层容器运行时,即便底层 Container Runtime 没能为 Container 正确设置 cgroups 资源限制,kubelet 也能在 Container 的父级 cgroups 把资源使用限制住,防止单个 Pod 异常影响整个节点的稳定性。

Pod level cgroups 是 kubelet 能够直接设置的最底一层 cgroups。
对于 Container 的 cgroups,kubelet 仅仅只是准备 cgroups 配置参数,通过 CRI 传递给 Container Runtime 真正去执行配置。

  • 默认行为:默认启用,可以通过设置 --cgroups-per-qos=false 禁用
  • 执行时机:kubelet 收到 Pod 事件,SyncPod 时设置
    在这里插入图片描述

由于 Pod 的 QoS 类型不同,不同的资源限制有可能被设置,也可能未被设置,这些参数主要是通过 Pod 容器的 Request 和 Limit 配置决定是否配置对应的 cgroups 参数的。

  • [Memory Limit] = [ Pod 容器的 Memory Limit 总和 ],当所有容器都配置 Limit 时生效
  • [Memory Min] = [ Pod 容器的 Memory Request 总和 ],至少有一个容器配置了 Memory Request,同时 MemoryQoS 被开启
  • [CPU Shares] = [ Pod 容器的 CPU Request 总和 ],如果计算结果低于最小值,则配置为最低 CPU Shares(等同于 besteffort 类型 Pod 的 CPU 权重)
  • [CPU Limit] = [ Pod 容器的 CPU Limit 总和 ],当所有容器都配置 Limit 时生效,同时 --cpu-cfs-quota 开启,默认开启
  • [Pid Limit] = [kubelet 启动参数设置的限制值],当 --pod-max-pids > 0 时生效,默认 -1 不限制
  • [HugePages Limit] = [ Pod 容器的 HugePages Request 总和 ],至少有一个容器配置了 HugePages Request,HugePages 资源的 Request 必须等于 Limit

Container Level Cgroups

Container 层级的资源限制由 Container Runtime(如 Containerd + Runc)实施,kubelet 通过 CRI 接口将需要设置的 cgroups 资源限制传递给底层 Runtime 去执行,实现对每个 Container 的资源限制。

  • 默认行为:默认启用
  • 执行时机:kubelet 收到 Pod 事件,SyncPod 时设置

在这里插入图片描述

  • [Memory Limit] = [ Container 容器的 Memory Limit ]
  • [Memory Min] = [ Container 容器的 Memory Request ],依赖 MemoryQoS 门控
  • memory.high=floor[(requests.memory + memory throttling factor * (limits.memory or node allocatable memory - requests.memory))/pageSize] * pageSize,其中 memory throttling factor 默认值为 0.9,即内存达到 Limit 的 90% 时,开始限流内存使用,依赖 MemoryQoS 门控
  • memory.swap.max=containerMemoryRequest/nodeTotalMemory*totalPodsSwapAvailable,仅适用于 cgroups v2,依赖 NodeSwap 门控和 Swap Behavior 配置,默认禁用 (cgroups v1 不支持 swap 限制,只禁用 swap)
  • cpuset.mems=[ 内存分配绑定的 NUMA 节点 ],依赖 Memory Manager 工作且设置为 Static Policy 模式,仅对 Guaranteed 类型 Pod 生效,默认不启用
  • [CPU Shares] = [ Container 容器的 CPU Request ],如果计算结果低于最小值,则配置为最低 CPU Shares(等同于 besteffort 类型 Pod 的 CPU 权重)
  • [CPU Limit] = [ Container 容器的 CPU Limit ]
  • cpuset.cpus=[ CPU 分配绑定的 NUMA 节点 ],依赖 CPU Manager 工作且设置为 Static Policy 模式,仅对 Guaranteed 类型 Pod 生效,默认不启用
  • [HugePages Limit] = [ Container 容器的 HugePages Request ],HugePages 资源的 Request 必须等于 Limit

CPU 转换公式

容器的 CPU 资源配置由数字表示:

整数 1 代表 1 core,1 core = 1000m

Linux 系统,默认 1 core 的 cpu.shares 对应值为 1024,由此可以推演出如下公式:

1 core = 1000m => cpu.shares=1024
cpu.shares = [cpu request 的 小 m 表示法]*1024/1000

例如,当 cpu request 为 100m 时,对应的 cpu.shares=100*1024/1000=102(取整数)

对于 cpu limit:

cpu.cfs_quota_us = [cpu limit 的 小 m 表示法]*cpu.cfs_period_us/1000,其中 cpu.cfs_period_us 为固定值,默认为 100ms,即 100000us

从 cgroups v1 的 cpu.shares 转换为 cgroups v2 的 cpu.weight 公式为:

cpu.weight = 1 + ((cpu.shares-2)*9999)/262142
该公式由 cgroups v1 中 cpu.shares 的有效范围 [2-262144] 到 cgroups v2 中 cpu.weight 的有效范围 [1-10000] 的数学映射转换关系推导而来

引用参考

  • http://arthurchiao.art/blog/k8s-cgroup-zh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STC8H8K64U I2C主机模式相关寄存器

STC8H8K64U I2C主机模式相关寄存器 STC8H8K64U-TSSOP20 I2CCFG I2C配置寄存器 I2CMSCR I2C主机控制寄存器 I2CMSST I2C主机状态寄存器 I2CMSAUX I2C主机辅助控制寄存器 I2CTXD I2C数据发送寄存器 I2CRXD I2C数据接收寄存器 I2CCFG I2C配置寄存器 B7ENI2C ENI2C&#xff1a…

基于Spring Boot的家具销售电商平台设计与实现

基于Spring Boot的家具销售电商平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页…

《智能前沿:应对ChatGPT算力挑战》

在全球人工智能热潮中&#xff0c;以 ChatGPT 为代表的 AIGC 技术引发了广泛关注。人工智能和机器学习等技术对数据规模及处理速度等提出了更高要求。在数据成为主要生产要素的当下和未来&#xff0c;如何跟上时代的发展步伐&#xff0c;构建适应 AI 需求的数据中心&#xff0c…

基于Google Gemini 探索大语言模型在医学领域应用评估和前景

概述 近年来&#xff0c;大规模语言模型&#xff08;LLM&#xff09;在理解和生成人类语言方面取得了显著的飞跃&#xff0c;这些进步不仅推动了语言学和计算机编程的发展&#xff0c;还为多个领域带来了创新的突破。特别是模型如GPT-3和PaLM&#xff0c;它们通过吸收海量文本…

BUUCTF---misc---[SWPU2019]我有一只马里奥

1、下载附件是一个.exe文件 2、运行之后可以看到桌面生成了1.txt文件&#xff0c;文件里面有如下内容 3、经过信息搜索&#xff1a;NTFS&#xff08;New Technology File System&#xff09;是一种由Microsoft开发的专有日志文件系统。根据它的提示&#xff0c;应该是把flag.tx…

B2弹幕插件优化版WordPress插件

源码下载&#xff1a;B2弹幕插件.zip 这是b2独有的站点信息弹幕插件&#xff0c;专门用来在首页显示站点动态的一款个性化 WordPress插件。喜欢的可以下载回去进行二次开发&#xff0c;还是蛮不错的 基于wordpress 7B2主题开发的一款弹幕插件/气泡插件 功能一览 插件安装&a…

三、CPU基础-缓存

计算机中缓存一般分为两个部分 1.内存 2.CPU Cache 一、CPU Cache分级 CPU Cache 通常分为大小不等的三级缓存&#xff0c;分别是 L1 Cache、L2 Cache 和 L3 Cache。 L1 Cache 和 L2 Cache 都是每个 CPU 核心独有的&#xff08;通常会分为「数据缓存」和「指令缓存」&#…

介绍Phi-3:微软重新定义小型语言模型(SLM)的可能性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

云备份day05

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C云备份项目 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容实现Json实用类的设计&#xff0c;以及服务端的设计和实…

【电控笔记5.6】Butterworth滤波器

Butterworth滤波器 需求&#xff1a;在增益交越频率拥有最小的相位滞后 波器经常被使用原因是 Butterworth 滤波器对于给定阶数&#xff0c;拥有最倾斜的衰减率而在伯德图又不会产生凸峰&#xff0c;同时在低频段的相位滞后小&#xff0c;因此本节将为各位介绍 Butterworth 低…

CTFshow-PWN-栈溢出(pwn43)

32位的 system(); 但是好像没"/bin/sh" 上面的办法不行了&#xff0c;想想办法 检查&#xff1a;32 位程序 ida 分析&#xff1a; 跟进 ctfshow 函数 定义了一个长度为 104 的字符数组 s&#xff0c;gets() 函数被用来从标准输入&#xff08;键盘&#xff09;中读取…

OpenCompass 大模型评测实战——笔记

OpenCompass 大模型评测实战——笔记 一、评测1.1、为什么要做评测1.2、如何通过能力评测促进模型发展1.2.1、面向未来拓展能力维度1.2.2、扎根通用能力1.2.3、高质量1.2.4、性能评测 1.3、评测的挑战1.3.1、全面性1.3.2、评测成本1.3.3、数据污染1.3.4、鲁棒性 二、OpenCompas…

【漏洞复现】云时空社会化商业ERP系统LoginName SQL注入漏洞

漏洞描述&#xff1a; 云时空社会化商业ERP系统loginName存在SQL注入漏洞&#xff0c;攻击者可以通过此漏洞获取数据库敏感信息。 搜索语法: Fofa-Query: app"云时空社会化商业ERP系统" 漏洞详情&#xff1a; 1.云时空社会化商业ERP系统。 2.漏洞POC&#xff1a…

迪拜Token2049展会圆满落幕,MVP成唯一MEMECOIN项目,闪耀全场!

近日&#xff0c;据多家媒体报道&#xff0c;于全球财富聚集地迪拜举行的全球性大型区块链会议TOKEN2049圆满落幕。来自全球的5000多家公司和100多个国家10000名参与者共同参会&#xff0c;讨论未来30年至50年关于区块链行业的宏大未来。 新晋MEMECOIN项目MAGA VP&#xff08;…

【NLP】大语言模型基础之GPT

大语言模型基础之GPT GPT简介1. 无监督预训练2. 有监督下游任务微调 GPT-4体系结构1. GPT-4的模型结构2. GPT-4并行策略3. GPT-4中的专家并行GPT-4的特点 参考连接 以ELMo为代表的动态词向量模型开启了语言模型预训练的大门&#xff0c;此后&#xff0c;出现了以GPT和BERT为代表…

Spring - 3 ( 12000 字 Spring 入门级教程 )

一&#xff1a;Spring Web MVC入门 1.1 响应 在我们前⾯的代码例子中&#xff0c;都已经设置了响应数据, Http 响应结果可以是数据, 也可以是静态页面&#xff0c;也可以针对响应设置状态码, Header 信息等. 1.2 返回静态页面 创建前端页面 index.html(注意路径) html代码 …

SpringMVC基础篇(二)

文章目录 1.Postman1.基本介绍Postman是什么&#xff1f; 2.Postman快速入门1.Postman下载点击安装自动安装在系统盘 2.基本操作1.修改字体大小2.ctrl “” 放大页面3.进入创建请求界面 2.需求分析3.具体操作4.保存请求到文件夹中1.点击保存2.创建新的文件夹3.保存成功 3.使用…

嵌入式4-24

作业&#xff1a; 整理思维导图 定义一个矩形类Rec&#xff0c;包含私有属性length&#xff0c;width&#xff0c;有以下成员函数&#xff1a; void set_length(int l); //设置长度 void set_width(int w); //设置宽度 int get_length(); //获取长度 int get_width(); //获取宽…

【上海大学计算机组成原理实验报告】四、指令系统实验

一、实验目的 了解指令结构、PC寄存器的功能和指令系统的基本工作原理。 学习设计指令的方法。 二、实验原理 根据实验指导书的相关内容&#xff0c;对于部分使用频率很高&#xff0c;且只用几条微指令即可完成的简单操作&#xff0c;可以把这部分简单操作的微指令序列固定下…