Kubernetes中 Requests 和 Limits 的初步理解

news2024/11/17 17:32:15

1 灵魂拷问

我们在使用 Kubernetes 时是否遇到以下情况:

  • 你会不会部署负载的时候将 CPU requests/limits 设置得过低或过高?
  • 你会不会部署负载的时候将 内存 requests/limits 设置得过低或过高?
  • 又或者你根本不设置 requests/limits?
  • request表示什么意思?limits 又是什么意思?
  • CPU 设置0.5表示啥意思?为啥又有人写 500m,这又是什么情况?
  • 最佳实践又是什么?

2 什么是 requests 和 limits?

我们都知道 Kubernetes 中最小的原子调度单位是Pod,那么就意味着资源管理和资源调度相关的属性都应该Pod对象的字段,其中我们最常见的就是 Pod 的 CPU 和内存配置,而为了实现 Kubernetes 集群中资源的有效调度和充分利用,Kubernetes采用 requests 和 limits 两种限制类型来对CPU和内存资源进行容器粒度的分配。

resources:  
  limits:    
    cpu: "1"
    memory: "500Mi"
  requests:    
    cpu: "100m"
    memory: "1000Mi"

下面我们首先来了解一下上面这段 yaml 文件中字段的含义:requests 和 limits:

  • requests 定义了对应的容器所需要的最小资源量。
  • limits 定义了对应容器最大可以消耗的资源上限。
  • cpu 等于1一般等同于1CPU 核心,1个VCPU或者一个超线程,具体要看服务器的CPU。而 limits 这里设置的 100m 则叫做100毫核,100m就表示0.1个核,所以这里也可以用0.1代替。
  • memory 等于500Mi,(备注:1Mi=10241024;1M=10001000)

接下来我们来初步理解 requests 和 limits 这两个资源限制类型,在 Kubernetes 对 CPU 和内存资源限额的设计,通常是指用户在提交 Pod 时,可以声明一个相对较小的 requests 值供调度器使用,而 Kubernetes 真正设置给容器 Cgroups 的,则是相对较大的 limits 值。所以一般来说,在调度的时候 requests 比较重要,在运行时 limits 比较重要。

而对应实际的业务场景来说,以 java 应用为例,requests 对应的就是JVM虚拟机所需资源的最小值,而 limits 对应的就是 JVM 虚拟机所能够使用的资源最大值。以内存资源为例一般就是指:Xms 和 Xmx,如果 requests 值设置的小于JVM虚拟机 Xms 的值,那么就会导致 Pod 内存溢出,从而导致 Pod 被杀掉,而后重新创建一个Pod。

那么如果 CPU 资源使用超过了 limits,Pod会不会被杀掉呢?答案是不会,但是被限制。如果没有设置 limits ,Pod 可以使用全部空闲的资源。另外如果设置了 limits而没有设置 requests 时,Kubernetes 默认会将 requests 等于 limits。

这里通常还会将 requests 和 limits 描述的资源分为两类:可压缩资源(compressible resources) 和不可压缩资源(incompressible resources)。这里不难看出CPU这类型资源为可压缩资源而内存这类型资源为不可压缩资源。所以合理设置不可压缩资源的limits值就相当重要了。

3 理解 Kubernetes 中 Pod 的 Qos

当我们理解 requests 和 limits了之后,我们来想一个问题:当某个 Node 上的内存还剩下 90Mi,这个时候就触发了 Kubernetes 的 Eviction,这个时候 kubelet 就会挑选 Pod 进行删除操作,那么这个时候 kubelet 挑选的依据是什么呢?

当 Kubernetes 所管理的宿主机上不可压缩资源短缺时,就有可能触发 Eviction。
Eviction 的默认阈值如下:
memory.available<100Mi
nodefs.available<10%
nodefs.inodesFree<5%
imagefs.available<15%

答案就是依据requests和limits值的设置方式来决定,Kubernetes会将Pod划分成3种不同的Qos级别里面去,根据Pod不同的Qos级别来挑选。 

  • 首当,其冲的就是删除BestEffort级别的Pod,这个级别的Pod完全没有做任何资源限制,即完全没有设置CPU/内存的requests和limits。
  • 其次,是Burstable级别的Pod,这个级别的Pod至少设置了1个CPU或者内存的requests,但又不满足最高级别的Qos条件。
  • 最后,才是 Guaranteed 级别的Pod,即Pod同时设置了CPU、内存的requests和limits,并且requests值等于limits的值。并且,Kubernetes 会保证只有当 Guaranteed 级别的 Pod 的资源使用量超过了其 limits 的限制,或者宿主机本身正处于 Memory Pressure 状态(当宿主机的 Eviction 阈值达到后,就会进入该状态)时,Guaranteed 级别的 Pod 才可能被选中进行 Eviction 操作。

 可以看下面的表格,以更好的理解:

​CPU requests/limits内存 requests/limitsQos级别
未设置未设置BestEffort
未设置requests < limitsBurstable
未设置requests = limitsBurstable
requests < limits未设置Burstable
requests < limitsrequests < limitsBurstable
requests < limitsrequests = limitsBurstable
requests = limitsrequests = limitsGuaranteed

4 最佳实践

为 namespace 设置资源配额

  • ResourceQuotas 限制主要是指该 namespace 下面的所有 Pod 指定一个 requests和limits的总和要小于设置的 requests 和 limits。
  • 该 namespace 下每一个容器必须指定 requests 或 limits,否则将不允许创建。

这样子做的好处就是实现了一条隐含的规则,每个人都要遵守。

设置默认的 requests 和 limits

在生产环境中,很多负载 CPU 和内存的所需的资源基本相同,那么我们可以设置好默认的 requests 和 limits,当用户没有指定 requests 和 limits 值,直接使用默认值。

配置启用CPUSET

我们知道,在使用容器的时候,你可以通过设置 cpuset 把容器绑定到某个 CPU 的核上,而不是像 cpushare 那样共享 CPU 的计算能力。这种情况下,由于操作系统在 CPU 之间进行上下文切换的次数大大减少,容器里应用的性能会得到大幅提升。事实上,cpuset 方式,是生产环境里部署在线应用类型的 Pod 时,非常常用的一种方式。

那么如何启用 cpuset 呢?只需要遵循以下2条规则来设置 requests 和 limits 即可:

  1. 设置 CPU 的 requests 和 limits 的值相等且为整数值。
  2. 设置 Pod 的 CPU 和内存的 requests 和 limits 值相等,也就是该 Pod 是一个Guaranteed 级别的 Pod。

高负载Pod requests 和 limits 的设置

而对于负载,流量比较高的 Pod,requests 和 limits 的设置需要根据具体的情况分析,需要分析业务的多个维度。例如

  • 该服务的容器是 CPU 密集型,还是吃内存型,亦或者是 IO 密集型。
  • 该服务是个单点,还是高可用的。
  • 这个服务的上下游都是谁?
  • 这个服务的历史监控数据是怎么样的?

说了这么多,貌似还是不知道怎么设置。这就给大家一个“标准答案”:

  • 根据历史的 CPU,内存,网络,存储等监控数据,一般 requests 值可以设定为历史数据均值。
  • limits 则设置为历史数据均值再增加 30%-50%,当然实际设置还是要根据情况做些微调。

总结

本文主要为大家介绍了 Kubernetes 中 requests 和 limits 两种资源限制类型来对资源进行容器粒度的分配,从而实现 Kubernetes 集群中资源的有效调度和充分利用,还提供了一些我的一些实践。欢迎大家留言交流。

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

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

相关文章

【Linux网络编程】IO多种转接之Reactor

Reactor 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 基于上一篇epoll的学习&#xff0c;现在我们也知道epoll的工作模式有两种&#xff0c…

前端菜鸡,对于35+程序员失业这个事有点麻了

“经常看到30岁程序员失业的新闻&#xff0c;说实话&#xff0c;有点麻。目前程序员供求关系并未失衡&#xff0c;哪怕是最基础的前端或者后台、甚至事务型的岗位也是足够的。 事实上&#xff0c;现在一个开出的岗位要找到一位尽职尽责能顺利完成工作的程序员并不是一件那么容…

石油化工巡检机器人:应对挑战的创新力量

在石油化工领域&#xff0c;安全始终是高悬的达摩克利斯之剑。人工巡检面临诸多痛点&#xff0c;如高危环境对人身安全的巨大威胁&#xff0c;复杂工况下难以做到全面细致监测&#xff0c;对有害气体检测存在滞后性&#xff0c;还有恶劣天气对巡检工作的严重干扰。而这些痛点&a…

[LLM-Agent]万字长文深度解析规划框架:HuggingGPT

HuggingGPT是一个结合了ChatGPT和Hugging Face平台上的各种专家模型&#xff0c;以解决复杂的AI任务&#xff0c;可以认为他是一种结合任务规划和工具调用两种Agent工作流的框架。它的工作流程主要分为以下几个步骤&#xff1a; 任务规划&#xff1a;使用ChatGPT分析用户的请求…

【linux】新增磁盘的使用

查看硬盘和分区信息 【Linux】lsblk 命令使用-CSDN博客 lsblk 根据您提供的lsblk命令输出&#xff0c;我们可以看到系统中的块设备及其分区信息。以下是对每个设备的解释&#xff1a; vda&#xff1a;这是一个大小为40G的磁盘设备。 vda1&#xff1a;这是vda磁盘的第一个分区…

unidbg入门笔记

一、unidbg 介绍 unidbg 是凯神 在 2019 年初开源的一个轻量级模拟器&#xff0c;一个基于Java的跨平台解密引擎&#xff0c;专门用于动态分析和逆向工程应用程序。它可以模拟不同CPU架构、操作系统和指令集&#xff0c;从而使用户能够在一个统一的环境中分析各种不同类型的二…

利用Python去除PDF水印

摘要 本文介绍了如何使用 Python 中的 PyMuPDF 和 OpenCV 库来从 PDF 文件中移除水印&#xff0c;并将每个页面保存为图像文件的方法。我们将深入探讨代码背后的工作原理&#xff0c;并提供一个简单的使用示例。 导言 简介&#xff1a;水印在许多 PDF 文件中都很常见&#x…

用 vue3 + phaser 实现经典小游戏:飞机大战

本文字数&#xff1a;7539字 预计阅读时间&#xff1a;30分钟 01 前言 说起小游戏&#xff0c;最经典的莫过于飞机大战了&#xff0c;相信很多同学都玩过。今天我们也来试试开发个有趣的小游戏吧&#xff01;我们将从零开始&#xff0c;看看怎样一步步实现一个H5版的飞机大战&a…

MyBatis从入门到“入土“

&#x1f495;喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#xff01;&#x1f495;(●◡●) 目录 一、Mybatis为何物&#xff1f;&#x1f44c; 二、快速入门&#x1f923; 1、新建项目&#x1f60a; 2、数据库建表&#x1f60a; 3、导入依赖的jar包&#x1f60a;…

【高级数据结构】B树

B树 一、概念性问题1、前置知识&#xff1a;常见搜索结构2、常规使用数据结构缺陷问题3、B树概念4、存放数量分析 二、代码实现逻辑1、结点定义和基本框架2、Find查找函数&#xff08;1&#xff09;思想&#xff08;2&#xff09;代码实现 3、InsertKey插入关键字函数--InsertK…

采用伪代码及C代码演示如何解决脱机最小值问题

采用伪代码及C代码演示如何解决脱机最小值问题 问题背景算法设计伪代码实现C代码实现证明数组正确性使用不相交集合数据结构最坏情况运行时间的紧确界 问题背景 脱机最小值问题涉及到一个动态集合 &#xff08; T &#xff09; &#xff08;T&#xff09; &#xff08;T&…

国内大模型价格战全面爆发:新旧势力逐鹿江湖【附主流模型价格对比】

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;大模型逐渐成为行业的焦点。然而&#xff0c;伴随而来的却是一场价格战。DeepSeek率先推出超低价服务&#xff0c;随后字节跳动、阿里巴巴、百度、科大讯飞、腾讯等巨头纷纷跟进&#xff0c;使得这一领域的竞争愈演愈…

echarts-树图、关系图、桑基图、日历图

树图 树图主要用来表达关系结构。 树图的端点也收symbol的调节 树图的特有属性&#xff1a; 树图的方向&#xff1a; layout、orient子节点收起展开&#xff1a;initialTreeDepth、expandAndCollapse叶子节点设置&#xff1a; leaves操作设置&#xff1a;roam线条&#xff1a…

Mysql触发器优化大数据表

背景 数据库的订单数量过多&#xff0c;需要分出热表用于快速查询&#xff0c;热表仅保存10天的订单数据。 解决思路 每次数据库订单表触发增删改时&#xff0c;同步操作到trigger_order_mul_info表&#xff0c;然后trigger_order_mul_info会定期删除超过10天的数据。 增删…

【编译原理复习笔记】正则表达式与自动机

正则表达式 正则表达式是一种用来描述正则语言的更紧凑的表达方法 e.g. r a ( a ∣ b ) ∗ ( ϵ ∣ ( . ∣ ) ( a ∣ b ) ) ra(a|b)^*(\epsilon|(.|\\_ )(a|b)) ra(a∣b)∗(ϵ∣(.∣)​(a∣b)) 正则表达式可以由较小的正则表达式按照特定的规则递归地构建。每个正则表达式定义…

【笔记】软件架构师要点记录(1)

【笔记】软件架构师要点记录 20240517 20240517 连续性&#xff1a;恢复能力&#xff1b;可用性&#xff1a;保持稳定态的时长 增量开发模式&#xff1a;在增量开发中&#xff0c;每个增量都有明确的范围和功能&#xff0c;并按照特定的功能顺序完成。增量之间的范围划分在开发…

防火墙技术基础篇:基于IP地址的转发策略

防火墙技术基础篇&#xff1a;基于IP地址的转发策略的应用场景及实现 什么是基于IP地址的转发策略&#xff1f; 基于IP地址的转发策略是一种网络管理方法&#xff0c;它允许根据目标IP地址来选择数据包的转发路径。这种策略比传统的基于目的地地址的路由更灵活&#xff0c;因…

图片转excel技术在医疗领域的应用探讨

在医疗行业中&#xff0c;图片转Excel技术的应用已经逐渐普及&#xff0c;为医护人员提供了极大的便利。这种技术利用OCR&#xff08;光学字符识别&#xff09;和机器学习的先进算法&#xff0c;将图片中的信息自动转化为Excel表格&#xff0c;大大提高了数据处理和分析的效率。…

智能锁千千万,谁是你的NO.1,亲身实测凯迪仕传奇大师K70旗舰新品

智能锁千千万&#xff0c;谁是你的NO.1。欢迎来到智哪儿评测室&#xff0c;这次我们为大家带来了凯迪仕传奇大师K70系列的一款重磅新品。 在科技的浪潮中&#xff0c;家居安全领域正经历着前所未有的变革。智能锁越来越成为家的安全守护神&#xff0c;以及智能生活的得力助手。…

Monodle centerNet3D 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署

一直想做一点3D目标检测&#xff0c;先来一篇单目3D目标检测Monodle&#xff08;基于centernet的&#xff09;&#xff0c;训练代码参考官方【代码】&#xff0c;这里只讲讲如何部署。 模型和完整仿真测试代码&#xff0c;放在github上参考链接【模型和完整代码】。 1 模型训练…