6 张配图通俗易懂说透 K8S 请求和限制

news2024/11/19 13:36:12

6 张配图通俗易懂说透 K8S 请求和限制

在 Kubernetes 中使用容器时,了解涉及的资源是什么以及为何需要它们很重要。有些进程比其他进程需要更多的 CPU 或内存。这很关键,永远不应该让进程挨饿。知道了这一点,我们应该正确配置容器和 Pod,以便充分利用两者。

Kubernetes 限制和请求简介

使用 Kubernetes 时,限制和请求是重要的设置。本文将重点关注两个最重要的:CPU 和内存。

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 节点。我们可以提取出很多信息:

在这里插入图片描述

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

Kubernetes 请求

Kubernetes 将请求定义为容器使用的保证最小资源量。

基本上,它将设置容器消耗的最小资源量。

当一个 Pod 被调度时,kube-scheduler 将检查 Kubernetes 请求,以便将它分配给一个特定的节点,该节点至少可以满足 Pod 中所有容器的数量。如果请求的数量高于可用资源,则 Pod 将不会被调度并保持在 Pending 状态。

有关挂起(pending)状态的更多信息,请查看了解 Kubernetes Pod 挂起问题:

https://sysdig.com/blog/kubernetes-pod-pending-problems/

在此示例中,在容器定义中我们设置了 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 中的容器是否消耗了比限制中指示的更多的资源。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NymVkZha-1670471516534)(https://files.mdnice.com/user/23818/c5a5802c-73ed-42ee-a15c-509e6d4a1901.png)]

CPU 特性

CPU 是一种可压缩资源,这意味着它可以被拉伸以满足所有需求。如果进程请求太多 CPU,其中一些将被限制。

CPU代表计算处理时间,以核为单位。

  • 您可以使用 millicores (m) 来表示比核更小的数量(例如,500m 将是核的一半)
  • 最小量为 1m
  • 一个节点可能有多个可用核,因此请求 CPU > 1 是可能的

Kubernetes requests for CPU

内存特性

内存是一种不可压缩的资源,这意味着它不能像 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 的倍数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5cve5zyG-1670471516538)(https://files.mdnice.com/user/23818/2f7f4a06-9863-449e-b9d2-c4e7d2cfec4c.png)]

最佳实践

在极少数情况下,您应该使用限制来控制 Kubernetes 中的资源使用。这是因为如果你想避免饥饿(确保每个重要进程都得到它的份额),你应该首先使用请求。

通过设置限制,你只是防止进程在异常情况下获取额外的资源,在内存的情况下导致 OOM kill,在 CPU 的情况下 Throttling(进程将需要等待直到 CPU 可以再次使用)。

有关详细信息,请查看有关 OOM 和节流的文章:

https://sysdig.com/blog/troubleshoot-kubernetes-oom/

如果您将 Pod 的所有容器中的请求值设置为等于限制,则该 Pod 将获得有保证的服务质量。

另请注意,资源使用率高于请求的 Pod 更有可能被驱逐,因此设置非常低的请求弊大于利。有关更多信息,请查看有关 Pod 驱逐和服务质量的文章:

https://sysdig.com/blog/kubernetes-pod-evicted/

命名空间资源配额

多亏了命名空间,我们可以将 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
  • requests.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 不足的情况下,容器可能会被限制。

对于请求,当您需要确保进程获得有保证的资源共享时请使用它。

译自

作者:JAVIER MARTÍNEZ
原文:https://sysdig.com/blog/kubernetes-limits-requests/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ICV:L2级乘用车渗透率预计将在2025年超过50%

全球前沿科技咨询机构ICV近期发布了全球乘用车市场的分析报告。ICV在报告中指出,作为汽车消费大国之一的中国在2022年仍是乘用车销量第一的国家。目前L0和L1级别的自动驾驶乘用车仍占市场主导地位,但随着供应端在技术方面的不断突破以及需求端在认可度方…

让你的Python程序像C语言一样快

让你的Python程序像C语言也一样快 在《Python性能优化指南–让你的Python代码快x3倍的秘诀》中有提到很多加速Python程序的方法,在随后的系列文章中我也为大家专门介绍了用PyPy加速Python 和 用Numba:一行代码将Python程序运行速度提升100倍。但在所有方…

VM系列振弦读数模块通讯协议

通讯协议是上位机通过 VMXXX 模块支持的数字接口完成信息交互的数据格式、传输步骤、 通讯速率等的一系列预先约定。上位机必须按照本章描述的通讯协议规则来完成与 VMXXX 的数据交互工作。 寄存器机制 VMXXX 内部维护有若干寄存器,模块在寄存器参数值的控制下…

【LeetCode_字符串_逻辑分析】13. 罗马数字转整数

目录考察点第一次:2022年12月8日15:24:16解题思路代码展示优秀的解题思路1. 总结规律2. 字符串替换题目描述13. 罗马数字转整数 考察点 逻辑分析能力 第一次:2022年12月8日15:24:16 解题思路 分析能力有待提高 代码展示 class Solution {public i…

【HTML5期末作业】用HTML+CSS一个兰州交通大学官网网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

百度 Android 直播秒开体验优化

作者 | 任雪龙 导读 网络直播功能作为一项互联网基本能力已经越来越重要,手机中的直播功能也越来越完善,电商直播、新闻直播、娱乐直播等多种直播类型为用户提供了丰富的直播内容。随着直播的普及,为用户提供极速、流畅的直播观看体验也越来越…

外汇天眼:什么是外汇动量交易?新手指南

1. 什么是动量交易? 我们需要了解的第一件事是动量到底是什么。势头是字面意义上的趋势强度。动量交易策略涉及仅在强劲的价格趋势方向开仓,利用持续的价格变动,并在趋势逆转之前退出。 动量交易者通常不会担心趋势在哪里结束和开始&#x…

计算机毕业设计ssm+vue基本微信小程序的校园通知小程序系统 uniapp 小程序

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具。在高校,各种管理系统层出不穷,为校园通知管理开发必要的系统,能够有效的提升管理效率。一直以来,校园通知一直没有进行系统化的管理,学生无法准确掌握高校通知状态,…

35岁以上的那些测试员何去何从?

人人都说IT行业:35岁就是一道坎!跨不过就是一道中年危机,跨过了就成养老保险。那么35岁之后,软件测试从业者都去哪了?能力不行,中年危机很多刚入行的测试的新人,毫无经验,但是远远却…

数图互通高校房产管理——移动端微信小程序

数图互通房产管理系统在这方面做得比较全面; 随着移动智能手机功能的应用日益成熟,学校要求使用移动端微信小程序端进行房产清查、房产数据查询功能。可以利用手机等移动设备来现场查看房屋实际使用情况和清查房屋数据,也可以通过移动终端查…

日记:“实战深度学习”-第1天

机缘 说起来有点偶然,在某书APP中随手详细介绍了学习深度学习相关的历程,断断续续应该发了几百个笔记,持续时间有大概1.5年左右,然后某一天清华出版社的赵编辑突然找到我,问我能否分享一下学习的过程&#…

Spring源码深度解析:十二、后处理器 BeanPostProcessor

一、前言 文章目录:Spring源码深度解析:文章目录 二、BeanPostProcessor 所谓的BeanPostProcessor翻译过来就是Bean后处理器。 1. 什么是 BeanPostProcessor BeanPostProcessor是 Spring提供给我们的一个非常重要的扩展接口,并且Spring内…

【C++11多线程】线程同步之线程通信:condition_variable

文章目录1.condition_variable2.notify_one()和notify_all()3.wait()3.1 没有第二个参数:while wait()3.2 有第二个参数:wait() lambda需要注意的是,条件变量condition_variable要和互斥锁mutex搭配起来使用。 1.condition_variable cond…

Windows远程连接Redis(Linux)

Windows远程连接Redis(Linux) 文章目录Windows远程连接Redis(Linux)1、写在前面2、配置redis.conf3、启动Redis3.1 开启redis服务3.2 启动客户端3.3 Redis命令3.4 查看Redis密码4、关闭Redis5、Java操作Redis1、写在前面 Windows…

安科瑞ARTU100系列模块化远程控制终端单元 开关量输入输出采集模块

安科瑞 王晶淼/刘芳 1.概述 ARTU系列远程终端单元是高性能配电智能化元件,应用于智能配电、工业自动化等领域。ARTU100系列远程终端单元提供开关量输入、开关量输出、模拟量输入、模拟量输出,能够将采集到的信号通过RS485串口、RJ45以太网接口、2G、Lo…

进制+异或

一.调用API String sInteger.toString(十进制,转为0-35进制); //R进制的字符串转为10进制数 int aInteger.parseInt(s,R); //把R进制的字符串封装成大数类 BigInteger bnew BigInteger(s,R); 二.求R进制下的数位和 2992这个数十进制和为22,…

【计算机视觉】图像分割中FCN、DeepLab、SegNet、U-Net、Mask R-CNN等算法的讲解(图文解释 超详细)

觉得有帮助请点赞关注收藏~~~ 一、FCN分割算法 全卷积神经网络目标分割算法能够端到端的得到每个像素的目标分类结果,与传统的卷积神经网络只能输入固定大小图像和在网络的末端使用几个全连接层得到固定长度的特征向量不同,全卷积神经网络能够接受任意大…

HBase的数据模型和存储原理

HBase的数据模型 HBase中表的逻辑结构 Name Space(命名空间) 类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 HBase 内置的表&a…

向 Excel 和 PowerPoint 添加可编辑地图的指南

本指南规定: 如何将 shapefile 转换为 svg 文件(如果后者不存在) 如何使用 Excel 重命名 svg 文件中的对象以使对象具有正确的地理名称,以及如何将这些添加为 PowerPoint 中的可编辑地图 这样做的目的是为那些没有或不知道该软件的人提供 QGIS 制图的替代方案。通过提供某个…

如何在 Linux 的 shell 里针对特定用户/组来限制某些命令的使用

0-前言 最近,业务侧有个需求,需要禁止特定用户访问linux特定的命令,如禁止用户A使用rm命令。 我们知道,在linux系统中,一切皆文件。 那么,这个问题也可以泛化为: 如何在linux里限制特定用户…