Kubernetes基础(七)-Pod资源Limits与Requests

在k8s的集群环境中,资源的合理分配和使用非常重要。毕竟容器化要解决的问题之一就是资源的充分利用。在集群中分配资源的时候就不得不提到Limits和Requests。

1 Namespace配额

Kubernetes 是允许管理员在命名空间中指定资源 Requests 和 Limits 的,这一特性对于资源管理限制非常有用。但它目前还存在一定局限:如果管理员在命名空间中设置了 CPU Requests 配额,那么所有 Pod 也要在其定义中设置 CPU Requests,否则就无法被调配资源。

apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-example
spec:
  hard:
    requests.cpu: 4
    requests.memory: 4Gi
    limits.cpu: 6
    limits.memory: 6Gi

这是一个简单的ResourceQuota类型,也就是针对Namespace的配额。它会针对Namespace做如下限额:

  • 所有 CPU Requests 的总和不能超过 4 个内核
  • 所有 RAM Requests 的总和不能超过 4GiB
  • 所有 CPU Limits 的总和不能超过 6个内核
  • 所有 RAM Limits 的总和不能超过 6GiB

2 针对Pod的Request和Limit

刚上述提到可以针对Pod进行资源限额,同样也可以设置Pod申请资源的Request和Limit。k8s中会将一个CPU分成1000个shares,这和Cgroup中分成1024略有差异。正常情况下requests的数值应该小于limits,那么该Pod获得的资源可以分为两部分:

  • 完全可靠的资源,资源量大小等于requests值
  • 不可靠的资源,资源量最大等于limits和requests的差额,这份不可靠的资源能够申请到多少,取决于当时主机上容器可用资源的余量。

如下例:

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
 name: redis
 labels:
   name: redis
   app: redis-app
spec:
 replicas: 2
 selector:
   matchLabels:
    name: redis
    role: redisdb
    app: redis-app
 template:
   spec:
     containers:
       - name: redis
         image: redis:5.0.3-alpine
         resources:
           limits:
             memory: 500Mi
             cpu: 1
           requests:
             memory: 250Mi
             cpu: 500m
       - name: busybox
         image: busybox:1.28
         resources:
           limits:
             memory: 100Mi
             cpu: 100m
           requests:
             memory: 50Mi
             cpu: 50m
  • Pod 中两个容器公共的有效 Request 是 300MiB 的内存和 550 毫核(millicore)的 CPU。我们需要一个具有足够可用可分配空间的节点来调度 Pod。
  • 如果 Redis 容器尝试分配超过 500MB 的 RAM,就会被 OOM-killer。
  • 如果 Redis 容器尝试每 100ms 使用 100ms 以上的 CPU,那么 Redis 就会受到 CPU 限制(如果一共有 4 个内核,可用时间为 400ms/100ms),从而导致性能下降
  • 如果 busybox 容器尝试分配 100MB 以上的 RAM,也会引起 OOM
  • 如果 busybox 容器尝试每 100ms 使用 10ms 以上的 CPU,也会使 CPU 受到限制,从而导致性能下降

需要注意的是,Kubernetes 限制的是每个容器,而不是每个 Pod。其他 CPU 指标,如共享 CPU 资源使用情况,只对分配有参考价值,所以如果遇到了性能上的问题,建议不要在这些指标上浪费时间。


3 Requests等于Limits 的时候

一般情况,设置的Requests值一般都要小于Limits,但是也存在特殊情况。涉及到一个概念就是服务质量等级

  • Guaranteed(完全可靠的):Limits==requests,或者只设置了Limits,此时默认requests等于limits
  • Burstable(弹性波动、较可靠的):分为两种情况:
    • Pod中一部分容器在一种或多种资源类型中配置了requests和limits;
    • Pod中一部分容器未定义资源配置(requests和limits都未配置)
  • BestEffort(尽力而为、不太可靠的):Pod所有中所有容器都未定义requests和limits

注意:在容器未定义limits时,limits值默认是节点资源容量的上限。

另外当分配CPU的requests和limits相等的时候,就是指该容器独占CPU,需要在kubelet服务的配置中增加--cpu-manager-policy=static

4 可压缩资源和不可压缩资源

上文提到,在容器可使用的资源有CPU和内存。所以拓展一下k8s集群中的可压缩资源和不可压缩资源概念。
在k8s中,CPU就是可压缩资源。空闲的CPU资源会按照容器的requests值得比例进行分配,举例说明:

容器A requests1 limits 10;容器B requests2 limits 8,假如一开始该节点上可用CPU为3,那么两个容器恰好得到各自requests的量。此时节点又释放了1.5CPU,A和B都需要更多CPU资源,那么这1.5CPU就会按照A和B的requests量按比例分配,最后A得到1.5CPU,B得到3CPU。

目前k8s支持的不可压缩资源是内存。Pod中可以得到requests的内存量,如果Pod使用小于该值,那么Pod正常运行;如果Pod使用超过了该值极=就有可能被k8s杀掉。比如,Pod A使用了大于requests但是小于limits的内存,此时Pod B使用了小于requests的内存,但是Pod B中的程序突然压力增大,向k8s请求更多的但是不超过自己requests的内存资源,而节点上已没有空闲内存资源,这时候k8s就可能会直接kill Pod A。

4 选择可靠的Requests和Limits

具备一定 Kubernetes 经验的人都知道正确设置 Request 和 Limit 对于应用程序和集群的性能的重要性。

理想情况下,Pod 请求多少资源,它就用多少资源,但在现实场景下,资源使用是不断变化的,而且它的变化没有规律,不可预测。

如果 Pod 的资源使用量远低于请求量,那会导致资源浪费;如果资源使用量高于请求量,那就会使节点出现性能问题。因此在实际操作中,可以把 Request 值上下浮动 25% 作为一个良性参考标准。

而关于 Limit,设置合理的 Limit 数值其实需要尝试,因为它主要取决于应用程序的性质、需求模型、对错误的容忍度以及许多其他因素,没有固定答案。

另一件需要考虑的事是在节点上允许的 Limits 过量使用。


这些 Limits 由用户执行,因为 Kubernetes 没有关于超额使用的自动化机制。

另外需要考虑的事情是在节点上允许的Limits过量使用。

 这些Limits是由用户执行,因为kubernetes没有关于超额使用的自动化机制。

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

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

相关文章

Linux输入与输出设备的管理

计算机系统中CPU 并不直接和设备打交道,它们中间有一个叫作设备控制器(Device Control Unit)的组件,例如硬盘有磁盘控制器、USB 有 USB 控制器、显示器有视频控制器等。这些控制器就像代理商一样,它们知道如何应对硬盘…

Python 使用tkinter的Menu菜单command参数与bind方法共用触发事件

用普通函数作为媒介,使用event_generate()方法模拟触发bind()事件来创建一个模拟的event对象,并将其传递给绑定的事件处理函数。 运行结果 示例代码 import tkinter as tk# 菜单事件 def menuEvent(event):print(event.x, event.y)label.config(textf鼠…

HIKVISION流媒体管理服务器后台任意文件读取漏洞

默认账号密码为 admin/12345 构造payload /systemLog/downFile.php?fileName../../../../../../../../../../../../../../../windows/system.ini漏洞证明 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播…

Yum配置、相关命令和常见问题

搭建光盘源 将系统盘读取出来,找到系统盘下存放软件包的目录 2.配置yun仓库 输入命令进入仓库编辑 #必须以.repo结尾 :wq 回车保存退出 3.命令行输入yum repolist 查看yum仓库 配置硬盘源 1.将硬盘源拷贝到目录,或者挂载到目录 2.指定repo文件baseu…

php性能追踪与分析

PHP扩展下载:https://pecl.php.net/package/xhprof php.ini配置 [xhprof] extensionxhprof xhprof.output_dir/temp/xhprof auto_prepend_file /temp/inject_xhprof.php if(php_sapi_name() cli) {return; }$xhprof_config[enabled]1;if(!empty($xhprof_config…

自动化测试测试框架封装改造

PO模式自动化测试用例 PO设计模式是自动化测试中最佳的设计模式,主要体现在对界面交互细节的封装,在实际测试中只关注业务流程就可以了。 相较于传统的设计,在新增测试用例后PO模式有如下优点: 1、易读性强 2、可扩展性好 3、…

C++ 开发【深入浅出】笔记02

多态 同一种类型的不同表现形式基类指针指向基类对象基类对象调用的成员函数,基类指针指向派生类对象则调用派生类得成员函数,这种现象就称为多态构成多态的条件 继承关系基类多态函数必须声明为虚函数(virtual)派生类必须覆盖&am…

自动驾驶学习笔记(八)——路线规划

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 路线规划 路由元素 路径搜索 最优…

选择排序与堆排序

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🐻‍❄个人主页🎉:GOTXX🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

物联网AI MicroPython学习之语法uzlib解压缩

学物联网,来万物简单IoT物联网!! uzlib 介绍 uzlib 模块解压缩用DEFLATE算法压缩的二进制数据 (通常在zlib库和gzip存档器中使用),压缩功能尚未实现。 注意:解压缩前,应检查模块内可…

Django框架FAQ

文章目录 问题1:Django数据库恢复问题2:null和blank的区别问题3:Django创建超级用户报错问题4:Django同源策略 问题1:Django数据库恢复 问题: 从仓库拉下来的Django项目,没有sqlite数据库和migrations记录,如何通过model恢复数据库 解决方法: # 步骤1:导出数据 # 不指定 ap…

SQL注入漏洞:CMS布尔盲注python脚本编写

SQL注入漏洞:CMS布尔盲注python脚本编写 文章目录 SQL注入漏洞:CMS布尔盲注python脚本编写库名爆破爆破表名用户名密码爆破 库名爆破 import requests #库名 database"" x0 while requests.get(urlf"http://10.9.47.77/cms/show.php?id33%20and%20length(data…

【C++】函数指针 ① ( 函数三要素 | 函数类型 | 函数指针类型 | 函数类型重命名 )

文章目录 一、函数类型 和 函数指针类型1、函数三要素2、函数类型3、函数指针类型4、函数类型重命名 二、代码示例 - 函数类型重命名1、代码分析2、完整代码示例 一、函数类型 和 函数指针类型 1、函数三要素 函数原型有三个重要要素 : 函数名称 : 使用 标识符 为函数命名 ; 用…

rasa train nlu详解:1.1-train_nlu()函数

本文使用《使用ResponseSelector实现校园招聘FAQ机器人》中的例子,主要详解介绍train_nlu()函数中变量的具体值。 一.rasa/model_training.py/train_nlu()函数   train_nlu()函数实现,如下所示: def train_nlu(config: Text,nlu_data: Op…

Fortran 中的指针

Fortran 中的指针 指针可以看作一种数据类型 指针存储与之关联的数据的内存地址变量指针:指向变量数组指针:指向数组过程指针:指向函数或子程序指针状态 未定义未关联 integer, pointer::p1>null() !或者 nullify(p1) 已关联 指针操作 指…

python工具HIKVISION视频编码设备接入网关任意文件下载

python工具 构造payload /serverLog/downFile.php?fileName../web/html/serverLog/downFile.php漏洞证明 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何…

Ansible命令使用

ansible ansible的命令 ansible命令模块Pingcommand 模块shell 模块copy 模块file 模块fetch 模块cron 模块yum 模块service 模块user 模块group 模块script 模块setup 模块get_url模块stat模块unarchive模块unarchive模块 ansible的命令 /usr/bin/ansible  Ansibe AD-Hoc 临…

【数据结构】归并排序

#include<iostream>using namespace std;void Merge(int* arr,int left,int right,int mid, int*& tmparr) {int begin1 left, end1 mid;int begin2 mid 1, end2 right;int tmpi left;//下面合并两个数组为一个有序数组&#xff08;升序&#xff09;&#xff1…

Spring Cloud学习(六)【统一网关 Gateway】

文章目录 网关的功能搭建网关服务路由断言工厂Route Predicate Factory路由过滤器 GatewayFilter过滤器执行顺序跨域问题处理 网关的功能 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 在SpringCloud中网关的实现包括两种&#xff1a; gatewayzuul …

带你详细了解git的【分支和标签】

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《git》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;…