当前位置: 首页 > 科技观察

老司机给大家讲讲Kubenertes资源分配的Request和Limit解析

时间:2023-03-19 14:05:26 科技观察

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)在腾讯云容器中Service(CCS),可以创建一个服务,在容器编辑栏点击显示高级设置,在高级设置中设置CPU和MemoryRequestandLimit。目前CPU支持设置Request和Limit,用户可以根据业务特性动态调整Request和Limit的比例。Memory目前只支持设置Request,必须强制Limit等于Request,以保证容器不会因为内存使用超过Request但没有超过Limit而被误杀。2.kubenerters中Request和Limit的使用示例一个简单的例子来说明Request和Limit的作用。测试集群包括一个4U4G节点。部署了两个Pod(1,2),每个Pod的资源设置为(CPURequst,CPULimit,MemoryRequst,MemoryLimit)=(1U,2U,1G,1G)。节点上的CPU和内存资源使用情况如下图所示:分配的CPU资源为:1U(分配给Pod1)+1U(分配给Pod2)=2U,剩余可分配的CPU资源为2U。分配的内存资源为:1G(分配给Pod1)+1G(分配给Pod2)=2G,剩余可分配的内存资源为2G,所以本节点可以再部署一个Pod部署,(CPURequst,MemoryRequst)=(2U,2G),ordeploy2(CPURequst,MemoryRequst)=(1U,1G)Poddeployment在资源限制方面,每个Pod1和Pod2使用的资源上限为(2U,1G),即当资源空闲时,Pod占用的CPU量可达2U。最大使用内存量为1G。从CPU资源的角度来看,对于资源使用限制为2U的Pod,通过将Request设置为1U,可以部署两倍数量的Pod,提高资源使用效率。再举一个更复杂的例子来进一步说明Request和Limit的作用,主要是说明Request和Limit都为0的Pod提高资源利用率的作用。测试集群仍然包含一个4U4GPod。集群中已经部署了四个Pod(1~4),每个Pod的资源设置为(CPURequst,CPULimit,MemoryRequst,MemoryLimit)=(1U,2U,512M,512M)。此时节点上CPU和内存的资源使用情况如下图所示:此时根据Request的要求,没有CPU资源可以分配。但由于Pod1~4的业务负载相对较低,节点上的CPU使用率较低,造成资源浪费。此时可以通过将Request设置为0进一步提高资源利用率。在本节点部署4个资源,限制为(CPURequst,CPULimit,MemoryRequst,MemoryLimit)=(0U,0U,512M,512M)。资源利用率如下图所示:Pod(5~8)可以在Pod(1~4)空闲时使用节点上剩余的CPU资源,进一步提高资源利用率。3、kubenerters中资源的抢占通过Request和Limit的设置,Kubernetes中的资源可以实现容器对资源更高效的使用。如果多个容器同时充分利用资源,则资源使用量应尽可能接近Limit。此时Node节点上的资源总量小于所有Pod的总limit,就会发生资源抢占。对于资源抢占,Kubernetes根据资源是否可伸缩,将资源分为可压缩资源和不可压缩资源。CPU资源-是现在支持的可压缩资源。现在支持内存资源和磁盘资源作为不可压缩资源。可压缩资源的抢占策略---按照Requst的比例进行分配。例如,在示例1中,假设在部署Pod(1,2)的基础上,部署了两个与Pod1资源限制相同的容器Pod(3)。,4).此时节点上的资源模型为。假设四个Pod的负载同时变高,CPU占用超过1U。此时各个Pod会按照各自的Request设置,按比例共享CPU调度的时间片。例子中,由于四个Pod设置的Requests都是1U,所以发生资源抢占时,分配给每个Pod的CPU时间片为1U/(1U×4),实际占用的CPU核数为1U。当发生抢占时,Limit的值对CPU时间片的分配没有影响。本例中,如果设置了条件容器的limit值,则抢占情况下的CPU分配比例保持不变。不可压缩资源的抢占策略---根据不同的优先级,Pod被驱逐。对于不可压缩的资源,如果发生资源抢占,Pod将按照优先级逐出。驱逐策略是:优先驱逐Request=Limit=0的Pod,其次驱逐0