浅析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-requirements

    for _, 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL周内训参照4、触发器-插入-修改-删除

触发器 1、用户购买商品时&#xff0c;要求库存表中的库存数量自动修改 详细示例 delimiter $$ create trigger stock_change after -- 事件触发在 下订单之后 insert -- 监视插入事件 on stock -- 监视 order订单表 for each row begin update stock set stockstock-new.st…

ROT5、ROT13、ROT18、ROT47全系列加解密小程序

ROT5、ROT13、ROT18、ROT47全系列加解密小程序 这几天在看CTF相关的课程&#xff0c;涉及到古典密码学和近代密码学还有现代密码学。自己编了一个关于ROT全系列的加、解密小程序。 ​ ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性&a…

音视频入门基础:H.264专题(8)——H.264官方文档的描述符

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

开发自动回复信息的插件:代码的力量与智慧!

在信息爆炸的时代&#xff0c;自动回复信息的插件成为了许多用户和管理者的得力助手&#xff0c;这些插件能够根据预设的规则或算法&#xff0c;自动、快速、准确地回复用户的信息&#xff0c;极大地提高了沟通效率和用户体验。 而开发这样一款插件&#xff0c;离不开一系列精…

这三款工具很好用,赶快试试

FileZilla FileZilla是一款免费开源的FTP软件&#xff0c;分为客户端版本和服务器版本&#xff0c;具备所有的FTP软件功能。它是一个快速、可信赖的FTP客户端以及服务器端开放源代码程序&#xff0c;具有多种特色和直觉的界面。FileZilla客户端版是一个方便高效的FTP客户端工具…

校企合作,为人才培养注入新动力

树莓集团在校企合作育人方面取得了显著成效&#xff0c;通过共建专业、定制课程、实习实训等多种方式&#xff0c;实现了教育资源的优化配置和高效利用&#xff0c;为高校和企业提供了更多的发展机会和合作空间。 1、共建专业与实验室&#xff1a;树莓集团与高校共同建设数字产…

Transformer教程之Transformer的历史背景

在现代人工智能领域&#xff0c;Transformer模型已经成为一种不可或缺的技术&#xff0c;它在自然语言处理&#xff08;NLP&#xff09;和计算机视觉等多个领域取得了巨大的成功。本文将带你回顾Transformer的历史背景&#xff0c;了解它是如何从最初的构想到今天的广泛应用的。…

分享一款永久免费内网穿透工具——巴比达内网穿透

最近在做web项目&#xff0c;想办法将web项目映射到公网进行访问&#xff0c;由于没有固定IP&#xff0c;只能使用内网穿透的方法&#xff0c;于是在网上搜索了一番&#xff0c;只有神卓互联旗下的这款巴比达内网穿透是真正免费的&#xff0c; 其它的要么用不了、要么限制没有流…

springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password

为了让spring admin 能正确获取到 spring config的actuator的信息&#xff0c;在eureka的metadata中添加了metadata.user.user metadata.user.password eureka.instance.metadata-map.user.name${spring.security.user.name} eureka.instance.metadata-map.user.password${spr…

Dataease配置Nginx代理

Dataease配置Nginx代理 一.修改前端静态资源地址和后端接口地址 **1.**修改应用程序的上下文路径 配置文件地址&#xff1a;backend/src/main/resources 找到文件application-whole.properties&#xff0c;做如下修改&#xff1a; **2.**修改前端静态资源路径和打包配置 配…

产品经理面试指南:四大专栏助你成功上岸

面对产品经理的职位面试&#xff0c;你是否感到有些紧张和迷茫&#xff1f;不用担心&#xff0c;我们为你精心准备了四大面试专栏&#xff0c;包括产品经理专业面试、部门负责人复试、HR面试以及面试技巧&#xff0c;让你在面试过程中如鱼得水&#xff0c;轻松应对。 01 产品经…

ScheduledThreadPoolExecutor和时间轮算法比较

最近项目中需要用到超时操作&#xff0c;对于不是特别优秀的timer和DelayQueue没有看。 Timer 是单线程模式。如果某个 TimerTask 执行时间很久&#xff0c;会影响其他任务的调度。Timer 的任务调度是基于系统绝对时间的&#xff0c;如果系统时间不正确&#xff0c;可能会出现…

视频多功能闪剪助手,智能去重去水印一键剪辑

这款软件具有全平台去水印的功能&#xff0c;无论视频来自哪个平台&#xff0c;无论水印的位置如何变换&#xff0c;它都能轻松去除。同时&#xff0c;它还支持各种去重方法&#xff0c;无论重复内容的形式如何&#xff0c;它都能一一识别并移除&#xff0c;让你的视频内容始终…

干货:ANR日志分析全面解析

ANR类型 出现ANR的一般有以下几种类型&#xff1a; 1:KeyDispatchTimeout&#xff08;常见&#xff09; input事件在5S内没有处理完成发生了ANR。 logcat日志关键字&#xff1a;Input event dispatching timed out 2:BroadcastTimeout 前台Broadcast&#xff1a;onReceiver在…

深圳技术大学oj B : 所有不含逆序对的组合数

Description 数组中可能包含重复的数字&#xff0c; 求由这些数字组成的不重复字符串&#xff0c; 且字符串中不包含逆序对。 Input 有若干组测试数据&#xff0c;&#xff08;1&#xff5e;20之间&#xff09; 每一组测试数据第一行输入一个整数 n (0 ≤ n ≤ 20)&#xff…

【Micro-ROS学习】

Micro-ROS 是专为 ROS 2 设计的&#xff0c;它允许在微控制器&#xff08;microcontrollers&#xff09;上实现ROS 2的功能。Micro-ROS 从 ROS 2 架构优化而来&#xff0c;目的是让那些资源有限的嵌入式设备也能够接入ROS 2生态系统&#xff0c;享受ROS 2带来的标准化通信、模块…

【Redis】三大Redis内存分析工具介绍(Redisinsight、RDR、RMA)

一、RedisInsight工具介绍 RedisInsight是一款Redis官方开源的可视化管理工具&#xff0c;旨在帮助开发人员和管理员更轻松地设计、开发和优化Redis应用程序。以下是关于RedisInsight的详细介绍&#xff1a; 1、工具概述 定义&#xff1a;RedisInsight是一个直观且高效的Red…

MySQL高级-索引-使用规则-覆盖索引回表查询

文章目录 1、覆盖索引1.1、查看索引1.2、删除单列索引 idx_user_pro1.3、查询 profession软件工程 and age31 and status01.4、执行计划 profession软件工程 and age31 and status01.5、执行计划 select id,profession,age,status1.6、执行计划 select id,profession,age,statu…

大数据------JavaWeb------MyBatis(完整知识点汇总)

MyBatis MyBatis简介 定义 它是一款优秀的持久层框架&#xff0c;用于简化JDBC开发它原来是Apache的一个开源项目iBatis&#xff0c;后来改名为MyBatis中文官网&#xff1a;https://mybatis.org/mybatis-3/zh_CN/index.html JaveEE三层架构 表现层&#xff08;做页面展示&…

AI 开发平台(Coze)搭建《美食推荐官》

前言 本文讲解如何从零开始&#xff0c;使用扣子平台去搭建《美食推荐官》 bot直达&#xff1a;美食推荐官 - 扣子 AI Bot (coze.cn) 欢迎大家体验一下&#xff01;&#xff01; 效果 正文 prompt 美食推荐官的首要任务就是推荐美食&#xff0c;基于这个我们要给他一个基…