概述

官方文档:https://kubernetes.io/zh-cn/docs/concepts/policy/limit-range/

在 Kubernetes(K8s)中,LimitRange 是一种用于约束命名空间(Namespace)内资源配额的资源对象,主要作用是为 Pod 和容器设置资源使用的限制范围(如 CPU、内存等)。它可以定义资源的最小值、最大值、默认值以及比例限制,确保容器在合理的资源范围内运行,避免因资源分配不合理导致的集群性能问题或服务不稳定。

作用

  • 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
  • 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
  • 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
  • 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。
  • 在一个命名空间中,若某一个Pod或Container未设置最小和最大的资源使用量,可以为其设置默认值

配置示例

apiVersion: v1
kind: LimitRange
metadata:
name: comprehensive-limit
namespace: dev-team # 限制的namespace
spec:
limits:
# 容器级别限制
- type: Container
# 请求的最小cpu和内存限制,对应request的设置
min:
cpu: "100m"
memory: "256Mi"
# 请求的最大cpu和内存限制,对应的limits的设置
max:
cpu: "2"
memory: "4Gi"
# 默认的request设置,如果Container没有设置request,则默认使用这个值
defaultRequest:
cpu: "500m"
memory: "1Gi"
# 默认的limits设置,如果Container没有设置limit,则默认使用这个值
default:
cpu: "1"
memory: "2Gi"
# 控制request和limits设置的比例,如果request.cpu设置为1,那么limits.cpu不能超过2,
# memory同理
maxLimitRequestRatio:
cpu: "2"
memory: "1.5" # Pod级别限制
- type: Pod
max:
cpu: "4" # 整个Pod的CPU总和不得超过4核
memory: "8Gi" # 整个Pod的内存总和不得超过8GB # PVC限制
- type: PersistentVolumeClaim
min:
storage: "1Gi"
max:
storage: "20Gi"

实战案例

创建LimitRange

先创建一个namespace

[root@master ~]# kubectl create namespace sit-team
namespace/sit-team created
[root@master ~]# kubectl get ns sit-team
NAME STATUS AGE
sit-team Active 8s

创建LimitRange,namespace需要选中上一步创建的名称空间

# 定义LimitRange
[root@master ~/limits]# cat sit-limits.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: sit-team-limits
# 限制的namespace
namespace: sit-team
spec:
limits:
# 容器级别限制
- type: Container
# 请求的最小cpu和内存限制,对应request的设置
min:
cpu: "100m"
memory: "256Mi"
# 请求的最大cpu和内存限制,对应的limits的设置
max:
cpu: "1"
memory: "1Gi"
# 默认的request设置,如果Container没有设置request,则默认使用这个值
defaultRequest:
cpu: "500m"
memory: "500Mi"
# 默认的limits设置,如果Container没有设置limit,则默认使用这个值
default:
cpu: "1"
memory: "1Gi"
# 控制request和limits设置的比例,如果request.cpu设置为1,那么limits.cpu不能超过2,
# memory同理
maxLimitRequestRatio:
cpu: "2.5"
memory: "2.5" # Pod级别限制
- type: Pod
max:
# 整个Pod的CPU总和不得超过4核
cpu: "4"
# 整个Pod的内存总和不得超过8GB
memory: "8Gi" # PVC限制
- type: PersistentVolumeClaim
# 最小的存储容量
min:
storage: "1Gi"
# 最大的存储容量
max:
storage: "20Gi" # 创建limits
[root@master ~/limits]# kubectl apply -f sit-limits.yaml
limitrange/sit-team-limits created

查看LimitRange

[root@master ~/limits]# kubectl get limits -n sit-team
NAME CREATED AT
sit-team-limits 2025-05-26T03:12:30Z # 查看详情
[root@master ~/limits]# kubectl describe limits sit-team-limits -n sit-team
Name: sit-team-limits
Namespace: sit-team
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container memory 256Mi 1Gi 500Mi 1Gi 1500m
Container cpu 100m 1 500m 1 2
Pod memory - 8Gi - - -
Pod cpu - 4 - - -
PersistentVolumeClaim storage 1Gi 20Gi - - -

创建Pod验证LimitRange

创建一个Pod,不设置request和limits

[root@master ~/limits]# cat pod-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: sit-team
spec:
containers:
- name: nginx-container-1
image: nginx:latest
[root@master ~/limits]# kubectl apply -f pod-1.yaml
pod/nginx-pod created # 查看一下详细信息,发现对应的limits和requests和我们配置limitRange的默认值一样
[root@master ~/limits]# kubectl describe po nginx-pod -n sit-team | grep -A 2 -Ei 'limits|requests'
Limits:
cpu: 1
memory: 1Gi
Requests:
cpu: 500m
memory: 500Mi

创建一个Pod,将limits和requests设置超出limitRange的范围,看看会发生什么

[root@master ~/limits]# cat pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-1
namespace: sit-team
spec:
containers:
- name: nginx-container
image: nginx:latest
resources:
limits:
cpu: "2"
memory: "2Gi"
requests:
cpu: "1"
memory: "1Gi" # 创建Pod,发现创建Pod失败了
[root@master ~/limits]# kubectl apply -f pod-2.yaml
Error from server (Forbidden): error when creating "pod-2.yaml": pods "nginx-pod-1" is forbidden: [maximum cpu usage per Container is 1, but limit is 2, maximum memory usage per Container is 1Gi, but limit is 2Gi]

LimitRange使用注意事项

  • 一个命名空间中理论上可以存在多个LimitRange,但是当有多个LimitRange时,以哪一个为基准是不确定的。所以我们在一个命名空间中创建一个LimitRange即可

  • LimitRange是做的准入检查,在LimitRange创建之前已存在的Pod或容器不受影响

  • LimitRange通常和ResourceQuota结合起来使用

学习ResourceQuota可以阅读这篇文章:K8s进阶之多租户场景下的资源配额(ResourceQuota)

K8s进阶之LimitRange的更多相关文章

  1. kubernetes 故障排除、处理、预防

    kubernetes 故障排除.处理.预防 故障排除顺序和思路 第一步: 我们可以通过查看节点是否正常,一是保证 K8S API Server 是正常的,二是可以查看节点集群网络中是否存在节点异常.如 ...

  2. Kubernetes容器编排探索与实践v1.22.1-上半部分

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Kubernetes官网地址 https://kubernetes.io Kubernetes GitHub源码地址 htt ...

  3. 云原生时代之Kubernetes容器编排初步探索及部署、使用实战-v1.22

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Kubernetes官网地址 https://kubernetes.io Kubernetes GitHub源码地址 htt ...

  4. kubernetes进阶(六)k8s平滑升级

    当我们遇到K8S有漏洞的时候,或者为了满足需求,有时候可能会需要升级或者降级版本, 为了减少对业务的影响,尽量选择在业务低谷的时候来升级: 首先准备好文件:我这里选择的是内网文件服务器上下载的,请自行 ...

  5. k8s核心资源之namespace与pod污点容忍度生命周期进阶篇(四)

    目录 1.命名空间namespace 1.1 什么是命名空间? 1.2 namespace应用场景 1.3 namespacs常用指令 1.4 namespace资源限额 2.标签 2.1 什么是标签 ...

  6. K8s 资源范围管理对象 LimitRange

    默认情况下如果创建一个 Pod 没有设置 Limits 和 Requests 对其加以限制,那么这个 Pod 可能能够使用 Kubernetes 集群中全部资源, 但是每创建 Pod 资源时都加上这个 ...

  7. k8s 的pod进阶

    容器探测的具体实现方法:三种探针类型 ExecAction.TCPSocketAction.HTTPGetAction lifecycle <Object> Actions that th ...

  8. 【云计算】Docker云平台—Docker进阶

    Docker云平台系列共三讲,此为第二讲:Docker进阶 参考资料: 五个Docker监控工具的对比:http://www.open-open.com/lib/view/open1433897177 ...

  9. k8s中yaml文常见语法

    在k8s中,所有的配置都是 json格式的.但为了读写方便,通常将这些配置写成yaml 格式,其运行的时候,还是会靠yaml引擎将其转化为json,apiserver 也仅接受json的数据类型. y ...

  10. 关于PHP架构师进阶的一些思考

    相信大家都有感觉,就是当程序员写业务写了几年后,就会有想进阶的想法,技术方面当然就是架构师了,然后具体从哪些方面丰富自己才能个达到目的呢?大部分人可能会很迷茫,当然也包括我, 最近和很多大牛交流了一些 ...

随机推荐

  1. C# 超大数据量导入 SqlBulkCopy

    1 public static void ImportTempTableDataIndex(DataSet ds,string TempTableName,string strSqlConnectio ...

  2. layui 自动触发radio和select

    layui对radio和select做了包装,正常用jquery选中后使用trigger不起作用. 那么,怎么让其自动触发呢? 对radio来说,必须在$选中后.next('.layui-form-r ...

  3. C# 搭建一个 基于ISqlSugarClient 三层架构框架 涉及数据库仓储 然后中间又有业务逻辑层 案例

    要在C#中搭建基于ISqlSugarClient的三层架构框架,你需要定义数据访问层(DAL).业务逻辑层(BLL)和表现层(UI).下面是一个完整的例子,涉及数据库仓储.业务逻辑层,以及依赖注入.这 ...

  4. 【基础知识笔记】004 matlab-矩阵和数组的关系

    之前以为是两种东西,今天看了mathworks的官网才知道 所有 MATLAB 量都是多维数组,与数据类型无关.矩阵是指通常用来进行线性代数运算的二维数组 1.数组创建 要创建每行包含四个元素的数组, ...

  5. 震惊!C++程序真的从main开始吗?99%的程序员都答错了

    嘿,朋友们好啊!我是小康.今天咱们来聊一个看似简单,但实际上99%的C++程序员都答错的问题:C++程序真的是从main函数开始执行的吗? 如果你毫不犹豫地回答"是",那恭喜你,你 ...

  6. 搭建自己的OCR服务,第二步:PaddleOCR环境安装

    PaddleOCR环境安装,遇到了很多问题,根据系统不同问题也不同,不要盲目看别人的教程,有的教程也过时了,根据实际情况自己调整. 我这边目前是使用windows 10系统+CPU + python ...

  7. C#/.NET/.NET Core技术前沿周刊 | 第 30 期(2025年3.10-3.16)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  8. wordpress:nginx负载均衡+nignweb服务器+mysql数据库+nfs-lsync+rsync备份

    目录 所有知识结合,注意正式环境慎用: mariadb服务器 NFS服务器配置 web服务器配置 Nginx负载均衡 backup备份服务器配置rsync NFS服务器安装lsync进行实时同步 所有 ...

  9. windows下测试TCP/UDP端口连通性

    一.简介 最近调试项目的时候有需要测试UDP连接,所以顺便研究了一下. MaQaQ:省流,不介意下载工具的话就直接拉到最后看Advanced Port Scanner. 二.TCP 1.telnet( ...

  10. bug|Git Hooks pre-commit|git 提交代码报错|error: 'describe' 'it' 'expect' is not defined (no-undef)|pre-commit hook failed (add --no-verify to bypass)|

    前言 今天学习 jest 的 vue-test-utils 的配置及使用. 报错原因为 jest 全局变量 git 提交代码报错,使用除了参考链接里的解决方案,正好复习一下之前学习的 Git Hook ...