【kubernetes系列】Kubernetes之资源配置范围管理LimitRange

概述

在默认情况下,Kubernetes不会对Pod加上CPU和内存限制,这意味着Kubernetes系统中任何Pod都可以使用其所在节点的所有可用的CPU和内存。在之前的章节https://blog.csdn.net/margu_168/article/details/131786000分享了针对集群中某个pod的资源限制,通过配置容器的计算资源Requests和Limits,我们可以限制Pod的资源使用。但对于Kubernetes集群管理员而言,配置每一个Pod的Requests和Limits是烦琐的,而且很受限制。针对这样的情况Kubernetes提出了LimitRange,用来限制 namespace中单个Pod 默认资源 request 和 limit。

LimitRange限制范围

一个 LimitRange(限制范围) 对象提供的限制能够做到:

  • 限制namespace中每个Pod或容器的最小与最大的资源使用量
  • 限制namespace中每个Pod或容器计算资源request、limit之间的比例
  • 限制namespace中每个存储卷声明(PersistentVolumeClaim)可使用的最小与最大存储空间
  • 设置namespace中容器默认计算资源的request、limit,并在运行时自动注入到容器中

资源限制和请求的约束

  • 管理员在一个命名空间内创建一个 LimitRange 对象。
  • 用户在此命名空间内创建(或尝试创建) Pod 和 PersistentVolumeClaim 等对象。
  • 首先,LimitRanger 准入控制器对所有没有设置计算资源需求的所有 Pod(及其容器)设置默认请求值与限制值。
  • 其次,LimitRange 跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange 所定义的最小、最大资源使用量以及使用量比值。
  • 若尝试创建或更新的对象(Pod 和 PersistentVolumeClaim)违反了 LimitRange 的约束, 向 API 服务器的请求会失败,并返回 HTTP 状态码 403 Forbidden 以及描述哪一项约束被违反的消息。
  • 若在命名空间中添加 LimitRange 启用了对 cpu 和 memory 等计算相关资源的限制, 你必须指定这些值的请求使用量与限制使用量。否则,系统将会拒绝创建 Pod。
  • LimitRange 的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证。 如果你添加或修改 LimitRange,命名空间中已存在的 Pod 将继续不变。
  • 如果命名空间中存在两个或更多 LimitRange 对象,应用哪个默认值是不确定的。

Pod 的 LimitRange 和准入检查

LimitRange 不 检查所应用的默认值的一致性。 这意味着 LimitRange 设置的 limit 的默认值可能小于客户端提交给 API 服务器的规约中为容器指定的 request 值。 如果发生这种情况,最终 Pod 将无法调度。

示例

定义如下一个 LimitRange: -

[root@k8s-m1 k8s-resource]# cat  example-limitrange.yaml 
apiVersion: v1
kind: LimitRange
metadata:name: myspace-limitrangenamespace: myspace
spec:limits:- type: Container       #限制的资源类型max:cpu: "1"            #限制单个容器的最大CPUmemory: "2Gi"       #限制单个容器的最大内存min:cpu: "100m"         #限制单个容器的最小CPUmemory: "0.3Gi"     #限制单个容器的最小内存default:cpu: "400m"         #默认单个容器的CPU限制memory: "1Gi"     #默认单个容器的内存限制defaultRequest:cpu: "200m"         #默认单个容器的CPU创建请求memory: "0.5Gi"     #默认单个容器的内存创建请求maxLimitRequestRatio:cpu: 2              #限制CPU limit/request比值最大为2  memory: 2         #限制内存limit/request比值最大为2- type: Podmax:cpu: "2"            #限制单个Pod的最大CPUmemory: "4Gi"       #限制单个Pod最大内存- type: PersistentVolumeClaimmax:storage: 20Gi        #限制PVC最大的requests.storagemin:storage: 5Gi        #限制PVC最小的requests.storage[root@k8s-m1 k8s-resource]# kubectl apply -f example-limitrange.yaml 
limitrange/myspace-limitrange created[root@k8s-m1 k8s-resource]# kubectl get limitranges -n myspace 
NAME                 CREATED AT
myspace-limitrange   2023-07-19T12:10:58Z[root@k8s-m1 k8s-resource]# kubectl describe -n myspace limitranges myspace-limitrange 
Name:                  myspace-limitrange
Namespace:             myspace
Type                   Resource  Min            Max   Default Request  Default Limit  Max Limit/Request Ratio
----                   --------  ---            ---   ---------------  -------------  -----------------------
Container              cpu       100m           1     200m             400m           2
Container              memory    322122547200m  2Gi   512Mi            1Gi            2
Pod                    cpu       -              2     -                -              -
Pod                    memory    -              4Gi   -                -              -
PersistentVolumeClaim  storage   5Gi            20Gi  -                -              -

创建一个没有声明内存请求和限制的 Pod
这里给出了定义一个容器的 Pod 的配置文件。容器没有声明内存请求,也没有声明内存限制。

[root@k8s-m1 k8s-resource]# cat  no-request-limit-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: no-request-limit-podnamespace: myspace
spec:containers:- name: no-request-limit-podimage: nginx[root@k8s-m1 k8s-resource]# kubectl apply  -f no-request-limit-pod.yaml 
pod/no-request-limit-pod created[root@k8s-m1 k8s-resource]# kubectl describe po -n myspace no-request-limit-pod 
......Limits:cpu:     400mmemory:  1GiRequests:cpu:        200mmemory:     512MiEnvironment:  <none>
......

从describe结果可以发现limit和request都是按照当前命名空间下limitrange配置的设置。

定义一个container的CPU 资源请求为 600m 但未声明限制值的 Pod:

[root@k8s-m1 k8s-resource]# cat  outcpu-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: example-out-limitrange-cpu-podnamespace: myspace
spec:containers:- name: httpimage: nginxresources:requests:cpu: 600m[root@k8s-m1 k8s-resource]# kubectl  apply  -f outcpu-pod.yaml 
The Pod "example-out-limitrange-cpu-pod" is invalid: spec.containers[0].resources.requests: Invalid value: "600m": must be less than or equal to cpu limit
#通过返回的报错可以发现原因,requests需要小于cpu limit(600>400)

同时设置了 request 和 limit,那么即使使用相同的 LimitRange,新 Pod 也会被成功调度,对比上面的区别:

[root@k8s-m1 k8s-resource]# cat  request-limit-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: example-conflict-limitrange-cpu-mem-podnamespace: myspace
spec:containers:- name: httpimage: nginxresources:requests:cpu: 600mlimits:cpu: 600m[root@k8s-m1 k8s-resource]# kubectl apply -f  request-limit-pod.yaml 
pod/example-conflict-limitrange-cpu-mem-pod created

创建一个LimitRange对maxLimitRequestRatio比例操过限制的Pod,我们会发现Pod会创建失败;

[root@k8s-m1 k8s-resource]# cat  outmaxlimitrequestratio-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: outmaxlimitrequestratio-podnamespace: myspacelabels:name: outmaxlimitrequestratio-pod
spec:containers:- name: httpimage: nginxresources:limits:cpu: "600m"memory: 1.5Girequests:cpu: "200m"memory: 0.5Gi[root@k8s-m1 k8s-resource]# kubectl apply  -f outmaxlimitrequestratio-pod.yaml 
Error from server (Forbidden): error when creating "outmaxlimitrequestratio-pod.yaml": pods "outmaxlimitrequestratio-pod" is forbidden: [cpu max limit to request ratio per Container is 2, but provided ratio is 3.000000, memory max limit to request ratio per Container is 2, but provided ratio is 3.000000]

在比例范围之内的就可以正常创建,如下:

##比例为1.5,小于2(0.75/0.5  300/200)
[root@k8s-m1 k8s-resource]# cat  outmaxlimitrequestratio-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: outmaxlimitrequestratio-podnamespace: myspacelabels:name: outmaxlimitrequestratio-pod
spec:containers:- name: httpimage: nginxresources:limits:cpu: "300m"memory: 0.75Girequests:cpu: "200m"memory: 0.5Gi[root@k8s-m1 k8s-resource]# kubectl apply  -f outmaxlimitrequestratio-pod.yaml 
pod/outmaxlimitrequestratio-pod created

更多关于request和limit的设置请根据实际使用情况调试。

更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

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

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

相关文章

云迁移第二波热潮来袭,你准备好了吗?

最近&#xff0c;云迁移再次被频繁提及&#xff0c;企业对云迁移的需求量有回升趋势&#xff0c;究其根本&#xff0c;主要有以下原因&#xff1a; 企业数字化进程加速&#xff0c;本地上云需求强劲 根据《2021中国企业上云指数洞察报告》&#xff0c;我国实体经济上云渗透率…

Appium+Python+PO 设计模式

目录 前言&#xff1a; 什么是 PageObject? 关于报告的输出 总结 前言&#xff1a; Appium是一个用于自动化移动应用程序测试的开源工具&#xff0c;Python是一种简单易学且功能强大的编程语言&#xff0c;PO&#xff08;Page Object&#xff09;设计模式是一种在自动化测…

使用shell监控应用运行状态通过企业微信接收监控通知

目的&#xff1a;编写shell脚本来监控应用服务运行状态&#xff0c;若是应用异常则自动重启应用通过企业微信接收监控告警通知 知识要点&#xff1a; 使用shell脚本监控应用服务使用shell脚本自动恢复异常服务通过企业微信通知接收监控结果shell脚本使用数组知识&#xff0c;…

行为型模式之迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09; 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为设计模式&#xff0c;它提供了一种顺序访问集合对象中各个元素的方法&#xff0c;而无需暴露集合的内部表示。 在迭代器模式中&#xff0c;有三个主要角色&a…

session 生命周期和经典案例-防止非法进入管理页面

文章目录 session 生命周期和Session 经典案例-防止非法进入管理页面session 生命周期Session 生命周期-说明代码演示说明 Session 的生命周期创建CreateSession2创建ReadSession2 解读Session 的生命周期代码示例创建DeleteSession Session 经典案例-防止非法进入管理页面需求…

bgp联邦

1、ip配置 [r1-LoopBack0]ip address 192.168.1.1 24 [r1-LoopBack1]ip address 10.0.0.1 24 [r1-GigabitEthernet0/0/0]ip address 12.0.0.1 24[r2-GigabitEthernet0/0/0]ip address 12.0.0.2 24 [r2-GigabitEthernet0/0/1]ip address 172.16.1.1 29 [r2-GigabitEthernet0/0/…

【从零开始学习CSS | 第三篇】选择器优先级

目录 前言&#xff1a; 常见选择器的优先级&#xff08;从高到低&#xff09; 选择器的权重&#xff1a; 总结&#xff1a; 前言&#xff1a; 在前几篇文章中我们介绍了大量的选择器&#xff0c;那么大量的选择器在使用的时候&#xff0c;一定是有一个优先级顺序的&#xff…

【计算机视觉】DINOv2(视觉大模型)代码使用和测试(完整的源代码)

文章目录 一、环境部署二、导入原图2.1 使用vit_s14的模型 三、使用其他模型3.1 使用vit_b14的模型3.2 使用vit_l14的模型3.3 使用vit_g14的模型 一、环境部署 !git clone https://ghproxy.com/https://github.com/facebookresearch/dinov2.git输出为&#xff1a; Cloning in…

DT灯光基础(辉光 雾 阴影 渲染选项)

点光源 不能宣染&#xff0c;换个版本。不能正常预览 聚光灯 t 手柄 挡光版 平行光阴影 光线追踪阴影 没有看见阴影 灯光使用贴图 环境光 不进行渲染物体 不渲染阴影 接收阴影 不反射 可以看到反射 没有反射了 灯光链接 取消灯照 灯光雾 辉光 变化不明显

C++初阶 - 3.类和对象(中)

目录 1.类的6个默认成员函数 2.构造函数 2.2特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 6.日期类的实现 7.const成员 8.取地址及const取地址操作符重载 1.类…

FCOS 论文学习

1. 解决了什么问题&#xff1f; 之前的目标检测器如 RetinaNet、SSD、YOLOv3 都依赖于 anchors。基于 anchors 的检测器有如下三个缺点&#xff1a; 检测表现对于 anchors 的大小、宽高比和数量等超参数很敏感&#xff1b;即使精心设计了 anchors&#xff0c;但由于大小和宽高…

论文投稿前细节检查

参考文献的doi统一要或不要&#xff0c;要参考期刊/会议之前的版本参考文献的会议和期刊作者的缩写方式&#xff0c;论文标题的首字母&#xff0c;发表会议或期刊的首字母&#xff0c;年份的位置等是否统一。同时&#xff0c;建议会议直接给缩写&#xff0c;期刊给全称。Fig、T…

【x-shell】介绍以及命令大全

提示&#xff1a;x-shell命令 介绍&#xff0c;以及命令大全 文章目录 前言一、x-shell是什么&#xff1f;二、x-shell功能三、x-shell使用四、x-shell的常用命令五、 ps -ef | grep 命令总结 前言 x-shell 提示&#xff1a; 一、x-shell是什么&#xff1f; x-shell命令&…

EasyCVR告警类型设置后首页需要刷新才能更新的问题优化

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环境中&#xff0c…

【 NLP 】 句子transformer调用备忘录

一、说明 本篇对句子嵌入、文本相似性、语义搜索和图像搜索等诸方面调用实现进行记录,以便再次调用时,可以参考。

数据结构之List(双向链表)的实现

链节 链表由节点连成&#xff0c;节点的定义如下 # pragma once # include <iostream>template <typename T> struct listNode {T data;listNode <T>* pred;listNode <T>* succ;listNode(){}listNode(T d, listNode<T>* p, listNode<T>*…

Zabbix 自动发现及注册

1、依次选择 Configuratio、Discovery、Create discovery rule&#xff08;配置、自动发现、创建发现规则&#xff09; 创建客户端发现规则 2、zabbix客户端安装 agent zabbix客户端一键安装脚本 脚本参考链接 #!/bin/bash #Zabbix-Agent 5.0Zabbix_Service192.168.63.20#安…

【PHP面试题44】PHP5的版本和PHP7之间有哪些区别

文章目录 一、前言二、底层调整2.1性能提升2.2 新的引擎2.3 数据类型改进2.4 错误处理改进2.5 语言特性增加 三、应用层差异3.1 兼容性3.2 类和方法改进3.3 错误处理机制3.4 性能优化3.5 新的扩展支持 四、一些语法糖示例4.1 标量类型声明示例4.2 新增了Spaceship操作符&#x…

win11中的pagefile.sys

在C盘系统下&#xff0c;有一个命名为pagefile.sys的文件占用C盘太大的空间&#xff0c;不少用户怕删除pagefile.sys文件之后会对系统造成影响&#xff0c;而不少用户想要将pagefile.sys文件移动到D盘中。那么pagefile.sys是什么文件&#xff1f;Win10系统下pagefile.sys文件太…

【C++】list的模拟实现

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…