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

news/2024/4/29 15:01:33/文章来源:https://blog.csdn.net/Forever_wj/article/details/131559618

一、Kubernetes 限制和请求

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

在这里插入图片描述

  • 来看看如下的这个部署,在 CPU 和内存上为两个不同的容器设置限制和请求:
kind: Deployment
apiVersion: extensions/v1beta1
# …
template:spec:containers:- name: redisimage: redis:5.0.3-alpineresources:limits:memory: 600Micpu: 1requests:memory: 300Micpu: 500m- name: busyboximage: busybox:1.28resources:limits:memory: 200Micpu: 300mrequests:memory: 100Micpu: 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.1memory: 4Mi
  • 使用请求:
    • 将 Pod 分配给 Node 时,满足 Pod 中容器指示的请求;
    • 在运行时,指示的请求量将保证为该 Pod 中的容器的最小请求量。

在这里插入图片描述

② Kubernetes 限制

  • Kubernetes 将限制定义为容器可以使用的最大资源量,这意味着容器永远不会消耗超过指示的内存量或 CPU 量。
 resources:limits:cpu: 0.5memory: 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: 2requests.memory: 1Gilimits.cpu: 3limits.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: 500mdefaultRequest:cpu: 500mmin:cpu: 100mmax:cpu: "1"type: Container
  • 说明:
    • default: 如果未指定,创建的容器将具有此值;
    • min:创建的容器不能有小于此的限制或请求;
    • max: 创建的容器不能有比这更大的限制或请求。
  • 稍后,如果创建一个没有设置请求或限制的新 Pod,LimitRange 会自动将这些值设置到它的所有容器:
   Limits:cpu:  500mRequests: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.luyixian.cn/news_show_326412.aspx

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

相关文章

python中多态的作用是什么?

在强类型语言(例如Java或C#)中,多态是指允许使用一个父类类型的变量或常量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果。即使用父类的类型来调用子类的方法。 在Python中,多态指在不考虑对象类型…

SQL中的——左连接(Left join)、右连接(Right join)、内连接(Inner join)

前言 最近有一个开发需求,需要实现一个复杂年度报表,前后端都是博主开发,这里的业务逻辑比较复杂,也很锻炼sql能力,这里博主也将表的内外连接做了一个整理分享给大家 一、概念 首先还是介绍一下这三个的定义 1.Lef…

MySQL容器无法输入或显示中文异常解决

如果使用docker创建了MySQL容器,但是进入容器后发现无法输入中文,也就是在插入数据的时候中文直接显示为空,数据表里的中文也显示为空,解决方法是: 1,临时方法 该方法只在每一次进入容器的命令上添加参数&a…

【Linux从入门到精通|开发工具】---gcc/g++的基本使用

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 接下来我们来学习L…

超实用攻略!GPT能玩的这么6,你居然还不知道?

开篇 自古以来,智者皆知学无止境,而在我们身边,正有一款奠基于这个原则的AI机器人—ChatGPT,他擅长从网络上学习各种知识,然后把这些知识用在他的对话中。没错,它就是天马行空的闲话家,无所不谈的取经者。可你知道怎样让它更加符合你的使用需求,适应你的工作节奏么?哦…

github中Mermaid的用法

这个东西是最近推出&#xff0c;首先是自己的repository中新建一个readme.md文件 需要一点前端的知识&#xff0c;就是先导入一个依赖文件&#xff0c;然后再写甘特图&#xff0c;如下&#xff1a; ### 甘特图 [<a href"https://mermaid-js.github.io/mermaid/#/gant…

前端设计必备的5款效率工具

前端设计工具以更低的成本提供更快的移动开发&#xff0c;他们帮助前端开发人员有效地创建响应设计&#xff0c;但找到一个实用的前端设计工具并不容易&#xff0c;在这里&#xff0c;为您整理了五个免费和易于使用的前端页面工具! 1.即时设计 即时设计是一款免费的在线 UI 设…

go-Nunu,一个好用的脚手架推荐,助你快速构建Go应用

虽然直接使用go-gin等框架也很简单&#xff0c;但是涉及数据库、jwt认证、配置文件和日志记录等全套的服务&#xff0c;一个个集成进来也挺费事。关键是一个个集成&#xff0c;很难做到结构清晰和分层合理。这里推荐一个好用的脚手架Nunu&#xff0c;太好用啦&#xff0c;可以让…

el-dialog 层级问题混乱

使用 element -UI 的弹窗时&#xff0c;一般来说弹窗的层级应该比较高&#xff0c;背景置灰。 下边这个弹窗是正常情况下的&#xff1a; 有时候出现这样的情况&#xff1a; 解决问题&#xff1a; 只需要 在标签里边添加 append-to-body 属性问题就解决了。

c#/c++ 通过系统api监视文件变化的问题

再分享个比较经典的案例&#xff0c;在很多场景下&#xff0c;我们都要去监视某个文件夹下的文件变化&#xff0c;在创建、修改或删除的时候触发一些行为。众所周知&#xff0c;c#有个实现类叫FileSystemWatcher&#xff0c;可以用来监视目录包括子目录下文件的变化&#xff0c…

Pygame中获取键盘按键的方法

1 事件与队列 在Pygame中&#xff0c;将用户对游戏的操作叫做“事件”。键盘按键是一种事件&#xff0c;鼠标点击和游戏手柄的输入也是一种事件。在Pygame的子模块locals中&#xff0c;对这些事件进行了定义。当用户通过键盘、鼠标或者游戏手柄对游戏进行操作后&#xff0c;产…

Stable Diffusion 模型界面介绍

Stable Diffusion 模型界面介绍 界面1 图1 Stable Diffusion 模型界面1 ①&#xff1a;选择的模型&#xff0c;及Stable Diffusion进行生成图片是使用的模型。其中.ckpt为大模型 ②&#xff1a;prompt --> 正向提示词。表示你的想法&#xff0c;你想要生成一副什么样的图…

IMX6ULL 移植篇-uboot 网络命令NFS

一. uboot 网络操作命令 本文介绍 nfs 命令的使用&#xff0c;具体是&#xff1a;通过 NFS服务向开发板下载 zImage内核镜像文件。 二. nfs 命令 nfs命令使用的目的&#xff1a;为了方便开发板调试。 nfs(Network File System) 网络文件系统&#xff0c;通过 nfs 可以在计算…

Redis【实战篇】---- 达人探店

Redis【实战篇】---- 达人探店 1. 达人探店 - 发布探店笔记2. 达人探店 - 查看探店笔记3. 达人探店 - 点赞功能4. 达人探店 - 点赞排行榜 1. 达人探店 - 发布探店笔记 发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_bl…

记录力扣热题-100——从链表中找到刷题感觉

目录 一. &#x1f981; 前言二. &#x1f981; 解题过程1. 题目2. 思路一3. 思路二 三. &#x1f981; 文末活动内容简介本书结构关于代码 一. &#x1f981; 前言 狮子此前已经很久没有碰过算法题了&#xff0c;对于之前好不容易攒起来的题感又没了…最近准备面试&#xff0…

这些代码,差点把我气出内伤

先问大家一个小问题&#xff1a;你觉得看别人代码累&#xff0c;还是自己写代码累&#xff1f; 我相信有很多朋友会说&#xff0c;当然是自己写代码累了&#xff0c;要思考逻辑、要动手敲键盘&#xff0c;身心俱疲啊&#xff1b;但是&#xff0c;如果你需要经常阅读别人的代码…

leetcode 141.环形链表(快慢指针追击问题)

⭐️ 往期相关文章 &#x1f4ab;链接1&#xff1a;链表分割 &#x1f4ab;链接2&#xff1a;链表中倒数第k个结点(快慢指针问题) &#x1f4ab;链接3&#xff1a;leetcode 876.链表的中间结点(快慢指针问题) &#x1f4ab;链接4&#xff1a;leetcode 206.反转链表 &#x1f4…

vue echarts k线图 子功能设置

1 图中自定义选择区间, 手动鼠标拉取区间显示 2 底部数据选择条 dataZoom: [{type: inside,xAxisIndex: [0, 1],start: 98,end: 100},{show: true, // 这个是打开数据 选择条xAxisIndex: [0, 1],type: slider,top: 85%,start: 98,end: 100}], 3 鼠标在 k线图 选择区域 显示 的…

简历石沉大海!这份新鲜出炉的测试用人需求分析报告揭示了原因

最近有朋友吐槽简历投递后石沉大海&#xff0c;而主动打电话面试的除了外包还是外包。软件测试就业形势真的这么糟糕了&#xff1f; 小酋决定用数据揭开真相。因此小酋选取“软件测试”、“自动化测试”、“测试开发”作为搜索关键词&#xff0c;统计了 无忧网 近一个月用人市…

118.浏览器支持和修复Safari浏览器的Flexbox漏洞

在我们之前的文章中&#xff0c;我们介绍了测试的步骤 虽然现在大部分新版本的浏览器都能支持99%的CSS属性&#xff0c;但是不排除的是仍然有一些用户使用老的IE浏览器或者版本较低的浏览器去浏览我们的网页&#xff0c;这样我们的网站可能无法按照我们的预期工作&#xff1b…