资源限制LimitRange

简介: 文章介绍了Kubernetes中的资源限制(LimitRange)功能,包括它的概念、如何设置计算资源和存储资源的限制,并通过实战案例展示了如何应用这些限制。

一.资源限制LimitRange概述

1.什么是资源限制

默认情况下, Kubernetes集群上的容器运行使用的计算资源没有限制。 

使用Kubernetes资源配额, 管理员(也称为集群操作者)可以在一个指定的命名空间内限制集群资源的使用与创建。 在命名空间中,一个 Pod 最多能够使用命名空间的资源配额所定义的 CPU 和内存用量。 

作为集群操作者或命名空间级的管理员,你可能也会担心如何确保一个Pod不会垄断命名空间内所有可用的资源。

LimitRange是限制命名空间内可为每个适用的对象类别 (例如 Pod 或 PersistentVolumeClaim) 指定的资源分配量(限制和请求)的策略对象。

一个 LimitRange(限制范围) 对象提供的限制能够做到:
    - 在一个命名空间中实施对每个 Pod 或 Container 最小和最大的资源使用量的限制。
    - 在一个命名空间中实施对每个 PersistentVolumeClaim 能申请的最小和最大的存储空间大小的限制。
    - 在一个命名空间中实施对一种资源的申请值和限制值的比值的控制。
    - 设置一个命名空间中对计算资源的默认申请/限制值,并且自动的在运行时注入到多个 Container 中。


当某命名空间中有一个 LimitRange 对象时,将在该命名空间中实施LimitRange限制。LimitRange 的名称必须是合法的 DNS 子域名。


参考链接:
    https://kubernetes.io/zh-cn/docs/concepts/policy/limit-range/

2.资源限制LimitRange和请求的约束

- 管理员在一个命名空间内创建一个 LimitRange 对象。

- 用户在此命名空间内创建(或尝试创建) Pod 和 PersistentVolumeClaim 等对象。

- 首先,LimitRanger 准入控制器对所有没有设置计算资源需求的所有 Pod(及其容器)设置默认请求值与限制值。

- 其次,LimitRange 跟踪其使用量以保证没有超出命名空间中存在的任意 LimitRange 所定义的最小、最大资源使用量以及使用量比值。

- 若尝试创建或更新的对象(Pod 和 PersistentVolumeClaim)违反了 LimitRange 的约束, 向 API 服务器的请求会失败,并返回 HTTP 状态码 403 Forbidden 以及描述哪一项约束被违反的消息。

- 若你在命名空间中添加 LimitRange 启用了对 cpu 和 memory 等计算相关资源的限制, 你必须指定这些值的请求使用量与限制使用量。否则,系统将会拒绝创建 Pod。

- LimitRange 的验证仅在 Pod 准入阶段进行,不对正在运行的 Pod 进行验证。 如果你添加或修改 LimitRange,命名空间中已存在的 Pod 将继续不变。

- 如果命名空间中存在两个或更多 LimitRange 对象,应用哪个默认值是不确定的。

二.资源限制LimitRange实战案例

1.计算资源最大,最小限制

1.1 设置容器的最大值和最小值限制资源

[root@master231 02-LimitRange]# cat 01-cpu-memory-min-max.yaml 
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-memory-min-max
  namespace: kube-public
spec:
  limits:
    # 容器能设置limit的最大值
  - max:
      cpu: 2
      memory: 4Gi
    # 容器能设置limit的最小值
    min:
      cpu: 200m
      memory: 100Mi
    # 限制的类型是容器
    type: Container
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 01-cpu-memory-min-max.yaml 
limitrange/cpu-memory-min-max created
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl -n kube-public get limits
NAME                 CREATED AT
cpu-memory-min-max   2024-01-09T14:45:28Z
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl -n kube-public describe limits cpu-memory-min-max 
Name:       cpu-memory-min-max
Namespace:  kube-public
Type        Resource  Min    Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---    ---  ---------------  -------------  -----------------------
Container   memory    100Mi  4Gi  4Gi              4Gi            -
Container   cpu       200m   2    2                2              -
[root@master231 02-LimitRange]# 


温馨提示:
    注意,上面有一个"Default Request"和"Default Limit"选项,表示当用户没有设置资源限制相关字段时,就是用该默认值哟。

1.2 小于requests样例测试

[root@master231 02-LimitRange]# cat 02-pods.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pods-nginx
  namespace: kube-public
spec:
  containers:
  - name: web
    image: nginx:1.20.1-alpine
    resources:
      requests:
        cpu: 0.1
        memory: 1Gi
      limits:
        cpu: 1
        memory: 2Gi
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 02-pods.yaml 
Error from server (Forbidden): error when creating "02-pods.yaml": pods "pods-nginx" is forbidden: minimum cpu usage per Container is 200m, but request is 100m
[root@master231 02-LimitRange]#

1.3 大于limits样例测试

[root@master231 02-LimitRange]# cat 03-pods.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pods-nginx-02
  namespace: kube-public
spec:
  containers:
  - name: web
    image: nginx:1.20.1-alpine
    resources:
      requests:
        cpu: 0.5
        memory: 1Gi
      limits:
        cpu: 1
        memory: 5Gi
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 03-pods.yaml
Error from server (Forbidden): error when creating "03-pods.yaml": pods "pods-nginx" is forbidden: maximum memory usage per Container is 4Gi, but limit is 5Gi
[root@master231 02-LimitRange]#

1.4 不设置resources字段

[root@master231 02-LimitRange]# cat 04-pods.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pods-nginx-04
  namespace: kube-public
spec:
  containers:
  - name: web
    image: nginx:1.20.1-alpine
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 04-pods.yaml 
pod/pods-nginx-04 created
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl -n kube-public get pods pods-nginx-04 -o yaml  | grep resources -A 6
    resources:
      limits:
        cpu: "2"
        memory: 4Gi
      requests:
        cpu: "2"
        memory: 4Gi
[root@master231 02-LimitRange]#

1.5 设置合法的resources字段

[root@master231 02-LimitRange]# cat 05-pods.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pods-nginx-05
  namespace: kube-public
spec:
  containers:
  - name: web
    image: nginx:1.20.1-alpine
    resources:
      requests:
        cpu: 0.5
        memory: 1Gi
      limits:
        cpu: 2
        memory: 3Gi
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 05-pods.yaml 
pod/pods-nginx-05 created
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl -n kube-public get pods pods-nginx-04 -o yaml  | grep resources -A 6
    resources:
      limits:
        cpu: "2"
        memory: 4Gi
      requests:
        cpu: "2"
        memory: 4Gi
[root@master231 02-LimitRange]# 


温馨提示:
    不难发现,我们创建时,指定的"requests.cpu"是"0.5",而"requests.memory"是"1Gi",但实际上运行时却是我们设置的默认的最小值哟~

2.计算资源默认值限制

2.1 设置容器的默认限制资源

[root@master231 02-LimitRange]# cat 06-cpu-memory-default.yaml 
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-memory-min-max-default
  namespace: kube-public
spec:
  limits:
  - max:
      cpu: 2
      memory: 4Gi
    min:
      cpu: 200m
      memory: 100Mi
    type: Container
    # 设置默认值的Request
    defaultRequest:
      cpu: 200m
      memory: 500Mi
    # 设置默认值的Limit
    default:
      cpu: 1
      memory: 2Gi
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 06-cpu-memory-default.yaml
limitrange/cpu-memory-min-max-default created
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl  -n kube-public describe limitrange cpu-memory-min-max-default
Name:       cpu-memory-min-max-default
Namespace:  kube-public
Type        Resource  Min    Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---    ---  ---------------  -------------  -----------------------
Container   cpu       200m   2    200m             1              -
Container   memory    100Mi  4Gi  500Mi            2Gi            -
[root@master231 02-LimitRange]#

2.2 不设置resources字段验证

[root@master231 02-LimitRange]# cat 07-pods.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pods-nginx-07
  namespace: kube-public
spec:
  containers:
  - name: web
    image: nginx:1.20.1-alpine
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 07-pods.yaml
pod/pods-nginx-07 created
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl -n kube-public get pods pods-nginx-07 -o yaml | grep resources -A 6
    resources:
      limits:
        cpu: "1"
        memory: 2Gi
      requests:
        cpu: 200m
        memory: 500Mi
[root@master231 02-LimitRange]#

3.存储资源最大,最小限制

2.1 设置指定范围的存储资源限制

[root@master231 02-LimitRange]# cat 08-storage-min-max.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: storage-min-max
  namespace: kube-public
spec:
  limits:
  - type: PersistentVolumeClaim
    max:
      storage: 10Gi
    min:
      storage: 1Gi
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 08-storage-min-max.yaml
limitrange/storage-min-max created
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl -n kube-public describe limitrange storage-min-max 
Name:                  storage-min-max
Namespace:             kube-public
Type                   Resource  Min  Max   Default Request  Default Limit  Max Limit/Request Ratio
----                   --------  ---  ---   ---------------  -------------  -----------------------
PersistentVolumeClaim  storage   1Gi  10Gi  -                -              -
[root@master231 02-LimitRange]#

2.2 小于min样例测试

[root@master231 02-LimitRange]# cat 09-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo-09
  namespace: kube-public
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 0.5Gi
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 09-pvc.yaml 
Error from server (Forbidden): error when creating "09-pvc.yaml": persistentvolumeclaims "pvc-demo-09" is forbidden: minimum storage usage per PersistentVolumeClaim is 1Gi, but request is 512Mi
[root@master231 02-LimitRange]#

2.3 大于max样例测试

[root@master231 02-LimitRange]# cat 10-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo-10
  namespace: kube-public
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 15Gi
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 10-pvc.yaml
Error from server (Forbidden): error when creating "10-pvc.yaml": persistentvolumeclaims "pvc-demo-10" is forbidden: maximum storage usage per PersistentVolumeClaim is 10Gi, but request is 15Gi
[root@master231 02-LimitRange]#

2.4 设置合法的存储大小字段

[root@master231 02-LimitRange]# cat 11-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo-11
  namespace: kube-public
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
[root@master231 02-LimitRange]# 
[root@master231 02-LimitRange]# kubectl apply -f 11-pvc.yaml
persistentvolumeclaim/pvc-demo-11 created
[root@master231 02-LimitRange]#
目录
相关文章
|
12月前
|
SQL 监控 安全
OpenWAF配置本地资源访问
OpenWAF配置本地资源访问
|
弹性计算 数据可视化 关系型数据库
资源
资源
|
消息中间件 存储 弹性计算
资源总结
资源总结
GameMakerStudio学习资源
GameMakerStudio学习资源
88 0
|
人工智能 JSON 前端开发
学习资源
大家好,推荐一些学习资源给大家 当然大家可以留言评论自己发现的优秀资源地址
|
安全 程序员 编译器
借来的资源,如何还的潇洒?
本文的内容将专门对付内存管理,培养起有借有还的好习惯,方可消除资源管理的问题。
借来的资源,如何还的潇洒?
|
监控 API C#
C#多线程(5):资源池限制
C#多线程(5):资源池限制
195 0
C#多线程(5):资源池限制
获取资源那些事
获取资源那些事
130 0
|
IDE 程序员 C#
一点C++学习资源
工具篇 Clion,大名鼎鼎的Jetbrains公司的C/C++ 集成开发环境,你可能没听说过Jetbrains,但是你肯定听说过Intellij IDEA。
1830 1
|
Kubernetes 容器 Perl
K8S如何限制资源使用
本文介绍几种在K8S中限制资源使用的几种方法。 资源类型 在K8S中可以对两类资源进行限制:cpu和内存。 CPU的单位有: 正实数,代表分配几颗CPU,可以是小数点,比如0.5代表0.5颗CPU,意思是一颗CPU的一半时间。
1725 0