当前位置: 首页 > news >正文

浅析Resource Quota中limits计算机制

前言

        在生产环境中,通常需要通过配置资源配额(Resource Quota)来限制一个命名空间(namespace)能使用的资源量。在资源紧张的情况下,常常需要调整工作负载(workload)的请求值(requests)和限制值(limits),以确保工作负载能够顺利部署。本文将从Kubernetes源码的角度,简要分析Kubernetes如何计算Pod中的限制值(limits)对资源配额(Resource Quota)限制的影响。

源代码地址

kubernetes/pkg/api/v1/resource/helpers.go at master · kubernetes/kubernetes · GitHub

源码解析

container分类

这里以Pod limits为例,计算给定Pod的资源限制(limits),包括普通容器和初始化容器的资源限制。

这里实际上把容器分成了3类

  • 普通容器
  • 初始化容器
    • 可重启初始化容器(RestartPolicy=Always)
    • 不可重启初始化容器

但实际上目前initcontainer RestartPolicy只能设置为Always,因此在实际环境中,把容器分为了2类

源码

// PodLimits 计算根据提供的PodResourcesOptions选项计算Pod的资源限制(limits)。
// 如果PodResourcesOptions为nil,则返回的限制包含任何非零限制的Pod开销。
// 这个计算是API的一部分,必须作为API更改来审查。
func PodLimits(pod *v1.Pod, opts PodResourcesOptions) v1.ResourceList {// 尝试重用传递的maps,如果没有传递则分配新的limits := reuseOrClearResourceList(opts.Reuse)// 遍历Pod中的每个容器for _, container := range pod.Spec.Containers {// 如果提供了ContainerFn函数,则调用它处理容器资源限制if opts.ContainerFn != nil {opts.ContainerFn(container.Resources.Limits, podutil.Containers)}// 将容器的资源限制添加到总的limits中addResourceList(limits, container.Resources.Limits)}restartableInitContainerLimits := v1.ResourceList{}initContainerLimits := v1.ResourceList{}// 初始化容器定义了任何资源的最小值//// 假设 `InitContainerUse(i)` 是第i个初始化容器初始化时的资源需求,// 则 `InitContainerUse(i) = sum(重启初始化容器的资源,索引 < i) + 第i个初始化容器的资源`。//// 详细信息见 https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/753-sidecar-containers#exposing-pod-resource-requirementsfor _, container := range pod.Spec.InitContainers {containerLimits := container.Resources.Limits// 检查初始化容器是否标记为可重启的初始化容器,实际上目前initcontainer必须设置为可重启if container.RestartPolicy != nil && *container.RestartPolicy == v1.ContainerRestartPolicyAlways {// 将容器限制添加到总的limits中addResourceList(limits, containerLimits)// 跟踪累积的重启初始化容器资源addResourceList(restartableInitContainerLimits, containerLimits)containerLimits = restartableInitContainerLimits} else {// 创建一个临时的资源列表,包含当前初始化容器和累积的重启初始化容器资源tmp := v1.ResourceList{}addResourceList(tmp, containerLimits)addResourceList(tmp, restartableInitContainerLimits)containerLimits = tmp}// 如果提供了ContainerFn函数,则调用它处理初始化容器资源限制if opts.ContainerFn != nil {opts.ContainerFn(containerLimits, podutil.InitContainers)}// 取initContainerLimits和containerLimits的最大值maxResourceList(initContainerLimits, containerLimits)}// 取limits和initContainerLimits的最大值maxResourceList(limits, initContainerLimits)// 如果不排除开销,并且Pod的Spec中有开销,则添加开销到非零限制中if !opts.ExcludeOverhead && pod.Spec.Overhead != nil {for name, quantity := range pod.Spec.Overhead {if value, ok := limits[name]; ok && !value.IsZero() {value.Add(quantity)limits[name] = value}}}// 返回计算的资源限制return limits
}

重要概念

在上述代码中,有以下几点需要理解

  1. 需要取一个满足任何情况的最大limits计算
  2. initcontainer如果有3个initcontainer RestartPolicy都设置为Always,1个initcontainer为不可重启,如果这3个中有2个initcontainer重启了,则有可能会与非可重启的initcontainer同时运行,在这种情况下使用的mem=1号可重启initcontainer mem + 2号可重启initcontainer mem + 3号不可重启initcontainer mem
  3. 如果有普通容器和initcontainer,则先运行完initcontainer再运行普通容器

Pod limits计算规则

理解了以上几点,那么Pod limits的计算规则就很容易得出了:

  1. 普通容器资源需求:计算Pod中所有普通容器的资源限制总和。

  2. 初始化容器资源需求

    • 可重启初始化容器(RestartPolicy: Always):累加所有可重启初始化容器的资源需求。
    • 不可重启初始化容器:每个不可重启初始化容器的资源需求需要加上之前所有可重启初始化容器的资源需求,然后取其中最大值。
  3. 计算公式

    • 初始化容器资源需求 = max(初始化容器1 + 初始化容器2 + ... + 初始化容器N)
    • Pod资源总需求 = max(普通容器资源需求, 初始化容器资源需求)

简化公式

典型情况

情况1

  • 主容器资源需求:CPU:50m,内存:100Mi
  • 初始化容器
    • 初始化容器1(可重启):CPU:50m,内存:110Mi
    • 初始化容器2(可重启):CPU:60m,内存:120Mi
    • 初始化容器3(不可重启):CPU:100m,内存:200Mi

资源配额计算

  • resourcequota limit = max(主容器需求, 初始化容器总需求)
    • 初始化容器总需求 = 初1 + 初2 + 初3 = 110 + 120 + 200 = 430Mi
    • 计算结果:430Mi > 100Mi(主容器需求)

最终结果:resourcequota limit = 430Mi

情况2

  • 主容器资源需求:CPU:50m,内存:100Mi
  • 初始化容器
    • 初始化容器1(可重启):CPU:50m,内存:110Mi
    • 初始化容器2(可重启):CPU:50m,内存:120Mi
    • 初始化容器3(不可重启):CPU:60m,内存:200Mi
    • 初始化容器4(不可重启):CPU:100m,内存:220Mi

资源配额计算

  • resourcequota limit = max(主容器需求, 初始化容器总需求)
    • 初始化容器总需求 = 初1 + 初2 + 初4 = 110 + 120 + 220 = 450Mi
    • 计算结果:450Mi > 100Mi(主容器需求)

最终结果:resourcequota limit = 450Mi

情况3

  • 主容器资源需求:CPU:50m,内存:500Mi
  • 初始化容器
    • 初始化容器1(可重启):CPU:50m,内存:110Mi
    • 初始化容器2(可重启):CPU:50m,内存:120Mi
    • 初始化容器3(不可重启):CPU:60m,内存:200Mi
    • 初始化容器4(不可重启):CPU:100m,内存:220Mi

资源配额计算

  • resourcequota limit = max(主容器需求, 初始化容器总需求)
    • 初始化容器总需求 = 初1 + 初2 + 初4 = 110 + 120 + 220 = 450Mi
    • 计算结果:500Mi(主容器需求) > 450Mi

最终结果:resourcequota limit = 500Mi

相关文章:

浅析Resource Quota中limits计算机制

前言 在生产环境中&#xff0c;通常需要通过配置资源配额&#xff08;Resource Quota&#xff09;来限制一个命名空间&#xff08;namespace&#xff09;能使用的资源量。在资源紧张的情况下&#xff0c;常常需要调整工作负载&#xff08;workload&#xff09;的请求值&#xf…...

《数据结构与算法基础 by王卓老师》学习笔记——1.4算法与算法分析

一、算法 1.1算法的研究内容 1.2算法的定义 1.3算法的描述 以下是算法的自然语言描述 以下是算法的传统流程图表示 以下是NS流程图表示 1.4算法和程序的区别与联系 1.5算法的五个特性 1.6算法设计的要求 Robustness也称为鲁棒性 二、算法分析 2.1算法时间效率的度量 2.1.1事…...

运维团队如何加强安全设备监控与日志管理

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;安全设备的监控和日志管理成为了运维团队不可或缺的工作内容。本文将结合运维行业的实际需求&#xff0c;探讨如何加强安全设备监控与日志管理&#xff0c;以提升系统的安全性和稳定性。 一、安全设备监控…...

仓库管理系统13--物资设置

1、添加窗体 2、设计UI界面 注意这个下拉框的绑定&#xff0c;你看到的选项是由displaymember决定&#xff0c;当你选择了哪个选项时&#xff0c;后台绑定这个选项的ID <UserControl x:Class"West.StoreMgr.View.GoodsView"xmlns"http://schemas.microsoft…...

机器人控制系列教程之URDF文件语法介绍

前两期推文&#xff1a;机器人控制系列教程之动力学建模(1)、机器人控制系列教程之动力学建模(2)&#xff0c;我们主要从数学的角度介绍了机器人的动力学建模的方式&#xff0c;随着机器人技术的不断发展&#xff0c;机器人建模成为了机器人系统设计中的一项关键任务。URDF&…...

Arathi Basin (AB) PVP15

Arathi Basin &#xff08;AB&#xff09; PVP15 阿拉希盆地&#xff0c;PVP&#xff0c;15人战场...

Ubuntu/Linux SSH 端口转发

文章目录 Ubuntu/Linux SSH 端口转发概述本地端口转发场景一场景二 参考资料 Ubuntu/Linux SSH 端口转发 概述 SSH, Secure Shell 是一种在网络上用于安全远程登录到另一台机器的工具。除了远程登录以外&#xff0c;ssh 的端口转发是它的另一项强大功能。通过 ssh 端口转发功…...

flask的locked_cached_property

下面是一个关于 locked_cached_property 装饰器的详细教程。这个装饰器将一个方法转换为一个惰性属性&#xff0c;在第一次访问时计算其值&#xff0c;并在随后的访问中缓存该值。同时&#xff0c;它在多线程环境中是线程安全的。 教程&#xff1a;理解和使用 locked_cached_p…...

OSI七层模型TCP/IP四层面试高频考点

OSI七层模型&TCP/IP四层&面试高频考点 1 OSI七层模型 1. 物理层&#xff1a;透明地传输比特流 在物理媒介上传输原始比特流&#xff0c;定义了连接主机的硬件设备和传输媒介的规范。它确保比特流能够在网络中准确地传输&#xff0c;例如通过以太网、光纤和无线电波等媒…...

Swagger2及常用校验注释说明

Api(value "后台用户管理") RestController RequestMapping("bossuser") public class BossUserController {ApiOperation(value "测试接口")PostMapping("test")public String testUser(Valid RequestBody TestUser user) {LOG.inf…...

【项目实训】各种反爬策略及爬虫困难点总结

在这里&#xff0c;我总结了本次项目的数据收集过程中遇到的反爬虫策略以及一些爬虫过程中容易出现问题的地方。 user-agent 简单的设置user-agent头部为浏览器即可&#xff1a; 爬取标签中带href属性的网页 对于显示岗位列表的页面&#xff0c;通常检查其源代码就会发现&…...

能量智慧流转:全面升级储能电站的智能网关解决方案

监控系统是电化学储能电站的关键组成部分&#xff0c;储能电站也需要相应的监控系统&#xff0c;通过监控系统对储能设备的状态进行监测&#xff0c;实时感知储能设备的健康状态&#xff0c;控制储能设备的充放电功率和时机等&#xff0c; 一个好的监控系统可以实现储能电站安全…...

【金融研究】6月,对冲基金狂卖美国科技股 短期乐观,长期悲观?“油价最大空头”花旗:明年跌到60

科技股新高的背后&#xff0c;是对冲基金与散户投资者的分歧&#xff0c;对冲基金正在向散户投资者出售创纪录数量的科技/半导体/美股“七姐妹”股票。 对冲基金狂卖美国科技股 在五大明星科技股&#xff08;苹果、亚马逊、微软、英伟达、谷歌&#xff09;轮番创下历史新高的…...

GroundingDINO1.5突破开放式物体检测界限:介绍与应用

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

centos编译内核ko模块

1、make报错 make: * /lib/modules/4.14.0-49.el7a.aarch64/build: 没有那个文件或目录。 停止。 [rootlocalhost 4.14.0-49.el7a.aarch64]# pwd /lib/modules/4.14.0-49.el7a.aarch64 [rootlocalhost 4.14.0-49.el7a.aarch64]# ll 总用量 1744 lrwxrwxrwx. 1 root root …...

Android13 WMS窗口层级树

1&#xff0c;认识层级树 可以通过dumpsys activity containers 看到 WMS 层级树的结构 ACTIVITY MANAGER CONTAINERS (dumpsys activity containers) ROOT typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Displa…...

计算机毕业设计Python+LSTM+Tensorflow股票分析预测 基金分析预测 股票爬虫 大数据毕业设计 深度学习 机器学习 数据可视化 人工智能

基于TensorFlow-LSTM的股票预测系统开题报告 一、研究背景与意义 随着信息技术的飞速发展&#xff0c;股票市场作为现代经济活动的重要组成部分&#xff0c;其价格波动受到广泛关注。投资者们迫切希望通过科学的方法预测股票价格&#xff0c;以优化投资决策&#xff0c;实现利…...

仓库管理系统14--仓库设置

1、添加窗体 <UserControl x:Class"West.StoreMgr.View.StoreView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.openxmlformats.…...

Python 算法交易实验73 QTV200第二步: 数据清洗并写入ClickHouse

说明 先检查一下昨天启动的worker是否正常工作&#xff0c;然后做一些简单的清洗&#xff0c;存入clickhouse。 内容 1 检查数据 from Basefuncs import * # 将一般字符串转为UCS 名称 def dt_str2ucs_blockname(some_dt_str):some_dt_str1 some_dt_str.replace(-,.).re…...

记录:有趣的C#多元运算符 ? : 表达式写法

有时候用 if //...Whatre you she wanna go else if //...do do do else //...and i know something just like this... 感觉代码太多了怎么优雅的、高端的替换&#xff1f; 看个高端的栗子菊&#xff1a; LedCOM["parity"] ledData[4] "N" ? …...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...