Kubernetes中 Requests 和 Limits 的初步理解

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.mzph.cn/diannao/14369.shtml

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

相关文章

SVN创建项目分支

目录 背景调整目录结构常规目录结构当前现状目标 调整SVN目录调整目录结构创建项目分支 效果展示 背景 当前自己本地做项目的时候发现对SVN创建项目不规范&#xff0c;没有什么目录结构&#xff0c;趁着创建目录分支的契机&#xff0c;顺便调整下SVN服务器上的目录结构 调整目…

Stable Diffusion WebUI使用inpaint anything插件实现图片局部重绘

Inpaint Anything是一个强大的图像处理工具,它结合了SAM(Segment Anything Model)、图像修补模型(如LaMa)和AIGC模型(如Stable Diffusion)等先进技术,以实现图像中物体的移除、内容的填补以及场景的替换。无论是对图像中的任何元素进行编辑,还是对图像整体进行场景转换…

【Vue】Vue2使用ElementUI

目录 Element UI介绍特点Vue2使用Element安装引入ElementUI组件库 使用ElementUI用户注册列表展示其他 mint-ui介绍特点安装组件引入组件Mint-ui相关组件 Element UI 介绍 官网(基于 Vue 2.x ):https://element.eleme.cn/#/zh-CN ElementUI 是一个基于 Vue.js 的桌面端组件库…

Vue文本溢出如何自动换行

css新增 word-break: break-all; word-wrap: break-word;

【Linux系统】文件与基础IO

本篇博客整理了文件与文件系统、文件与IO的相关知识&#xff0c;借由库函数、系统调用、硬件之间的交互、操作系统管理文件的手段等&#xff0c;旨在让读者更深刻地理解“Linux下一切皆文件”。 【Tips】文件的基本认识 文件 内容 属性。文件在创建时就有基本属性&#xff0…

网易:一季度营收269亿元,连续7季研发强度超15%领跑行业

5月23日&#xff0c;网易发布2024年第一季度财报。财报显示&#xff0c;网易Q1营收269亿元&#xff0c;归属于公司股东的净利润85亿元&#xff08;Non-GAAP&#xff09;&#xff0c;以连续7个季度超15%的研发投入强度领跑行业&#xff0c;首季业绩稳健启航。 一季度&#xff0…

JVM学习-动态链接和方法返回地址

动态链接–指向运行时常量池的方法引用 每一个栈帧内部包含一个指向运行时常量池中该栈帧所属方法的引用&#xff0c;包含这个引用的目的为了支持当前方法的代码能够实现动态链接(Dynamic Linking)&#xff0c;如invokednamic指令。在Java源文件被编译到字节码文件中时&#x…

云平台概要设计文档 -大纲

1. 引言 1.1 目的 本文档的目的是提供一份详细的技术规范,用以指导开发团队实现云平台的建设和部署。该文档旨在确保所有开发人员和相关技术人员对系统的架构、组件、交互流程、数据处理及安全措施有深入的理解,从而能够高效、一致地开发出符合预期功能和性能要求的系统。 …

JAVA:浅谈JSON与JSON转换

可能有很多人&#xff0c;无论是前端还是后端&#xff0c;无论是JAVA还是Python还是C&#xff0c;都应该跟JSON这种数据格式打过交道&#xff0c;那么有没有仔细的想过&#xff0c;什么叫JSON&#xff1f; JSON是一种轻量级的数据交换格式。它基于JavaScript语言的对象表示法&a…

初识java——javaSE(6)抽象类与接口【求个关注!】

文章目录 前言一 抽象类1.1 抽象类的概念1.2 抽象类的语法&#xff1a;1.3 抽象类与普通类的区别&#xff1a; 二 接口2.1 接口的概念2.2 接口的语法2.2.1 接口的各个组成2.2.2 接口之间的继承 2.3 接口的实现接口不可以实例化对象 2.4 接口实现多态 三 Object类3.1 Object类是…

【shell】脚本练习题

案例&#xff1a; 1. for ping测试指网段的主机 网段由用户输入&#xff0c;例如用户输入192.168.2 &#xff0c;则ping 192.168.2.10 --- 192.168.2.20 UP&#xff1a; /tmp/host_up.txt Down: /tmp/host_down.txt 2. 使用case实现成绩优良差的判断 1. for ping测试指…

Android异常及解决方式记录

异常1&#xff1a;Tmp detached view should be removed from RecyclerView before it can be recycled: 解决方法&#xff1a; recycleView.setItemAnimator(null);

第17讲:C语言内存函数

目录 1.memcpy使用和模拟实现2.memmove使用和模拟实现3.memset函数的使用4.memcmp函数的使用 1.memcpy使用和模拟实现 void * memcpy (void * destination, const void * source, size_t num);• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存…

Python面试宝典:Python中与多线程编程相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第十三章:并发编程:第一节:多线程编程】 第十三章:并发编程第一节:多线程编程使用`threading`模块面试题1面试题2面试题3面试题4面试题5面试题6面试题7面试题8面试题9面试题10更多面…

打豆豆game

好的&#xff0c;我将为您编写一个简单的“打豆豆”游戏。这个游戏的基本规则是这样的&#xff1a; 游戏将生成一个指定大小的网格&#xff0c;每个格子可能包含一个豆豆。玩家可以指定一个格子&#xff0c;如果该格子中有豆豆&#xff0c;则打掉该豆豆&#xff0c;并得分。每…

【Java 开发】模版模式使用模版

在日常开发中&#xff0c;对适合的场景。使用模板模式可以帮助我们抽取公共的东西&#xff0c;使代码更加优雅。本次写了一个模版模式的使用模版&#xff0c;方便以后 cv。 本次是以订单的接受、拒绝、关闭三个操作作为 demo 来写的模板。 一、定义请求基类&#xff0c;不同操作…

leecode42 DP

自己的暴力想法,把图形看成一个个碗,一段一段地算,错误示例 class Solution { public:int trap(vector<int>& height) {int s height.size();int sum 0,kk1;int flag 0;int p1 -1, p2 -1;for (int i 1; i < s; i) {cout<<p1<<endl;if (p1 >…

网络安全技术与应用:远程控制与数据库安全

实验准备 软件&#xff1a;VMware Workstation Pro 虚拟机&#xff1a;Red Hat Enterprise Linux 7 服务器&#xff0c;Red Hat Enterprise Linux 7 客户端 网络模式&#xff1a;NAT模式 1、配置服务器及客户端网络 服务器IP 客户端IP 测试相互通信 在客户机上设置镜像&#…

【C++刷题】优选算法——递归第二辑

全排列 vector<vector<int>> vv; void dfs(vector<int>& nums, vector<int>& v, vector<bool>& check) {if(v.size() nums.size()){vv.push_back(v);return;}for(int i 0; i < nums.size(); i){if(check[i] false){v.push_ba…

pillow学习5

ImageEnhance 模块 内置的 ImageEnhance 模块中包含了多个用于增强图像效果的函数&#xff0c;主要用来调整图像 的色彩、对比度、亮度和清晰度等&#xff0c;感觉上和调整电视机的显示参数一样。 在模块 ImageEnhance 中&#xff0c;所有的图片增强对象都实现一个通用的接口。…