k8s资源配额限制

这篇具有很好参考价值的文章主要介绍了k8s资源配额限制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基础了解

1.1 资源说明

为什么会有资源配额管理?

可以提高集群稳定性,确保指定的资源对象在任何时候都不会超量占用系统物理资源,避免业务进程在设计或实现上的缺陷导致整个系统运行紊乱甚至意外宕机。

资源配额管理维度解释?

1. 容器级别,定义每个Pod上资源配额相关的参数,比如CPU/Memory、Request/Limit;
2. Pod级别,自动为每个没有定义资源配额的Pod添加资源配额模板,比如LimitRanger。
3. Namespace级别,从总量上限制一个租户(应用)所能使用的资源配额,比如ResourceQuota,包括资源有:Pod数量、Replication Controller数量、Service数量、ResourceQuota数量、Secret数量和可持有的PV数量。

资源配额参数有什么?

程序所使用的CPU与Memory是一个动态的量,跟负载密切相关,当负载增加时,CPU和Memory的使用量也会增加。
spec.container[].resources.requests.cpu:容器初始要求的CPU数量。
spec.container[].resources.limits.cpu:容器所能使用的最大CPU数量。
spec.container[].resources.requests.memory:容器初始要求的内存数量
spec.container[].resources.limits.memory:容器所能使用的最大内存数量。

1.1 资源计算

Pod的Requests或Limits指该Pod中所有容器的Requests或Limits的总和,若Pod中没有设置Requests或Limits的容器,则该项的值被当作0或者按照集群配置的默认值来计算。
  • 计算CPU

CPU的Requests和Limits是通过CPU数(cpus)来度量的。
CPU的资源值是绝对值,而不是相对值,比如0.1CPU在单核或多核机器上是一样的,都严格等于0.1 CPU core。

  • 计算Memory

内存的Requests和Limits计量单位是字节数。使用整数或者定点整数加上国际单位制来表示内存值。
国际单位制包括十进制的E、P、T、G、M、K、m,或二进制的Ei、Pi、Ti、Gi、Mi、Ki。
KiB与MiB是以二进制表示的字节单位,常见的KB与MB则是以十进制表示的字节单位,比如: 1 KB=1000 Bytes=8000Bits; 1 KiB=2^10 Bytes=1024 Bytes=8192 Bits。

  • 注意事项

计算资源单位大小写敏感,m表示千分之一单位,M表示十进制的1000,二者的含义不同。

1.2 调度机制

基于Requests和Limits的Pod调度机制:

调度器在调度时,首先要确保调度后该节点上所有Pod的CPU和内存的Requests总和,不超过该节点能提供给Pod使用的CPU和Memory的最大容量值。

例如,某个节点上的CPU资源充足,而内存为4GB,其中3GB可以运行Pod,而某Pod的Memory Requests为1GB、Limits为2GB,那么在这个节点上最多可以运行3个这样的Pod。

Requests和Limits的背后机制:

>> kubelet在启动Pod的某个容器时,会将容器的Requests和Limits值转化为相应的容器启动参数传递给容器执行器(Docker或者rkt)。

>> 若容器的执行环境是Docker,那么容器的4个参数传递给Docker的过程如下:
	1. spec.container[].resources.requests.cpu:参数值会被转化为core数(比如配置的100m会转化为0.1),然后乘以1024,再将这个结果作为–cpu-shares参数的值传递给docker run命令。
	2. spec.container[].resources.limits.cpu:参数值会被转化为millicore数(比如配置的1被转化为1000,配置的100m被转化为100),将此值乘以100000,再除以1000,然后将结果值作为–cpu-quota参数的值传递给docker run命令。
	3. spec.container[].resources.requests.memory:参数值只提供给Kubernetes调度器作为调度和管理的依据,不会作为任何参数传递给Docker。
	4. spec.container[].resources.limits.memory:参数值会被转化为单位为Bytes的整数,值作为–memory参数传递给docker run命令。

常见问题分析:

1. 若Pod状态为Pending,错误信息为FailedScheduling。若调度器在集群中找不到合适的节点来运行Pod,那么这个Pod会一直处于未调度状态,直到调度器找到合适的节点为止。每次调度器尝试调度失败时,Kubernetes都会产生一个事件。
2. 容器被强行终止(Terminated)。如果容器使用的资源超过了它配置的Limits,那么该容器可能被强制终止。我们可以通过kubectl describe pod命令来确认容器是否因为这个原因被终止

1.3 服务质量等级

  • Pod的三种QoS级别:
  • Guaranteed(完全可靠的):如果Pod中的所有容器对所有资源类型都定义了Limits和Requests,并且所有容器的Limits值都和Requests值相等(且都不为0),那么该Pod的QoS级别就是Guaranteed。未定义Requests值,所以其默认等于Limits值。 其中定义的Requests与Limits的值完全相同。
  • BestEffort(尽力而为、不太可靠的):如果Pod中所有容器都未定义资源配置(Requests和Limits都未定义),那么该Pod的QoS级别就是BestEffort。
  • Burstable(弹性波动、较可靠的):当一个Pod既不为Guaranteed级别,也不为BestEffort级别时,该Pod的QoS级别就是Burstable。Pod中的一部分容器在一种或多种资源类型的资源配置中定义了Requests值和Limits值(都不为0),且Requests值小于Limits值。Pod中的一部分容器未定义资源配置(Requests和Limits都未定义)。
  • 工作特点:
  • BestEffort:Pod的优先级最低,在这类Pod中运行的进程会在系统内存紧缺时被第一优先“杀掉”。当然,从另一个角度来看,BestEffortPod由于没有设置资源Limits,所以在资源充足时,它们可以充分使用所有闲置资源。
  • Burstable:Pod的优先级居中,这类Pod在初始时会被分配较少的可靠资源,但可以按需申请更多的资源。当然,如果整个系统内存紧缺,又没有BestEffort容器可以被杀掉以释放资源,那么这类Pod中的进程可能被“杀掉”。
  • Guaranteed:Pod的优先级最高,而且一般情况下这类Pod只要不超过其资源Limits的限制就不会被“杀掉”。当然,如果整个系统内存紧缺,又没有其他更低优先级的容器可以被“杀掉”以释放资源,那么这类Pod中的进程也可能会被“杀掉”。

二、资源配额 ResourceQuota

为何会有资源配额?

当多个团队、多个用户共享使用K8s集群时,会出现不均匀资源使用,默认情况下先到先得,这时可以通过ResourceQuota来对命名空间资源使用总量做限制,从而解决这个问题。
  • 使用流程

k8s管理员为每个命名空间创建一个或多个ResourceQuota对象,定义资源使用总量,K8s会跟踪命名空间资源使用情况,当超过定义的资源配额会返回拒绝。

  • 注意事项

如果在集群中新添加了节点,资源配额不会自动更新,该资源配额所对应的命名空间中的对象也不能自动增加资源上限。

2.1 支持的限制资源

  • 资源限制对象

容器资源请求值(requests):命名空间下的所有pod申请资源时设置的requests总和不能超过这个值。
容器资源限制值(limits):命名空间下的所有pod申请资源时设置的limits总和不能超过这个值。文章来源地址https://www.toymoban.com/news/detail-546160.html

  • 注意事项
  1. CPU单位:可以写m也可以写浮点数,例如0.5=500m,1=1000m;
  2. requests必须小于limits,建议一个理论值:requests值小于limits的20%-30%,一般是limits的70%;
  3. limits尽量不要超过所分配宿主机物理配置的80%,否则没有限制意义;
  4. requests只是一个预留性质,并非实际的占用,用于k8s合理的分配资源(每个节点都有可分配的资源,k8s抽象的将这些节点资源统一分配)。比如requests分配1核1G,在满足的节点上创建完容器后实际资源可能只有0.5C1G;
  5. requests会影响pod调度,k8s只能将pod分配到能满足该requests值的节点上;
  6. ResourceQuota功能是一个准入控制插件,默认已经启用;

到了这里,关于k8s资源配额限制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生Kubernetes:K8S配置资源管理

    目录 一、理论 1.Secret 2.Secret创建 3.Secret使用 4.Configmap 5.Configmap创建 6.Configmap使用 二、实验 1.Secret创建 2.Secret使用 3.Configmap创建 4.Configmap使用 三、问题 1.变量引用生成资源报错 2.查看pod日志失败 3.创建configmap报错 4.YAML创建configmap报错 5. 生成资源报错 6.文件挂载pod报错Error 四

    2024年02月07日
    浏览(62)
  • K8S(五)—命名空间与资源配额

    Kubernetes(K8s)的命名空间(Namespace)是用于在集群中对资源进行逻辑隔离和分类的一种机制。它可以将集群内的资源划分为不同的组,并且每个命名空间内的资源都有一个唯一的名称。命名空间可以帮助团队将不同的项目、环境或应用程序从彼此中隔离开来,以及更好地管理

    2024年02月04日
    浏览(40)
  • kubernetes(k8s)为容器和 Pod 分配内存资源

    展示如何将内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存。 创建新的命名空间 编辑yaml文件 配置文件的 args 部分提供了容器启动时的参数。 “–vm-bytes”, “150M” 参数告知容器尝试分配 15

    2024年02月15日
    浏览(54)
  • K8S 1.27 动态调整容器CPU和内存资源限制,无需重启应用程序

    如果您在部署Pod时指定了 CPU 和内存资源,更改资源大小需要重新启动 Pod。到目前为止,重启对于正在运行工的作负载是一种破坏性操作。 Kubernetes 1.27 中的 alpha 功能发布。其中一项能够自动调整 Pod 的 CPU 和内存限制的大小,只需修补正在运行的 Pod 定义即可更改它们,而无

    2024年02月07日
    浏览(45)
  • K8s(一)Pod资源——Pod介绍、创建Pod、Pod简单资源配额

    目录 Pod概述 pod网络 pod存储 pod和容器对比 创建pod的方式 pod运行方式分类 Pod的创建 Pod的创建过程 通过kubectl run来创建pod 通过yaml文件创建,yaml文件简单写法 Pod简单操作 Pod的标签labels Pod的资源配额resource 测试 Kubernetes Pod | Kubernetes Pod是Kubernetes中的最小调度单元,k8s都是以p

    2024年01月18日
    浏览(58)
  • 【云原生 | Kubernetes 系列】— 部署K8S 1.28版本集群部署(基于Containerd容器运行)

    主机名 IP地址 备注 k8s-master01 192.168.0.109 master k8s-node1 192.168.0.108 node1 k8s-node2 192.168.0.107 node1 k8s-node3 192.168.0.105 node1 1、主机配置 2、升级内核 3、配置内核转发以及过滤 4、安装ipset ipvsadm,IPVS(IP Virtual Server)是一个用于负载均衡的 Linux 内核模块,它可以用来替代 kube-proxy 默认的

    2024年02月20日
    浏览(77)
  • 云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行

    Kubernetes是一个开源的, 用于编排云平台中多个主机上的容器化的应用,目标是让部署容器化的应用能简单并且高效的使用, 提供了应用部署,规划,更新,维护的一种机制 。其核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着,管理员可

    2024年02月08日
    浏览(82)
  • 【云原生】kubernetes中容器的资源限制

    目录 1 metrics-server 2 指定内存请求和限制 3 指定 CPU 请求和限制 资源限制 在k8s中对于容器资源限制主要分为以下两类: 内存资源限制: 内存 请求 (request)和内存 限制 (limit)分配给一个容器。 我们保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存。 官网参

    2024年02月14日
    浏览(47)
  • 【云原生 | Kubernetes 系列】K8s 实战 如何给应用注入数据 II 将pod数据传递给容器

    在上一篇文章中,我们学习了针对容器设置启动时要执行的命令和参数、定义相互依赖的环境变量、为容器设置环境变量,三种设置方式,本篇文章,我们将继续学习数据的传递。 有两种方式可以将 Pod 和 Container 字段传递给运行中的容器: 环境变量 卷文件 这两种呈现 Pod

    2024年01月25日
    浏览(124)
  • 云原生Kubernetes:K8S集群实现容器运行时迁移(docker → containerd) 与 版本升级(v1.23.14 → v1.24.1)

    目录 一、理论 1.K8S集群升级 2.环境 3.升级策略 4.master1节点迁移容器运行时(docker → containerd)  5.master2节点迁移容器运行时(docker → containerd)  6.node1节点容器运行时迁移(docker → containerd)  7.升级集群计划(v1.23.14 → v1.24.1) 8.升级master1节点版本(v1.24.1) 9.升级master2节点版本

    2024年02月03日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包