在这里插入图片描述

K8s如何合理规定对象资源使用

基本概念

  • Kubernetes中,占用资源最小单元单个Pod
  • Kubernetes中,资源占用主要针对服务器CPU内存

为什么要做资源限制

  • 对于Kubernetes集群而言,所有Pod都会占用K8s集群所在服务器的资源,如果不做资源控制,则很有可能出现某些Pod无限制占用资源(CPU、内存),导致系统崩溃

资源限制设置方式

Pod、Container级别控制

关键参数:request、limits
  • request参数

    • controller做调度时,创建Pod最低资源占用标准
  • limits参数

    • 单个Pod运行时的资源占用上限真正限制资源可用到多少
    • 当容器试图使用超过limits指定的CPU时会被 CFS 限流;试图使用超过limits指定的内存时会被 OOM Killer 杀掉并重启
使用示例
	apiVersion: v1kind: Podmetadata:name: demo-podspec:containers:- name: appimage: nginx:latestresources: # k8s中定义资源规格的关键字,主要针对CPU和内存requests: # Pod最低的资源占用。调度器在将Pod指派给某个节点时,会检查该节点“可分配资源”是否满足request要求cpu: "100m"        # 0.1 核memory: "128Mi"    # 128 MBlimits: # Pod运行时的最大资源使用上限,cpu: "500m"        # 0.5 核(上限)memory: "256Mi"    # 256 MB(上限)

命名空间级别控制

关键策略对象:LimitRange
  • 在命名空间级别,可以使用LimitRange给整个命名空间设置默认值/最大值
  • LimitRange不仅仅是默认值的概念,也是一道硬性检查
    • 默认值:如果 Pod 或容器未显式声明 requests 或 limits,LimitRange 会自动注入默认值
    • 硬性检查:如果Pod或容器显式声明了request或者limits,但是不在 LimitRange的允许范围内不允许创建Pod
使用示例
apiVersion: v1
kind: LimitRange  #LimitRange类型对象
metadata:name: cpu-mem-limit #LimitRange对象名称namespace: dev #该策略适用的命名空间
spec: #定义策略具体规则limits: #limits为一个列表,可以包含多个限制策略- type: Container #表示该限制针对的是容器级别,而不是Pod或其他级别min: #指定容器资源的最小值,如果容器请求的资源低于这个值,K8s 会拒绝创建cpu: 100m #最少请求 0.1 个 CPU 核心memory: 128Mi #最少请求128M内存max: #超过这个值的容器会被拒绝创建cpu: 1 #最大请求1个CPU核心memory: 1Gi #最大请求1G内存default: #默认配置,当容器和Pod没有显式声明resources.limits,自动使用这里配置的默认值cpu: 500m #当容器和Pod没有显式声明resources.limits,默认resources.limits.cpu=500mmemory: 512Mi #当容器和Pod没有显式声明resources.limits,默认resources.limits.memory=512Mi defaultRequest: #默认配置,当容器和Pod没有显式声明resources.request,默认的requests数量,request: Pod最低的资源占用。调度器在将Pod指派给某个节点时,会检查该节点“可分配资源”是否满足request要求cpu: 200mmemory: 256MimaxLimitRequestRatio: #限制比例:限制与请求的最大比例,控制 limit/request 的最大比例。作用:防止用户设置过高的 limit 而请求很低的资源,防止节点资源被过度使用或者其他Pod的资源无法保证cpu: 2 # CPU的限制值不能超过请求值的2倍。如果请求是250M内存,则限制不能超过500M。如果超过这个比例,Pod 会被拒绝创建

命名空间/集群级别总量限制

关键对象:ResourceQuota
  • ResourceQuota是一种命名空间级别硬限制机制,作用是给每个命名空间设定资源总量红线
  • 一旦配额用满,任何导致超配的对象创建都会被拒绝,包括通过Deployment、StatefulSet等控制器间接创建的Pod
ResourceQuota作用范围
  • ResourceQuota控制的是集群节点级别的总量,还是命名空间的总量?
    • ResourceQuota控制的是单个命名空间资源的总量
    • 如果希望控制集群节点级别,需要多命名空间+ResourceQuota集群级策略(如 ClusterPolicy、PodNodeSelector、多集群联邦)来实现
ResourceQuota和LimitRange有什么区别
  • ResourceQuota限制的是整个命名空间资源的总量
  • LimitRange限制的是这个命名空间内,单个资源限制量默认值
  • 两者需要结合使用才能达到最佳效果
使用示例
  1. 确保准入控制器已启用
    • 大多数发行版默认已包含 --enable-admission-plugins=ResourceQuota;若手动搭建,需在 kube-apiserver 启动参数里加入
  2. 编写YML并应用
apiVersion: v1
kind: ResourceQuota #类型为ResourceQuota
metadata:name: team-a-quota #名称namespace: team-a #作用的命名空间
spec:hard: #hard 是一个 map,key 是被限制的资源类型,value 是字符串形式的硬性上限requests.cpu: "20" #该命名空间内所有 非终止状态 Pod 的 spec.containers[*].resources.requests.cpu 之和 ≤ 20 CPU(= 20 核)requests.memory: 40Gi #所有 Pod 的 requests.memory 总和 ≤ 40 GiBlimits.cpu: "40" #所有 Pod 的 limits.cpu 总和 ≤ 40 核limits.memory: 80Gi #所有 Pod 的 limits.memory 总和 ≤ 80 GiBpods: "50" #命名空间里当前存在的 Pod 对象数量 ≤ 50 个(Running / Pending / Succeeded 都算,Failed 或 Completed 且 TTL 已过的不算)persistentvolumeclaims: "10" #PVC 对象总数 ≤ 10 个count/deployments.apps: "15" #apps/v1 组下的 Deployment 对象 ≤ 15 个
  1. 查看配额使用/剩余
kubectl describe quota <ResourceQuota名称> -n <命名空间>

引申问题1:LimitRange限制了容器最大使用资源,如果使用中超过这个限制,会发生什么

  • 结论
    • 最终表现是容器会被OOMKilled
  • 原因
    • LimitRange属于准入控制,即在Pod创建/更新时作限制校验,如果超出或低于限制要求,则不允许创建
    • Pod创建完后LimitRange任务结束,不再发挥作用
    • 实际的运行时限制,是由cgroup 和 kubelet 负责,限制的方式也不是拒绝分配,而是直接杀掉

引申问题2:如果容器资源一旦超限就OOMKilled,如何保证应用稳定性?

  1. 预估
    • 在配置上线前,充分压测评估出最大峰值
    • 给足安全余量,一般要在压测峰值上再加20%-50%作为安全余量
  2. 观察
    • 上线后持续观察,并设置预警措施
  3. 调优
    • 发现不足就及时调大,并滚动升级
    • 垂直扩容(加大limit限制值)
    • 水平扩容(拆业务、分片、增加副本数,降低单实例负载)
    • 应用层优化(减少缓存大小、调整GC参数、使用内存池、对象复用)**
  4. 兜底
    • 保证即使有实例被OOMKilled,其余实例还可以承载流量

引申问题3:LimitRange 和 ResourceQuota 对已有 Pod 有什么影响

这是一个非常重要的问题,涉及 Kubernetes 中资源限制策略的生效范围和时效性

✅ 1. LimitRange 对已有 Pod 的影响
  • 不会影响已存在的 Pod
  • LimitRange 只在 新创建的 Pod 或容器 时生效。
  • 它的作用是在 Pod 创建时:
    • 自动补全 resources.requestsresources.limits
    • 验证资源是否在允许范围内。

🔍 如果已有 Pod 的资源配置超过了 LimitRange 的 max 限制

  • 不会强制修改或终止这些 Pod。
  • 它们会继续运行,直到被手动删除或更新。
  • 只有在重新创建或更新 Pod 时,才会触发 LimitRange 的验证。

✅ 2. ResourceQuota 对已有 Pod 的影响
  • 不会强制终止或修改已存在的 Pod
  • ResourceQuota 是针对命名空间资源总量的限制。
  • 它在创建新资源时检查是否超过配额。

🔍 如果已有资源已经超过了配额限制

  • 不会影响这些资源的运行。
  • 无法再创建新的资源,直到资源使用量低于配额。

🧠 举个例子

假设你在 dev 命名空间中设置了如下配额:

limits.cpu: "4"

而已有 Pod 总共使用了 5 个 CPU:

  • ✅ 已有 Pod 不会被删除或停止。
  • ❌ 新 Pod 无法创建,除非已有 Pod 被删除或资源使用量降低。

📌 总结
特性LimitRangeResourceQuota
是否影响已有 Pod❌ 不影响❌ 不影响
是否影响新建 Pod✅ 生效✅ 生效
是否强制修改已有资源❌ 不会❌ 不会
是否阻止新资源创建✅(不符合规则)✅(超出配额)

✅ 建议做法
  • 在设置 LimitRangeResourceQuota 前,先评估当前命名空间资源使用情况。
  • 使用 kubectl describe quotakubectl top pod 查看资源使用。
  • 如果想让“老 Pod”也受新限制,只能人工或自动化地做:手动滚动重启 Deployment/StatefulSet → 新 Pod 走新规则。
  • 配合策略引擎(如 Kyverno)实现更强的资源治理。

注意事项

  1. LimitRange 和 ResourceQuota设置前,已有存在的pod,这部分Pod不会不受影响
  2. 一个命名空间建议只创建一个
  3. 多租户集群,防止某个用户的 Pod 占用过多资源
  4. CICD环境,限制测试 Pod 的最大资源,防止资源争抢
  5. 为未声明资源的容器自动分配合理默认值,避免调度失败

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

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

相关文章

量子神经网络:从NISQ困境到逻辑比特革命的破局之路

——解析2025千比特时代开发者的机遇与行动框架 引言:量子计算的“20比特魔咒”与千比特悖论 当开发者被建议“避免在>20量子比特电路训练”时,富士通却宣布2025年实现10,000物理比特系统。这一矛盾揭示了量子计算从NISQ时代向FTQC时代跃迁的核心逻辑:千比特突破非为直接…

react+vite-plugin-react-router-generator自动化生成路由

前言&#xff1a;react项目实际使用中有很多提升性能与功能的插件&#xff0c;今天来说一说vite里面提供的vite-plugin-react-router-generator&#xff0c;他主要提供了自动生成路由的功能&#xff0c;配合我们的loadable/component可以实现路由的懒加载与统一管理。1、实现效…

服务器查看 GPU 占用情况的方法

在 Linux 系统中查看 GPU 占用情况&#xff0c;主要取决于你的 GPU 类型&#xff08;NVIDIA/AMD&#xff09;&#xff0c;以下是常用方法&#xff1a; 一、NVIDIA GPU&#xff08;最常用&#xff0c;如 RTX 系列、Tesla 系列&#xff09; 使用 NVIDIA 官方工具 nvidia-smi&…

【Docker实战进阶】Docker 实战命令大全

Docker 实战命令大全 Docker 实战场景&#xff0c;以 Nginx 为核心示例&#xff0c;梳理容器生命周期、镜像管理、网络配置、数据持久化及 Compose 编排的核心命令与最佳实践。 一、容器生命周期管理 1. 基础生命周期命令 docker run - 创建并启动容器 核心功能&#xff1a;基于…

PyCharm 2025.2:面向工程师的 AI 工具

引言 随着人工智能技术的快速发展&#xff0c;AI 工程师对开发工具的需求也在不断提升。PyCharm 2025.2 版本带来了革命性的 AI 工具包&#xff0c;将 AI 开发所需的实验、调试、评估和部署功能原生集成到 IDE 中。这一重大更新不仅提升了开发效率&#xff0c;也为 AI 工程师提…

爬虫逆向--Day15--核心逆向案例2(Python逆向实现请求加密、请求堆栈、拦截器关键字)

一、逆向案例之Python逆向实现请求加密//具体代码如下 function l(t, e) {return t.toString().toUpperCase() > e.toString().toUpperCase() ? 1 : t.toString().toUpperCase() e.toString().toUpperCase() ? 0 : -1}function u(t) {for (var e Object.keys(t).sort(l)…

时序数据库市场前景分析

1. 引言随着物联网&#xff08;IoT&#xff09;、工业互联网、金融科技、智慧城市等领域的快速发展&#xff0c;数据呈现爆发式增长&#xff0c;其中时间序列数据&#xff08;Time-Series Data&#xff09;占据了重要地位。时序数据库&#xff08;Time-Series Database, TSDB&a…

【网络安全测试】Burp Suite使用指导、配置及常见问题介绍(有关必回)

Burp Suite 是**渗透测试领域事实上的标准工具**&#xff0c;尤其擅长Web应用与API安全测试。针对AI系统&#xff0c;它主要用于测试模型API、管理后台等Web接口。以下是专业级使用指南&#xff1a;---### **一、 核心模块与功能概览**| **模块** | **核心功能** | **AI测试重点…

iOS 26 一键登录失效:三大运营商 SDK 无法正常获取手机号

近期&#xff0c;不少开发者和用户反馈&#xff0c;在升级到 iOS 26 系统后&#xff0c;App 内的 一键登录功能无法正常使用。无论是移动、电信还是联通的 SDK&#xff0c;都会出现无法获取手机号的情况&#xff0c;导致用户需要改用短信验证码或手动输入手机号完成登录。问题现…

OpenLayers与Vue.js结合实现前端地图应用

OpenLayers与Vue.js结合实现前端地图应用 下面我将为您展示如何将OpenLayers与Vue.js结合创建一个功能丰富的前端地图应用。这个教程包含了基础地图展示、标记点、地图控件以及交互功能。 实现结果 实现思路 在Vue项目中集成OpenLayers库创建基础地图视图和OSM图层添加标记点…

VisDrone数据集,专为无人机视觉任务打造

在农业巡查、环保监测、安防布控等广阔天地&#xff0c;无人机&#xff08;UAV&#xff09;早已超越了“拍照打卡”的酷炫标签&#xff0c;成为不可或缺的智能之眼。然而&#xff0c;当计算机视觉模型从地面“抬头”望向无人机视角时&#xff0c;迎接它的却是截然不同的挑战&am…

【Python】Python 函数基本介绍(详细版)​

Python 函数基本介绍&#xff08;详细版&#xff09;​ 文章目录Python 函数基本介绍&#xff08;详细版&#xff09;​前言一、函数的创建​1.1 函数名的命名规则​1.2 函数的创建​1.3 函数的调用​二、函数的参数​2.1 形参和实参​2.2 位置参数​2.3 关键字参数​2.4 默认参…

【前端Vue】log-viewer组件的使用技巧

目录 修改行号和组件的样式 修改高亮显示的内容和颜色 **log-viewer组件合集** 【前端Vue】如何优雅地展示带行号的日志文件或文本内容&#xff08;log-viewer组件的使用&#xff09; 【前端Vue】使用log-viewer组件时的踩坑记录 【前端Vue】log-viewer组件的使用技巧 【前…

OpenCV Python——报错AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘,解决办法

Python在使用 bgsubmog cv2.bgsegm.createBackgroundSubtractorMOG() 去除背景&#xff0c;报错AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘ 报错原因&#xff1a;使用的python环境中没有安装扩展包contrib 可以通过pip或者conda安装 pip install opencv-con…

react + i18n:国际化

注意版本 我这是旧版 react react 16.8.6 i18next 20.6.1 react-i18next 11.18.6文件&#xff1a;zh.json {“hello”: "你好" }文件&#xff1a;en.json {“hello”: "hello" }文件&#xff1a;i18n.tsx import i18n from i18next; import { initRea…

lesson38:MySQL数据库核心操作详解:从基础查询到高级应用

目录 引言 一、条件查询&#xff1a;精准筛选数据 1.1 基本语法 1.2 比较运算符 1.3 逻辑运算符 1.4 特殊条件查询 1.4.1 模糊查询&#xff08;LIKE&#xff09; 1.4.2 IN和NOT IN 1.4.3 BETWEEN AND 1.4.4 IS NULL和IS NOT NULL 二、聚合函数&#xff1a;数据统计与…

【数据分析】调控网络分析:调节因子在肿瘤样本中的表达相关性与生存效应分析

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 数据准备与模拟 相关性分析与边表生成 网络可视化 结果展示与讨论 加载R包 模拟数据 Spearman 相关 -> 边表 画图 所有代码 总结 系统信息 介绍 在生物医学研究中,N⁶-甲基腺…

Flask中ORM的使用

Flask中ORM的使用 本文介绍Flask中ORM框架flask_sqlalchemy的基本使用&#xff0c;包含模型定义(简单模型&#xff0c;一对一&#xff0c;一对多&#xff0c;多对多等)&#xff0c;由于实际开发中很少使用物理外键&#xff0c;所有本文所有模型都不使用物理外键&#xff0c;而关…

FPGA即插即用Verilog驱动系列——高速12位ADC

实现功能&#xff1a;单通道ADC驱动&#xff0c;速率由驱动的时钟决定12位数据并行&#xff0c;可轻松修改为其他位宽&#xff0c;适应不同的ADC模块将ADC输入的unsigned数据转换为signed&#xff0c;便于后续FIR&#xff0c;MULTI操作匹配AXI4-STREAM协议&#xff0c;有tvalid…

DeepSeek 部署中的常见问题及解决方案:从环境配置到性能优化的全流程指南

一、引言随着大模型技术的发展&#xff0c;以 DeepSeek 为代表的开源中文大模型&#xff0c;逐渐成为企业与开发者探索私有化部署、垂直微调、模型服务化的重要选择。然而&#xff0c;模型部署的过程并非 “一键启动” 那么简单。从环境依赖、资源限制&#xff0c;到推理性能和…