云原生之深入解析K8S的请求和限制

一、Kubernetes 限制和请求

  • 在 Kubernetes 中使用容器时,了解涉及的资源是什么以及为何需要它们很重要。有些进程比其它进程需要更多的 CPU 或内存,这很关键,永远不应该让进程饥饿,知道了这一点,那么应该正确配置容器和 Pod,以便充分利用两者。
  • 使用 Kubernetes 时,限制和请求是重要的设置。Kubernetes 将限制定义为容器可以使用的最大资源量,这意味着容器永远不会消耗超过指示的内存量或 CPU 量。另一方面,请求是为容器保留的最低保证资源量。

在这里插入图片描述

  • 来看看如下的这个部署,在 CPU 和内存上为两个不同的容器设置限制和请求:
kind: Deployment
apiVersion: 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
  • 假设正在运行一个集群,例如具有 4 核和 16GB RAM 节点,可以提取出很多信息:

在这里插入图片描述

  • 分析说明:
    • Pod 有效请求 是 400 MiB 内存和 600 毫核 CPU,需要一个具有足够可用可分配空间的节点来调度 Pod;
    • redis 容器的 CPU 份额 为 512,busybox 容器的 CPU 份额为 102,Kubernetes 总是为每个核心分配 1024 个份额,因此 redis:1024 * 0.5 个核心 ≅ 512 和 busybox:1024 * 0.1 个核心 ≅ 102;
    • 如果 Redis 容器尝试分配超过 600MB 的 RAM,则它会被 OOM 终止,很可能导致 pod 失败;
    • 如果 Redis 每 100 毫秒尝试使用超过 100 毫秒的 CPU(因为有 4 个核,可用时间为每 100 毫秒 400 毫秒),Redis 将受到 CPU 限制,从而导致性能下降;
    • 如果 Busybox 容器试图分配超过 200MB 的 RAM,它将被 OOM 终止,从而导致 pod 失败;
    • 如果 Busybox 尝试每 100 毫秒使用超过 30 毫秒的 CPU,它将遭受 CPU 限制,从而导致性能下降。

① Kubernetes 请求

  • Kubernetes 将请求定义为容器使用的保证最小资源量,基本上它将设置容器消耗的最小资源量。
  • 当一个 Pod 被调度时,kube-scheduler 将检查 Kubernetes 请求,以便将它分配给一个特定的节点,该节点至少可以满足 Pod 中所有容器的数量。如果请求的数量高于可用资源,则 Pod 将不会被调度并保持在 Pending 状态。
  • 有关挂起(pending)状态的更多信息,请查看了解:Kubernetes Pod 挂起问题。
  • 在此示例中,在容器定义中设置了 100m CPU 核和 4Mi 内存的请求:
resources:
   requests:
        cpu: 0.1
        memory: 4Mi
  • 使用请求:
    • 将 Pod 分配给 Node 时,满足 Pod 中容器指示的请求;
    • 在运行时,指示的请求量将保证为该 Pod 中的容器的最小请求量。

在这里插入图片描述

② Kubernetes 限制

  • Kubernetes 将限制定义为容器可以使用的最大资源量,这意味着容器永远不会消耗超过指示的内存量或 CPU 量。
 resources:
      limits:
        cpu: 0.5
        memory: 100Mi
  • 使用限制:
    • 将 Pod 分配给节点时。如果没有设置请求,默认情况下,Kubernetes 将分配 requests = limits。
    • 在运行时,Kubernetes 将检查 Pod 中的容器是否消耗了比限制中指示的更多的资源。

在这里插入图片描述

二、CPU 特性

  • CPU 是一种可压缩资源,这意味着它可以被拉伸以满足所有需求。如果进程请求太多 CPU,其中一些将被限制。
  • CPU 代表计算处理时间,以核为单位:
    • 可以使用 millicores (m) 来表示比核更小的数量(例如,500m 将是核的一半);
    • 最小量为 1m;
    • 一个节点可能有多个可用核,因此请求 CPU > 1 是可能的。

在这里插入图片描述

三、内存特性

  • 内存是一种不可压缩的资源,这意味着它不能像 CPU 那样被拉伸。如果一个进程没有足够的内存来工作,这个进程就会被杀死。
  • 内存在 Kubernetes 中以字节为单位:
    • 可以使用 E、P、T、G、M、k 来表示 Exabyte、Petabyte、Terabyte、Gigabyte、Megabyte 和 kilobyte,尽管通常只使用后四种(例如,500M、4G)。
    • 警告:不要使用小写的 m 表示内存(这代表 Millibytes,低得离谱);
    • 可以使用 Mi 定义 Mebibytes,其余定义为 Ei、Pi、Ti(例如 500Mi)。
  • 1 Mebibyte(及其类似物 Kibibyte、Gibibyte 等)是 2 的 20 次方字节,它的创建是为了避免与公制的 Kilo、Mega 定义混淆,应该使用这种表示法,因为它是字节的规范定义,而 Kilo 和 Mega 是 1000 的倍数。

在这里插入图片描述

四、最佳实践

  • 在极少数情况下,应该使用限制来控制 Kubernetes 中的资源使用,这是因为如果想避免饥饿(确保每个重要进程都得到它的份额),应该首先使用请求。
  • 通过设置限制,只是防止进程在异常情况下获取额外的资源,在内存的情况下导致 OOM kill,在 CPU 的情况下 Throttling(进程将需要等待直到 CPU 可以再次使用)。
  • 有关详细信息,请查看有关 OOM 和节流 的文章。
  • 如果将 Pod 的所有容器中的请求值设置为等于限制,则该 Pod 将获得有保证的服务质量。另请注意,资源使用率高于请求的 Pod 更有可能被驱逐,因此设置非常低的请求弊大于利。
  • 有关更多信息,请查看有关 Pod 驱逐和服务质量 的文章。

五、命名空间资源配额

  • 多亏了命名空间,可以将 Kubernetes 资源隔离到不同的组中,也称为租户。使用 ResourceQuotas,可以为整个命名空间设置内存或 CPU 限制,确保其中的实体不能从该数量中消耗更多。
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
spec:
  hard:
    requests.cpu: 2
    requests.memory: 1Gi
    limits.cpu: 3
    limits.memory: 2Gi
  • 说明:
    • equests.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
  • 如果尝试添加容器限制或请求超过当前 ResourceQuota 的新 Pod,Kubernetes 将返回“超出配额”错误:
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

六、命名空间限制范围

  • 如果想限制可分配给命名空间的资源总量,ResourceQuotas 很有用,但是如果想给里面的元素赋默认值会怎样呢?LimitRanges 是一种 Kubernetes 策略,用于限制命名空间中每个实体的资源设置。
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-resource-constraint
spec:
  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
  • 现在,假设添加了一个限制为 1200M 的新 Pod,将收到以下错误:
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
  • 请注意,默认情况下,即使未设置 LimitRanges,Pod 中的所有容器也实际上请求 100m CPU。

七、结论

  • 为 Kubernetes 集群选择最佳限制是获得最佳能耗和成本的关键。
  • 为 Pod 规模过大或投入过多资源可能会导致成本飙升。
  • 过小的规模或者只占用很少的 CPU 或内存将导致应用程序不能正确执行,甚至会驱逐 Pods。
  • 可以不使用 Kubernetes 限制,除非在非常特殊的情况下,因为它们可能弊大于利。在内存不足的情况下,容器有可能被杀死,或者在 CPU 不足的情况下,容器可能会被限制。
  • 对于请求,当您需要确保进程获得有保证的资源共享时请使用它。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio 2017下的C++开发环境搭建

Visual Studio 是Microsoft旗下的开发工具包系列产品,是一个基本完整的开发工具集,它包括整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等,是最流行的Windows平台应用程序的集成开发环境。…

【Springboot集成Neo4j完整版教程】

🚀 Neo4j 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,C…

低代码平台的价格范围及购买成本分析

Zoho Creator是一款强大而灵活的低代码应用程序开发平台,可帮助企业快速、高效地创建各种应用程序。但是,很多人可能会担心它的价格问题。在这篇文章中,我们将深入探讨Zoho Creator的定价策略和计划,以帮助您更好地理解其价格结构…

vue+elementui实现联想购物商城,样式美观大方

目录 一、首页效果图对比 1.联想商城首页截图: 2.作者项目效果图: 二、商品详情效果图对比 1.联想官方截图: 2.作者项目截图: 三、项目实现 1.数据分离维护 2.首页推荐列表数据处理 3.商品详情数据动态获取完成交互 4.商品详…

Spring MVC是什么?详解它的组件、请求流程及注解

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 本文将讲解Spring MVC是什么,它的优缺点与九大组件,以及它的请求流程与常用的注解。 目录 一、Spring MVC是什…

「深度学习之优化算法」(十)烟花算法

1. 烟花算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   烟花算法(Firework Algorithm,FWA)是一种受烟花爆炸产生火星,并继续分裂爆炸这一过程启发而得出的算法。算法的思想简单,但具体实现复杂。算法提出时间并不长,但是已经有了不少的改进研究和较为全…

网络安全(黑客)内网渗透基础知识

0x01 内网概述 内网也指局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的历程安排、电子邮件和传真通信服务等功能。 内…

K8s集群部署最新Jenkins 2.387.1

K8s集群部署最新Jenkins 2.387.1 概述环境准备设置存储目录并启动NFS服务安装 NFS 服务端 动态创建 NFS存储(动态存储)部署jenkins服务 概述 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作…

5、架构:通用 Schema 设计

作为前端开发一定会非常熟悉 AST 抽象语法树(Abstract Syntax Tree),当浏览器加载 JS 代码时,它会首先将代码转换为一棵抽象语法树(AST),然后再根据 AST 来渲染对应的 DOM 结构,对于…

[工业互联-16]:工业Windows操作系统与实时性方案

目录 第1章 Windows操作系统 1.1 简介 1.2 Windows架构 第2章 工业Windows操作系统 2.1 简介 2.2 常见的工业Windows操作系统版本 2.3 定制化工业Windows 第3章 EtherCAT实时Windows方案 3.1 实时Windows的缘由 3.2 总体框架 3.3 ROS2方案 3.4 方案1:使…

Sumifs函数(excel)

SUMIFS 函数是一个数学与三角函数,用于计算其满足多个条件的全部参数的总量。excel如何使用Sumifs函数? 工具/原料 联想ThinkPad X1 windows7 WPS office2021 方法/步骤 首先运行office软件,打开一份表格,今天我们要计算以“…

ASL-QPSO|改进量子粒子群自适应算法及其实现(Matlab)

作者在前面的文章中介绍了量子粒子群算法,量子粒子群算法不但继承粒子群算法的优点,还有它自身计算模型更加简洁,控制参数更少等更加突出的优势,但依然存在着一定的局限性。 例如也会存在着早熟收敛的问题,随着迭代次数…

Android oss policy上传

OSS Policy方式上传 一、 流程对比1.1 普通上传1.2 服务端签名后直传 二、获取上传的policy签名配置三、请求OSS上传文件四、调用应用服务器接口同步文件五、关于上传OSS报错注意事项六、附送链接 一、 流程对比 1.1 普通上传 缺点: 上传慢:用户数据需…

OpenCloudOS社区开源,助力软件开发

早前红帽宣布限制源代码访问性的政策,并解释说RHEL相关源码仅通过CentOS Stream公开,付费客户和合作伙伴可通过Red Hat Customer Portal访问到源代码,由此也导致非客户获取源码越来越麻烦, 据了解,CentOS是红帽发行的…

设计模式之责任链模式

文章目录 1、基本介绍2、包含角色3、场景推导4、责任链模式的优缺点5、使用场景 1、基本介绍 王二狗本来是干Android开发的,最近公司想让他把IOS的活也干了,但是Windows笔记本不能开发IOS,所以二狗提出买一台Mac笔记本电脑。这花钱的事需要领…

用android studio 测试发行包

在google play 发行app,需要用bundle,而不是apk。 bundle 比apk 要小很多,比如我的app-release.aab 29,736 KB, 而app-release.apk 是62,305KB。这就是少了一半多。但是apk 直接复制就可以安装,bundle 需要上传google…

前置微小信号放大器怎么用

前置微小信号放大器是一种用于将微弱信号从传感器转换成足够强度的信号以便更好地进行检测和处理的设备。它主要应用于各种传感器领域,例如温度传感器、压力传感器、光学传感器和生物传感器等。前置微小信号放大器的作用是提高信号的信噪比,减小噪声干扰…

Java类和对象

文章目录 什么是面向对象类的语法类的实例化 类和对象的关系this引用this引用的特性类的构造方法构造方法的特性 对象初始化的流程封装访问限定符包的概念常见的包 Staticstatic修饰成员变量static修饰成员方法 代码块的概念内部类内部类的特性 什么是面向对象 面向对象是解决…

Spring Cloud Alibaba 之 Nacos精讲

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

二次-InsCode Stable Diffusion 美图活动一期

模型: AbyssOrangeMix2 - SFW_Soft NSFW_AbyssOrangeMix2_sfw.safetensors 参数配置: 正:Mountains and seas, people 负:NSFW, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochr…