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

一文搞懂 Kubernetes 的 Limits 和 Requests

当在Kubernetes中使用容器时,重要的是要知道所涉及的资源是什么以及如何需要它们。有些进程比其他进程需要更多的CPU或内存。有些是关键的,不应该被饿死。

知道了这一点,我们应该正确配置我们的容器和Pod,以获得两者的最佳效果。

在这篇文章中,我们将看到。

  • Kubernetes 的Limits和Requests介绍

  • 实践案例

  • Kubernetes Requests

  • Kubernetes Limits

  • CPU的特殊性

  • 内存的特殊性

  • Namespace ResourceQuta

  • Namespace LimitRange

  • 总结

Kubernetes的Limits和Requests介绍


在使用Kubernetes时,Limits和Requests是重要的配置,主要包含CPU和内存的配置。

Kubernetes将Limits定义为一个容器使用的最大资源量,这意味着容器的消耗量永远不能超过所显示的内存量或CPU量。

另一方面,Requests是指为容器保留的资源的最小保证量。

image.png

实践案例


让我们来看看下面这个deployment,我们需要为两个不同的容器在CPU和内存上设置Limits和Requests。

kind: DeploymentapiVersion: extensions/v1beta1…template:  spec:    containers:      - name: redis        image: redis:5.0.3-alpine        resources:          limits:            memory: 600Mi            cpu: 1          requests:            memory: 300Mi            cpu: 500m      - name: busybox        image: busybox:1.28        resources:          limits:            memory: 200Mi            cpu: 300m          requests:            memory: 100Mi            cpu: 100m

假如,我们要把该deployment部署到4C16G配置的节点上,可以得到如下信息。

  1. Pod的有效请求是400 MiB的内存和600 millicores的CPU,你需要一个有足够自由可分配空间的节点来安排pod。

  1. Redis容器的CPU份额将是512,而busybox容器是102,Kubernetes总是为每个核心分配1024个份额,因此redis:1024 * 0.5 cores ≅ 512和busybox:1024 * 0.1核 ≅ 102

  1. 如果Redis容器试图分配超过600MB的RAM,它将被OOM杀死,很可能使pod失败。

  1. 如果Redis试图在每100ms内使用超过100ms的CPU,(因为我们有4个核心,可用时间为每100ms 400ms),它将遭受CPU节流,导致性能下降。

  1. 如果Busybox容器试图分配超过200MB的RAM,它将被OOM杀死,导致一个失败的Pod。

  1. 如果Busybox试图每100ms使用超过30ms的CPU,它将遭受CPU节流,导致性能下降。

Kubernetes Requests


Kubernetes将请求定义为容器使用的资源的最低保证量。

基本上,它将设定容器所要消耗的资源的最小数量。

当一个Pod被调度时,kube-scheduler将检查Kubernetes请求,以便将其分配给一个特定的节点:该节点至少可以满足Pod中所有容器的这个数量。如果请求的数量高于可用的资源,Pod将不会被安排,并保持在Pending状态。

关于Pending状态的更多信息,请查看Understanding Kubernetes Pod pending problems【1】。

在这个例子中,在容器定义中,我们设置了一个请求,要求100m核心的CPU和4Mi的内存。

resources:   requests:        cpu: 0.1        memory: 4Mi

Requests通常被使用在以下场景:

  • 当把Pod分配给一个节点时,所以Pod中的容器的指定请求被满足。

  • 在运行时,指定的请求量将被保证为该Pod中的容器的最小值。

image.png

Kubernetes Limits


Kubernetes将Limits定义为一个容器使用的最大资源量。

这意味着容器的消耗量永远不能超过指定的内存量或CPU量。

    resources:      limits:        cpu: 0.5        memory: 100Mi

Limits通常用于以下场景:

  • 当把Pod分配给一个节点时,如果没有设置请求,默认情况下,Kubernetes将分配请求=限制。

  • 在运行时,Kubernetes将检查Pod中的容器所消耗的资源量是否高于限制所显示的数量。

image.png

CPU的特性


CPU是一种可压缩的资源,这意味着它可以被拉伸,以满足所有的需求。如果进程要求太多的CPU,其中一些将被节制。

CPU代表计算处理时间,以核为单位。

  • 你可以用毫微米(m)来表示比一个核心更小的数量(例如,500米是半个核心)。

  • 最小的数量是1m

  • 一个节点可能有一个以上的核心可用,所以请求CPU>1是可能的

image.png

内存的特性


内存是一种不可压缩的资源,意味着它不能像CPU那样被拉伸。如果一个进程没有得到足够的内存来工作,这个进程就会被杀死。

在Kubernetes中,内存的单位是字节。

  • 你可以用,E,P,T,G,M,k来代表Exabyte,Petabyte,Terabyte,Gigabyte,Megabyte和kilobyte,尽管只有最后四个是常用的。(例如,500M, 4G)

  • 警告:不要用小写的m表示内存(这代表Millibytes,低得离谱)

  • 你可以用Mi来定义Mebibytes,其余的也可以用Ei、Pi、Ti来定义(例如,500Mi)

一个Mebibyte(以及它们的类似物Kibibyte、Gibibyte...)是20字节的2次方。它的出现是为了避免与公制中的Kilo、Mega定义相混淆。你应该使用这个符号,因为它是字节的典型定义,而Kilo和Mega是1000的倍数。

image.png

最佳实践


在Kubernetes中,你应该很少使用限制来控制你的资源使用。这是因为如果你想避免饥饿(确保每个重要的进程都能得到它的份额),你应该首先使用请求。

通过设置限制,你只是防止进程在特殊情况下检索额外的资源,在内存方面造成OOM杀戮,在CPU方面造成Throttling(进程将需要等待CPU可以再次使用)。

欲了解更多信息,请查看article about OOM and Throttling【2】。

如果你在一个Pod的所有容器中设置一个等于限制的请求值,该Pod将获得保证的服务质量。

还需要注意的是,资源使用量高于请求的Pod更有可能被驱逐,所以设置非常低的请求会造成弊大于利。可以在Pod eviction and Quality of Service【3】查看。

Namespace ResourceQuata


由于命名空间的存在,我们可以将Kubernetes资源隔离到不同的组,也称为租户。

通过ResourceQuota,你可以为整个命名空间设置一个内存或CPU限制,确保其中的实体不能消耗超过这个数量。

apiVersion: v1kind: ResourceQuotametadata:  name: mem-cpu-demospec:  hard:    requests.cpu: 2    requests.memory: 1Gi    limits.cpu: 3    limits.memory: 2Gi
  • requests.cpu:这个命名空间中所有请求的最大CPU数量。

  • requests.memory:这个命名空间中所有请求的最大内存量。

  • limits.cpu:这个命名空间中所有限制的最大CPU数量。

  • limits.memory:这个命名空间中所有限制的总和的最大内存量。

然后,将其应用于你的命名空间。

kubectl apply -f resourcequota.yaml --namespace=mynamespace

你可以用以下方法列出一个命名空间的当前ResourceQuota。

kubectl get resourcequota -n mynamespace

注意,如果你为命名空间中的特定资源设置了ResourceQuota,那么你就需要为该命名空间中的每个Pod指定相应的限制或请求。否则,Kubernetes将返回一个 "failed quota"的错误。

Error from server (Forbidden): error when creating "mypod.yaml": pods "mypod" is forbidden: failed quota: mem-cpu-demo: must specify limits.cpu,limits.memory,requests.cpu,requests.memory

如果你试图添加一个新的Pod,其容器限制或请求超过了当前的ResourceQuota,Kubernetes将返回一个 "exceeded quota "的错误。

Error from server (Forbidden): error when creating "mypod.yaml": pods "mypod" is forbidden: exceeded quota: mem-cpu-demo, requested: limits.memory=2Gi,requests.memory=2Gi, used: limits.memory=1Gi,requests.memory=1Gi, limited: limits.memory=2Gi,requests.memory=1Gi

Namespace LimitRange


如果我们想限制一个命名空间可分配的资源总量,ResourceQuotas很有用。但如果我们想给里面的元素提供默认值,会发生什么?

LimitRanges是一种Kubernetes策略,它限制了命名空间中每个实体的资源设置。

apiVersion: v1kind: LimitRangemetadata:  name: cpu-resource-constraintspec:  limits:  - default:      cpu: 500m    defaultRequest:      cpu: 500m    min:      cpu: 100m    max:      cpu: "1"    type: Container
  • default。如果没有指定,创建的容器将有这个值。

  • min: 创建的容器不能有比这更小的限制或请求。

  • max: 创建的容器不能有大于此值的限制或请求。

以后,如果你创建一个没有设置请求或限制的新Pod,LimitRange会自动为其所有的容器设置这些值。

    Limits:      cpu:  500m    Requests:      cpu:  100m

现在,想象一下,你添加一个新的Pod,以1200M为限。你会收到以下错误。

Error from server (Forbidden): error when creating "pods/mypod.yaml": pods "mypod" is forbidden: maximum cpu usage per Container is 1, but limit is 1200m

请注意,默认情况下,Pod中的所有容器将有效地拥有100m CPU的请求,即使没有设置LimitRanges。

总结


为我们的Kubernetes集群选择最佳限制是关键,以便获得最佳的能源消耗和成本。

为我们的Pod分配过多的资源可能会导致成本激增。

规模过小或专用于极少的CPU或内存将导致应用程序不能正常运行,甚至Pod被驱逐。

如前所述,除非在非常特殊的情况下,否则不应该使用Kubernetes限制,因为它们可能会造成更大的伤害。在内存不足的情况下,容器有可能被杀死,在CPU不足的情况下,容器有可能被节流。

对于请求,当你需要确保一个进程获得一个有保障的资源份额时,可以使用它们。

相关文章:

一文搞懂 Kubernetes 的 Limits 和 Requests

当在Kubernetes中使用容器时,重要的是要知道所涉及的资源是什么以及如何需要它们。有些进程比其他进程需要更多的CPU或内存。有些是关键的,不应该被饿死。知道了这一点,我们应该正确配置我们的容器和Pod,以获得两者的最佳效果。在…...

【C++】手撕红黑树

文章目录前言一、红黑树的概念二、红黑树的节点结构三、红黑树的插入四、红黑树的调整1、叔叔存在且为红2、叔叔不存在或存在且为黑3、插入完整代码4、总结五、红黑树的验证六、红黑树的删除七、红黑树与 AVL 树的比较八、红黑树的代码实现前言 在网络上流传着这样一张图片&am…...

Java中的CAS实现原理

文章目录一、什么是CAS?二、JAVA中如何实现CAS操作三、CAS在JUC中的运用四、ABA问题一、什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行…...

什么是华为云对象存储OBS?它有什么优势?

华为对象存储OBS(Object Storage Service)是一种高可用、高可靠、高性能的云存储服务,能够为企业和个人用户提供强大的数据存储和管理功能。本文将对华为对象存储OBS的特点、优势和未来发展进行详细介绍。 一、华为对象存储OBS的特点 1.对象…...

你知道照片怎么变清晰吗?增强照片清晰度的方法

相信很多小伙伴都会有这种的经历,去游玩时高高兴兴的拍照留念,结果拍出来的照片不是很尽人意。或者是画面还没聚焦好,就按下快门,导致拍摄出来的照片变模糊了。很多小伙伴遇到这种情况都很烦恼,照片丢了可惜&#xff0…...

NOIP模拟赛 轰炸(bomb)

题目描述 有nnn座城市,城市之间建立了mmm条有向的地下通道。 你需要发起若干轮轰炸,每轮可以轰炸任意多的城市。但在每次轰炸城市中,不能同时存在两个城市i,ji,ji,j满足可以通过地下通道从城市iii到达城市jjj。你需要求出最少需要多少轮可以…...

Linux系统之安装PHP环境

Linux系统之安装PHP环境 一、PHP介绍1.PHP简介2.PHP优势3.php7版本特点二、本地环境介绍1.环境规划2.检查操作系统版本3.检查当前yum仓库三、安装PHP5.4版本1.查看可安装php版本2.使用yum安装php3.安装httpd服务4.关闭selinux和设置防火墙5.编辑index.php测试文件6.测试php环境…...

MySQL8的安装教程

MySQL8的安装教程 1.安装包的下载 如果不想去官网下载的话可以去百度网盘进行下载。 MySQL :: Download MySQL Community Server mysql-8.0.28-winx64.zip_免费高速下载|百度网盘-分享无限制 (baidu.com) 提取码:0001 2.解压 3.创建一个my.ini的文件 最好是创建…...

日入500+的程序员都在用的“接私活”平台

网上总说程序员的薪资很高,这我可就不同意了: 程序员的薪资哪里是很高,而是非常高!而会接私活的程序员更是能拿到更高的收入!作为一个程序员,这些接私活的网站一定要收藏起来,让你在“八小时外…...

MySQL表设计思路(一对多、多对多...)

要开始单独负责需求了,捋一捋表设计的思路。 文章目录一、MySQL中的数据类型二、一对一的关系设计二、一对多的关系设计三、多对多的关系设计四、经验总结一、MySQL中的数据类型 字符串类型 varchar:即variable char ,可边长度的字符串&#…...

内存对齐:C/C++编程中的重要性和技巧

C/C中的内存对齐前言基本概念 什么是内存对齐?内存对齐的定义内存对齐的作用数据类型的大小ARM 64 位架构和 x86_64 架构下的数据类型大小ARM 32 位架构下的数据类型大小内存对齐的边界填充字节的作用内存对齐的原理结构体中的内存对齐结构体的定义和使用结构体中成…...

C++ Primer第五版_第七章习题答案(41~50)

文章目录练习7.411、头文件2、源文件3、主函数练习7.42练习7.43练习7.44练习7.45练习7.46练习7.47练习7.48练习7.49练习7.50练习7.41 使用委托构造函数重新编写你的Sales_data 类,给每个构造函数体添加一条语句,令其一旦执行就打印一条信息。用各种可能的…...

python玄阶斗技--NumPy入门

目录 一.NumPy介绍 二.创建数组 1.一维数组创建 2.二维数组创建 3.zeros函数 4.ones函数 5.empty函数 6.arange函数 三.NumPy的数学操作 1.基本运算 2.矩阵运算 3.ndarray类的方法 四.数组堆叠 五.数组分隔 一.NumPy介绍 在这里对NumPy的介绍我不想扯太多&#xf…...

VR黑科技丨远离拥挤,VR直播开启沉浸式赏樱新姿势

春光兮婉转,珞樱兮盛绽,又是一年樱花季,全国各地大部分地区的樱花进入盛花期,尤其是武汉,东湖樱园踏青赏花的游人如织、摩肩擦踵,勾勒一幅“人人人人人人人花人人人人人”的盛景。 为了一睹樱花“芳容”&am…...

ts的一些用法

1.交叉类型 & ---多个类型属性的集合 1.1类型别名实现 type Person {name:string} type Children Person & {age:number} let newPerson:Children {// name:hahah,name:hhaah,age:18 } 1.2 接口类型实现 interface Inter1{name:string } interface Inter2{name:…...

云计算面试总结

shell脚本对日志进行备份 shell 对日志备份 #!/bin/bash if [ -d /log/bak/ ] || mkdir -p /log/bak/ thentar Pcf /log/bak/log_$(date %Y%m%d)$(date %H%M%S).tar.gz /var/log/*.logecho "干完!可以约会啦" fi存在的问题: 说的太快&a…...

(DP)买不到的数目【蓝桥杯】(裴蜀定理)

买不到的数目 小明开了一家糖果店。 他别出心裁:把水果糖包成4颗一包和7颗一包的两种。 糖果不能拆包卖。 小朋友来买糖的时候,他就用这两种包装来组合。 当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。 你可以用计算机测试一下&#…...

Docker使用DockerFile部署Go项目

Docker使用DockerFile部署Go项目1. 文章说明2. Go项目打包到Linux2.1 学习链接与知识点2.2. 打包生成 main 文件2.3 Docker部署Go项目1. 文章说明 目的:将打包生成的 main 文件,在Docker里面,使用Dockerfile文件,生成镜像与容器&…...

C++ Primer第五版_第七章习题答案(31~40)

文章目录练习7.31练习7.32练习7.33练习7.34练习7.35练习7.36练习7.37练习7.38练习7.29练习7.40练习7.31 定义一对类X 和Y,其中X 包含一个指向 Y 的指针,而Y 包含一个类型为 X 的对象。 class Y;class X{Y* y nullptr; };class Y{X x; };练习7.32 定义你…...

基于springboot实现学生成绩管理系统【源码+论文】分享

基于springboot实现学生成绩管理系统演示开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&…...

Linux diff 命令

Linux diff 命令用于比较文件的差异。 diff 以逐行的方式&#xff0c;比较文本文件的异同处。如果指定要比较目录&#xff0c;则 diff 会比较目录中相同文件名的文件&#xff0c;但不会比较其中子目录。 语法 diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数&g…...

unity动画状态机

介绍&#xff1a; 动画状态机&#xff08;Animation State Machine&#xff09;是Unity中用于控制动画状态转换的工具&#xff0c;它由多个状态&#xff08;State&#xff09;和转换&#xff08;Transition&#xff09;组成&#xff0c;可以通过状态转换来控制动画的播放行为。…...

溯源(五)之攻击源的获取

溯源&#xff08;一&#xff09;之溯源的概念与意义 溯源&#xff08;二&#xff09;之 windows-还原攻击路径 溯源&#xff08;三&#xff09;之Linux-入侵排查 溯源&#xff08;四&#xff09;之流量分析-Wireshark使用 溯源整体流程的思维导图 攻击源的获取 1、获取哪些数…...

【redis】redis淘汰策略

一、说明 1.redis key没有设置过期时间被redis主动删除了 2.当redis已用内存超过maxmemory限定时&#xff0c;触发主动清理策略 3.主动清理策略在redis4.0之前一共实现了6种内存淘汰策略&#xff0c;在4.0之后&#xff0c;增加了2种&#xff0c;总共8种 二、淘汰策略 2.1 针对…...

指针和数组(二)

目录 指针和数组 数组名和指针的区别 多维数组 数组指针 语法 作用 内存大小 自增运算 【】运算 指针和数组 结论&#xff1a;数组的本质就是指针。数组的【】运算同样可以用指针来运算 证明 C代码 int array[5];int* ptr{ &array[0] };*ptr 5;array[0] 5;arr…...

Linux WIFI 驱动实验

目录WIFI 驱动添加与编译向Linux 内核添加WIFI 驱动配置Linux 内核编译WIFI 驱动驱动加载测试wireless tools 工具移植与测试wireless tools 移植wireless tools 工具测试wpa_supplicant 移植openssl 移植libnl 库移植wpa_supplicant 移植WIFI 联网测试RTL8188 USB WIFI 联网测…...

UART驱动情景分析-write

一、write过程分析 App写&#xff1a; 使用行规程来写数据最终存入uart_state->xmit的buffer里 硬件发送&#xff1a; 使用硬件驱动中uart_ops->start_tx开始发送具体的发送方式有两种&#xff1a;通过DMA、通过中断 中断方式&#xff1a; 方法1&#xff1a;直接使能tx …...

Metasploit入门到高级【第四章】

来自公粽号&#xff1a;Kali与编程预计更新第一章&#xff1a;Metasploit 简介 Metasploit 是什么Metasploit 的历史和发展Metasploit 的组成部分 第二章&#xff1a;Kali Linux 入门 Kali Linux 简介Kali Linux 安装和配置常用命令和工具介绍 第三章&#xff1a;Metasploi…...

java 继承super

在java继承中&#xff0c;如果子类继承父类&#xff0c;在子类中要给用构造器给父类的属性赋值&#xff0c;需要用到 super 举例&#xff0c;Son类继承Father 类&#xff0c;便于理解 在 new Son(String name, int age) 传入name&#xff0c;和age的值 将会调用Son这个构造器…...

Java学习笔记——多态

2.1 概述 引入 多态是继封装、继承之后&#xff0c;面向对象的第三大特征。 生活中&#xff0c;比如跑的动作&#xff0c;小猫&#xff0c;小狗和大象&#xff0c;跑起来都是不一样的。再比如飞的动作&#xff0c;昆虫、鸟类和飞机&#xff0c;飞起来是不一样的。可见&#x…...