资源限制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]# 
posted @ 2024-01-16 23:34  尹正杰  阅读(29)  评论(0编辑  收藏  举报