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

news2024/11/27 4:40:12

一、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 不足的情况下,容器可能会被限制。
  • 对于请求,当您需要确保进程获得有保证的资源共享时请使用它。

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

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

相关文章

MQTT 5.0 中的安全认证机制:增强认证介绍

在本系列之前的文章中我们提到,借助 MQTT CONNECT 报文中的 Username 和 Password 字段,我们可以实现一些简单的认证,比如密码认证、Token 认证等。为了进一步保障物联网系统的安全,在本期文章中,我们将一起了解另一种…

tty(四)tty框架分析

基于linux-3.14.16 重要文件:tty_io.c 一、tty子系统 开机添加了2个次设备号为0和1的字符设备,即/dev/tty和/dev/console。 二、分配tty驱动接口alloc_tty_driver 最终调用的__tty_alloc_driver分配 先分配一个tty_driver 因为flags为0&#xff0c…

从编程开发角度比较电机驱动芯片:DRV8833、TB6612、A4950、L298N

这几款驱动芯片都是用于控制直流电机的常见驱动芯片,下面是它们的相同点和不同点的比较: 相同点: 都可以用于控制直流电机的转速和方向。 都支持PWM控制方式,可以实现电机的速度调节。 都提供了使能引脚,可以通过使…

(ARM)7/5

1.串口发送单个字符 2.串口发送字符串 uart4.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_uart.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h"//初始化相关操作 void hal_uart4_init();//发送一个字符 v…

uniapp学习之【uniapp的返回事件 onBackPress 在微信小程序中不生效的问题】

uniapp 的返回事件 onBackPress 在微信小程序中不生效的问题 场景:页面中点击左上角的返回按钮,监听返回操作,页面返回前执行了一些操作, uniapp 页面生命周期中有 onBackPress ,因此将操作写在了 onBackPress () 页面生命周期钩子当中, H5 测试一切正常,但是微信开…

7、架构:模板设计

在低代码开发中,除了基础组件与物料之外,模板也是必不可少的模块,是基于物料之上的更高级的产物,除了具备业务属性之外会更偏向专属的技术领域,例如可视化大屏、数据分析、中台管理等。 此外模板通常是比较完整的应用…

k8s Label 2

在 k8s 中,我们会轻轻松松的部署几十上百个微服务,这些微服务的版本,副本数的不同进而会带出更多的 pod 这么多的 pod ,如何才能高效的将他们组织起来的,如果组织不好便会让管理微服务变得混乱不堪,杂乱无…

作物计数方法汇总

在研究农情的方向中,作物计数是一个很重要的方向,需要用到很多方法,这里做一个小小的总结 (1)地理栅格数据(tif图片)裁剪并生成带地理坐标的切片 如图需要将下图所示的tif图裁剪并生成切片(截图一部分) 源码来自&…

微服务 02-rabbitmq在springboot中如何使用(上篇)

目录 前言: 上文传送 -> 安装rabbitmq传送门: -> rabbitmq使用出现问题解决传送门: 1. rabbitmq的六大模式: 1.1 简单模式: (一对一) -> 业务场景: 1.2 工作模式: (一对多) -> 业务场景: 1.3 发布与订阅模式: (广播) 1.4 路由模式: -> 业务场景 …

计算机系统的层次结构

计算机系统 计 算 机 系 统 { 计 算 机 软 件 { 系 统 软 件 应 用 软 件 计 算 机 硬 件 { 存 储 器 运 算 器 控 制 器 输 入 设 备 输 出 设 备 计算机系统 \begin{cases} 计算机软件\begin{cases}系统软件\\应用软件\end{cases}\\计算机硬件\begin{cases}存储器\\运算器\…

YoloV8改进---注意力机制:引入瓶颈注意力模块BAM,对标CBAM

目录 ​编辑 1.BAM介绍 2.BAM引入到yolov8 2.1 加入modules.py中: 2.2 加入tasks.py中: 2.3 yolov8_BAM.yaml 1.BAM介绍 论文:https://arxiv.org/pdf/1807.06514.pdf 摘要:提出了一种简单有效的注意力模块,称为瓶颈…

06、Nginx反向代理与负载均衡

反向代理: 这种代理方式叫做,隧道代理。有性能瓶颈,因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要 负载均衡: 把请求,按照一定算法规则,分配给多台业务服务器(即使其中…

【论文笔记】Skill-based Meta Reinforcement Learning

【论文笔记】Skill-based Meta Reinforcement Learning 文章目录 【论文笔记】Skill-based Meta Reinforcement LearningAbstract1 INTRODUCTION2 RELATED WORKMeta-Reinforcement LearningOffline datasetsOffline Meta-RLSkill-based Learning 3 PROBLEM FORMULATION AND PRE…

CPU大小端和网络序的理解

引子 Big/Little Endian是Host CPU如何去理解在内存中的数据,内存中的数据是没有Big/Little Endian之分的(内存仅仅作为存储介质),而Host CPU才有Big/Little Endian之分。 不同Endian的CPU,从内存读取数据的时候&#…

Linux进度条

Linux进度条 一.基本概念1.回车和换行2.缓冲区2.实现倒计时 二.进度条1.前置工作2.代码实现 一.基本概念 1.回车和换行 回车:指光标移到该行的起始位置(\r)。 换行:换到下一行(\n)。 在c语音里\n将回车和换…

spring.boot 随笔0 springFactoriesInstance入门

0. 其实也没有那么入门 明天还要上班,速度write,直接放一张多样性比较好的 spring.factories 文件(取自 spring-boot-2.3.4.RELEASE.jar) # PropertySource Loaders org.springframework.boot.env.PropertySourceLoader\ org.springframework.boot.env…

知识图谱实战应用19-基于Py2neo的英语单词关联记忆知识图谱项目

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用19-基于Py2neo的英语单词关联记忆知识图谱项目。基于Py2neo的英语单词关联记忆知识图谱项目可以帮助用户更系统地学习和记忆英语单词,通过图谱的可视化展示和智能推荐功能,提供了一种全新的、更高效的记忆方法,并促进…

AtomicInteger使用详解

AtomicInteger使用详解 1、get():获取当前AtomicInteger对象的值。2、set(int newValue):将AtomicInteger对象的值设置为指定的newValue。3、getAndSet(int newValue):先获取当前AtomicInteger对象的值,然后将对象的值设置为指定的…

ROS1/2机器人课程的价值和规模

价值用价格,规模用销量。 免费的ROS1/2课程也很多。 2023版,15元,24人。 2022版,1.99元,21人。 价格不贵,人数很少,店家也很少。 当然,有朋友说,有免费冲击&#xff0…

宏晶微 音频处理芯片 MS7124

MS7124是一款高性能24bit数字立体声音频DAC,该DAC采用Sigma-Delta结构,支持标准的I2S数字信号输入,输出支持立体声和单声道。