K8s进阶之LimitRange

概述

官方文档: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)

发表评论

评论已关闭。

相关文章