谅潭好 发表于 2025-6-3 00:25:22

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
# kubectl create namespace sit-team
namespace/sit-team created
# kubectl get ns sit-team
NAME       STATUS   AGE
sit-team   Active   8s创建LimitRange,namespace需要选中上一步创建的名称空间
# 定义LimitRange
# 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
# kubectl apply -f sit-limits.yaml
limitrange/sit-team-limits created查看LimitRange

# kubectl get limits -n sit-team
NAME            CREATED AT
sit-team-limits   2025-05-26T03:12:30Z

# 查看详情
# kubectl describe limits sit-team-limits -n sit-team
Name:                  sit-team-limits
Namespace:             sit-team
Type                   ResourceMin    Max   Default RequestDefault LimitMax Limit/Request Ratio
----                   -----------    ---   ---------------------------------------------------
Container            memory    256Mi1Gi   500Mi            1Gi            1500m
Container            cpu       100m   1   500m             1            2
Pod                  memory    -      8Gi   -                -            -
Pod                  cpu       -      4   -                -            -
PersistentVolumeClaimstorage   1Gi    20Gi-                -            -创建Pod验证LimitRange

创建一个Pod,不设置request和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
# kubectl apply -f pod-1.yaml
pod/nginx-pod created

# 查看一下详细信息,发现对应的limits和requests和我们配置limitRange的默认值一样
# 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的范围,看看会发生什么
# 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失败了
# kubectl apply -f pod-2.yaml
Error from server (Forbidden): error when creating "pod-2.yaml": pods "nginx-pod-1" is forbidden: LimitRange使用注意事项


[*]一个命名空间中理论上可以存在多个LimitRange,但是当有多个LimitRange时,以哪一个为基准是不确定的。所以我们在一个命名空间中创建一个LimitRange即可
[*]LimitRange是做的准入检查,在LimitRange创建之前已存在的Pod或容器不受影响
[*]LimitRange通常和ResourceQuota结合起来使用
学习ResourceQuota可以阅读这篇文章:K8s进阶之多租户场景下的资源配额(ResourceQuota)

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: K8s进阶之LimitRange