Kubernetes基础(七)-Pod资源Limits与Requests

在k8s的集群环境中,资源的合理分配和使用非常重要。毕竟容器化要解决的问题之一就是资源的充分利用。在集群中分配资源的时候就不得不提到Limits和Requests。

1 Namespace配额

Kubernetes 是允许管理员在命名空间中指定资源 Requests 和 Limits 的,这一特性对于资源管理限制非常有用。但它目前还存在一定局限:如果管理员在命名空间中设置了 CPU Requests 配额,那么所有 Pod 也要在其定义中设置 CPU Requests,否则就无法被调配资源。

apiVersion: v1
kind: ResourceQuota
metadata:name: mem-cpu-example
spec:hard:requests.cpu: 4requests.memory: 4Gilimits.cpu: 6limits.memory: 6Gi

这是一个简单的ResourceQuota类型,也就是针对Namespace的配额。它会针对Namespace做如下限额:

  • 所有 CPU Requests 的总和不能超过 4 个内核
  • 所有 RAM Requests 的总和不能超过 4GiB
  • 所有 CPU Limits 的总和不能超过 6个内核
  • 所有 RAM Limits 的总和不能超过 6GiB

2 针对Pod的Request和Limit

刚上述提到可以针对Pod进行资源限额,同样也可以设置Pod申请资源的Request和Limit。k8s中会将一个CPU分成1000个shares,这和Cgroup中分成1024略有差异。正常情况下requests的数值应该小于limits,那么该Pod获得的资源可以分为两部分:

  • 完全可靠的资源,资源量大小等于requests值
  • 不可靠的资源,资源量最大等于limits和requests的差额,这份不可靠的资源能够申请到多少,取决于当时主机上容器可用资源的余量。

如下例:

kind: Deployment
apiVersion: extensions/v1beta1
metadata:name: redislabels:name: redisapp: redis-app
spec:replicas: 2selector:matchLabels:name: redisrole: redisdbapp: redis-apptemplate:spec:containers:- name: redisimage: redis:5.0.3-alpineresources:limits:memory: 500Micpu: 1requests:memory: 250Micpu: 500m- name: busyboximage: busybox:1.28resources:limits:memory: 100Micpu: 100mrequests:memory: 50Micpu: 50m
  • Pod 中两个容器公共的有效 Request 是 300MiB 的内存和 550 毫核(millicore)的 CPU。我们需要一个具有足够可用可分配空间的节点来调度 Pod。
  • 如果 Redis 容器尝试分配超过 500MB 的 RAM,就会被 OOM-killer。
  • 如果 Redis 容器尝试每 100ms 使用 100ms 以上的 CPU,那么 Redis 就会受到 CPU 限制(如果一共有 4 个内核,可用时间为 400ms/100ms),从而导致性能下降
  • 如果 busybox 容器尝试分配 100MB 以上的 RAM,也会引起 OOM
  • 如果 busybox 容器尝试每 100ms 使用 10ms 以上的 CPU,也会使 CPU 受到限制,从而导致性能下降

需要注意的是,Kubernetes 限制的是每个容器,而不是每个 Pod。其他 CPU 指标,如共享 CPU 资源使用情况,只对分配有参考价值,所以如果遇到了性能上的问题,建议不要在这些指标上浪费时间。


3 Requests等于Limits 的时候

一般情况,设置的Requests值一般都要小于Limits,但是也存在特殊情况。涉及到一个概念就是服务质量等级

  • Guaranteed(完全可靠的):Limits==requests,或者只设置了Limits,此时默认requests等于limits
  • Burstable(弹性波动、较可靠的):分为两种情况:
    • Pod中一部分容器在一种或多种资源类型中配置了requests和limits;
    • Pod中一部分容器未定义资源配置(requests和limits都未配置)
  • BestEffort(尽力而为、不太可靠的):Pod所有中所有容器都未定义requests和limits

注意:在容器未定义limits时,limits值默认是节点资源容量的上限。

另外当分配CPU的requests和limits相等的时候,就是指该容器独占CPU,需要在kubelet服务的配置中增加--cpu-manager-policy=static

4 可压缩资源和不可压缩资源

上文提到,在容器可使用的资源有CPU和内存。所以拓展一下k8s集群中的可压缩资源和不可压缩资源概念。
在k8s中,CPU就是可压缩资源。空闲的CPU资源会按照容器的requests值得比例进行分配,举例说明:

容器A requests1 limits 10;容器B requests2 limits 8,假如一开始该节点上可用CPU为3,那么两个容器恰好得到各自requests的量。此时节点又释放了1.5CPU,A和B都需要更多CPU资源,那么这1.5CPU就会按照A和B的requests量按比例分配,最后A得到1.5CPU,B得到3CPU。

目前k8s支持的不可压缩资源是内存。Pod中可以得到requests的内存量,如果Pod使用小于该值,那么Pod正常运行;如果Pod使用超过了该值极=就有可能被k8s杀掉。比如,Pod A使用了大于requests但是小于limits的内存,此时Pod B使用了小于requests的内存,但是Pod B中的程序突然压力增大,向k8s请求更多的但是不超过自己requests的内存资源,而节点上已没有空闲内存资源,这时候k8s就可能会直接kill Pod A。

4 选择可靠的Requests和Limits

具备一定 Kubernetes 经验的人都知道正确设置 Request 和 Limit 对于应用程序和集群的性能的重要性。

理想情况下,Pod 请求多少资源,它就用多少资源,但在现实场景下,资源使用是不断变化的,而且它的变化没有规律,不可预测。

如果 Pod 的资源使用量远低于请求量,那会导致资源浪费;如果资源使用量高于请求量,那就会使节点出现性能问题。因此在实际操作中,可以把 Request 值上下浮动 25% 作为一个良性参考标准。

而关于 Limit,设置合理的 Limit 数值其实需要尝试,因为它主要取决于应用程序的性质、需求模型、对错误的容忍度以及许多其他因素,没有固定答案。

另一件需要考虑的事是在节点上允许的 Limits 过量使用。


这些 Limits 由用户执行,因为 Kubernetes 没有关于超额使用的自动化机制。

另外需要考虑的事情是在节点上允许的Limits过量使用。

 这些Limits是由用户执行,因为kubernetes没有关于超额使用的自动化机制。

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

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

相关文章

自然语言处理中的文本聚类:揭示模式和见解

一、介绍 在自然语言处理(NLP)领域,文本聚类是一种基本且通用的技术,在信息检索、推荐系统、内容组织和情感分析等各种应用中发挥着关键作用。文本聚类是将相似文档或文本片段分组为簇或类别的过程。这项技术使我们能够发现隐藏的…

人工智能与养老:技术助力银色产业的崛起

人工智能与养老:技术助力银色产业的崛起 随着人口老龄化的加速推进,养老问题成为了全球关注的热点。人工智能(AI)技术的迅猛发展,为养老领域注入了新的活力。本文将探讨人工智能在养老领域的应用、关键挑战以及前景展望…

SpringCloudAlibaba——Sentinel

Sentinel也就是我们之前的Hystrix,而且比Hystrix功能更加的强大。Sentinel是分布式系统的流量防卫兵,以流量为切入点,从流量控制、流量路由、熔断降级等多个维度保护服务的稳定性。 Sentinel采用的是懒加载,这个接口被访问一次&a…

C语言----静态链接库和动态链接库

在前面的文章中讲到可执行程序的生成需要经过预处理,编译,汇编和链接四个步骤,链接阶段是链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。 需要解读一下库文件,我们可以将库文件等价为压缩包文件&…

基于springboot+vue的校园闲置物品交易系统

运行环境 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven 项目介绍 本文从管…

Kafka中遇到的错误:

1、原因:kafka是一个去中心化结果的,所以在启动Kafka的时候,每一个节点上都需要启动。 启动的命令:kafka-server-start.sh -daemon /usr/local/soft/kafka_2.11-1.0.0/config/server.properties

AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀

文章目录 一、ChatGPT简介二、ChatGPT在产品经理工作中的应用1. 快速获取用户反馈2. 智能分析竞品3. 智能推荐产品4.分析市场趋势5.优化产品功能 三、总结与展望《AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀》亮点内容简介目录作者简介获取方式 随着人工智能…

Windows系统安装2个版本得的MySQL

一、MySQL官网下载对应版本的zip文件 最新版本8.0.34下载链接:https://dev.mysql.com/downloads/mysql/ MySQL 5.7下载链接:https://downloads.mysql.com/archives/community/ 二、将下载到的压缩包解压到指定目录 使用解压工具将下载到的压缩包解…

设计模式之中介者模式

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概5000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

设计模式JAVA

1 创建型 如何合理的创建对象? 1.1 单例模式 字面意思就是只能创建一个对象实例时使用。 例如,Windows中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等…

Java学习 10.Java-数组习题

一、创建一个 int 类型的数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100 代码实现 public static void main(String[] args) {int[] arrnew int[100];for (int i 0; i < arr.length; i) {arr[i]i1;}System.out.println(Arrays.toString(arr));} 运行结果 二、改变…

k8s-docker二进制(1.28)的搭建

二进制文件-docker方式 1、准备的服务器 角色ip组件k8s-master1192.168.11.111kube-apiserver,kube-controller-manager,kube-scheduler,etcdk8s-master2192.168.11.112kube-apiserver,kube-controller-manager,kube-scheduler,etcdk8s-node1192.168.11.113kubelet,kube-prox…