欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~

作者:腾讯云容器服务团队

Kubernetes是一个容器集群管理平台,Kubernetes需要统计整体平台的资源使用情况,合理地将资源分配给容器使用,并且要保证容器生命周期内有足够的资源来保证其运行。 同时,如果资源发放是独占的,即资源已发放给了个容器,同样的资源不会发放给另外一个容器,对于空闲的容器来说占用着没有使用的资源比如CPU是非常浪费的,Kubernetes需要考虑如何在优先度和公平性的前提下提高资源的利用率。为了实现资源被有效调度和分配同时提高资源的利用率,Kubernetes采用Request和Limit两种限制类型来对资源进行分配。

一、kubenerters中Request和Limit限制方式说明

Request: 容器使用的最小资源需求,作为容器调度时资源分配的判断依赖。只有当节点上可分配资源量>=容器资源请求数时才允许将容器调度到该节点。但Request参数不限制容器的最大可使用资源。

Limit:容器能使用资源的资源的最大值,设置为0表示使用资源无上限。

Request能够保证Pod有足够的资源来运行,而Limit则是防止某个Pod无限制地使用资源,导致其他Pod崩溃。两者之间必须满足关系: 0<=Request<=Limit<=Infinity (如果Limit为0表示不对资源进行限制,这时可以小于Request)

在腾讯云容器服务(CCS)中,可以在创建服务,在容器编辑栏中点击显示高级设置,在高级设置中进行CPU和Memory的Request和Limit设置。目前CPU支持设置Request和Limit,用户可以根据业务的特点动态的调整Request和Limit的比例关系。Memory目前只支持设置Request,Limit必须强制等于Request,这样确保容器不会因为内存的使用量超过了Request但没有超过Limit的情况下被意外的Kill掉。

二、kubenerters中Request和Limit使用示例

一个简单的示例说明Request和Limit的作用,测试集群包括一个4U4G的节点。已经部署的两个Pod(1,2),每个Pod的资源设置为(CPU Requst,CPU Limit,Memory Requst, Memory Limit)= (1U, 2U, 1G,1G).
节点上CPU和内存的资源使用情况如下图所示:

已经分配的CPU资源为:1U(分配Pod1)+1U(分配Pod2)=2U,剩余可以分配的CPU资源为2U

已经分配的内存资源为:1G(分配Pod1)+1G(分配Pod2)=2G,剩余可以分配的内存资源为2G

所以该节点可以再部署一个(CPU Requst, Memory Requst)=(2U,2G)的Pod部署,或者部署2个(CPU Requst, Memory Requst)=(1U,1G)的Pod部署

在资源限制方面,每个Pod1和Pod2使用资源的上限为(2U,1G),即在资源空闲的情况下,Pod使用CPU的量最大能达到2U,使用内存的最大量为1G。从CPU资源的角度,对于资源使用上线为2U的Pod,通过设置Request为1U,实现了2倍数量的Pod的部署,提高了资源的使用效率。

另外一个复杂一点的例子来进一步说明Request和Limit的作用,主要说明Request和Limit都为0的Pod对提高资源使用率的作用。测试集群仍然包含有一个4U4G的Pod。集群中已经部署了四个Pod(1~4),每个Pod的资源设置为(CPU Requst,CPU Limit,Memory Requst, Memory Limit)= (1U, 2U, 512M,512M)。

此时节点上CPU和内存的资源使用情况如下图所示:

此时按照Request的需求,已经没有可以供分配的CPU资源。但由于Pod1~4业务负载比较低,造成节点上CPU使用率较低,造成了资源的浪费。这的时候可以通过将Request设置为0来实现对资源使用率的进一步提高。在此节点上部署4个资源限制为(CPU Requst,CPU Limit,Memory Requst, Memory Limit)= (0U, 0U, 512M,512M)。资源的使用情况如下图所示:

Pod(5~8)能够在Pod(1~4)空闲时,使用节点上剩余的CPU资源,从而进一步提高资源的使用率。

三、kubenerters中资源的抢占

Kubernetes中资源通过Request和Limit的设置,能够实现容器对资源的更高效的使用。在如果多个容器同时对资源进行充分利用,资源使用尽量的接近Limit。这个时候Node节点上的资源总量要小于所有Pod中Limit的总会,就会发生资源抢占。

对于资源抢占的情况,Kubernetes根据资源能不能进行伸缩进行分类,分为可压缩资源和不可以压缩资源。CPU资源--是现在支持的一种可压缩资源。内存资源和磁盘资源为现在支持的不可压缩资源。

可压缩资源的抢占策略---按照Requst的比值进行分配

例如在示例一种,假设在部署了Pod(1,2)的基础上,又部署了资源限制和Pod1相同的两个容器Pod(3,4)。这个时候,节点上的资源模型为。

假设四个Pod同时负载变高,CPU使用量超过1U,这个时候每个Pod将会按照各自的Request设置按比例分占CPU调度的时间片。在示例中,由于4个Pod设置的Request都为1U,发生资源抢占时,每个Pod分到的CPU时间片为1U/(1U×4),实际占用的CPU核数为1U。在抢占发生时,Limit的值对CPU时间片的分配为影响,在本例中如果条件容器Limit值的设置,抢占情况下CPU分配的比例保持不变。

不可压缩资源的抢占策略---按照优先级的不同,进行Pod的驱逐

对于不可压缩资源,如果发生资源抢占,则会按照优先级的高低进行Pod的驱逐。驱逐的策略为: 优先驱逐Request=Limit=0的Pod,其次驱逐0<Request<Limit<Infinity (Limit为0的情况也包括在内)。 0<Request==Limit的Pod的会被保留,除非出现删除其他Pod后,节点上剩余资源仍然没有达到Kubernetes需要的剩余资源的需求。

由于对于不可压缩资源,发生抢占的情况会出Pod被意外Kill掉的情况,所以建议对于不可以压缩资源(Memory,Disk)的设置成0<Request==Limit。

针对内存抢占,本文进行了一次小的测试,示例中依次部署了Pod(1~3)单个Pod。节点中资源的示例图为:

步骤1: 部署Pod1,资源参数为(CPU Requst,CPU Limit,Memory Requst, Memory Limit)= (2U, 2U, 2G,2G),此时Pod1中进程使用1.9G内存,Pod1运行依然正常。

步骤2:部署Pod2,资源参数为(CPU Requst,CPU Limit,Memory Requst, Memory Limit)= (1U, 1U, 1G,2G),此时Pod2中进程使用0.9G内存,程序运行正常。超过1G,小于2G时程序运行正常,但超过2G程序异常。

步骤3: 部署Pod3,资源参数为(CPU Requst,CPU Limit,Memory Requst, Memory Limit)= (1U, 1U, 0G,0)。此时保持Pod1中进程使用内存为1.9G,Pod2中内存使用为0.9G,pod3抢占内存,抢占内存大小为2G。这时,Pod3最先会出现因内存不足异常的情况。同时Pod2有时也会出现内存不足异常的情况。但Pod1一直能够正常运行

步骤4:修改Pod2的参数为(CPU Requst,CPU Limit,Memory Requst, Memory Limit)= (1U, 1U, 1G,1G),仍然保持步骤3中资源的使用量。这时Pod3仍然最先出现内存不足而异常的情况,但Pod1和Pod2一直运行正常。

更多关于不可压缩资源抢占时的资源回收策略,可以参考:Kubernetes 针对资源紧缺处理方式的配置

相关阅读

资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解

ELK 集群,腾讯云上的日志监控不用愁

开源助力腾讯云容器服务

此文已由作者授权腾讯云技术社区发布,转载请注明文章出处

原文链接:https://cloud.tencent.com/community/article/905142

老司机和你深聊 Kubenertes 资源分配之 Request 和 Limit 解析的更多相关文章

  1. Kubenertes资源分配之Request和Limit解析

    收录待用,修改转载已取得腾讯云授权 Kubernetes是一个容器集群管理平台,Kubernetes需要统计整体平台的资源使用情况,合理地将资源分配给容器使用,并且要保证容器生命周期内有足够的资源来保 ...

  2. 老司机实战Windows Server Docker:2 docker化现有iis应用的正确姿势

    前言 上一篇老司机实战Windows Server Docker:1 初体验之各种填坑介绍了安装docker服务过程中的一些小坑.这一篇,我们来填一些稍大一些的坑:如何docker化一个现有的iis应 ...

  3. 老司机的应用级监控——spring actuator(转)

    转自:https://www.jianshu.com/p/c043d3c71f47 什么是spring actuator? 这是一个研发老司机与运维同学都会非常喜欢的东西,随着点融集团的扩张,点融网的 ...

  4. 老司机的应用级监控——spring?actuator

    http://mt.sohu.com/20160824/n465783118.shtml ************************************************ 1什么是sp ...

  5. 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透

    前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...

  6. [BZOJ4200][Noi2015]小园丁与老司机

    4200: [Noi2015]小园丁与老司机 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 106  Solved ...

  7. 老司机学新平台 - Xamarin开发之我的第一个MvvmCross跨平台插件:SimpleAudioPlayer

    大家好,老司机学Xamarin系列又来啦!上一篇MvvmCross插件精选文末提到,Xamarin平台下,一直没找到一个可用的跨平台AudioPlayer插件.那就自力更生,让我们就自己来写一个吧! ...

  8. 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选

    在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...

  9. 老司机学新平台 - Xamarin开发环境及开发框架初探

    随着被微软收购,最近一年间,Xamarin的火爆程度与日俱增.免费.更好的VS2015集成.更好的模拟器,甚至,在windows上运行和调试iOS平台程序,让我这样接触了十几年.NET平台的老司机,即 ...

随机推荐

  1. tp框架---View视图层---模板继承(举例说明)

    当我们做动态页面时,我们会发现一个网站的头部和尾部是相同的,那么我们如何用tp框架来做模板呢 ? 先看一下注意事项: (1)每个区块由<block></block>标签组成 ( ...

  2. tp框架---验证码详解

    很多注册登录界面都会验证码,用tp如何实现验证码的功能呢? 在tp中:Think\Verify类可以支持验证码的生成和验证功能. 首先,看一下逻辑: (1)如何生成?------ 先做Yanzheng ...

  3. 推荐系统那点事 —— 基于Spark MLlib的特征选择

    在机器学习中,一般都会按照下面几个步骤:特征提取.数据预处理.特征选择.模型训练.检验优化.那么特征的选择就很关键了,一般模型最后效果的好坏往往都是跟特征的选择有关系的,因为模型本身的参数并没有太多优 ...

  4. 集合用法笔记-Map用法

    一.Map遍历 Map<String, String> map = new HashMap<String, String>(); map.put("1", ...

  5. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...

  6. Python怎么样入门?Python基础入门教程

    给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

  7. MySQL巧用自定义函数进行查询优化

    用户自定义变量是一个很容易被遗忘的MySQL特性,但是用的好,发挥其潜力,在很多场景都可以写出非常高效的查询语句. 一. 实现一个按照actorid排序的列 mysql; Query OK, rows ...

  8. Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors

    承接前文Spring源码情操陶冶-AbstractApplicationContext#invokeBeanFactoryPostProcessors 瞧瞧官方注释 /** * Instantiate ...

  9. Java以及PHP安装环境

    开学前想把web的知识系统掌握一下,跟着极客学院学html5. 安装了intellij idead.xampp.jdk.eclipse for php. 下面列举一些安装过程中会出现的问题,以及解决. ...

  10. python3网络编程之socket

    文章内容: socket介绍 socket参数介绍 流程描述 socket对象内建方法 基本socket实例 通过socket实现简单ssh并实现接收大数据 socket介绍 socket又称&quo ...