K8S资源管理之LimitRange

资源配置范围管理:LimitRange

在默认情况下,Kubernetes不会对Pod加CPU和内存的限制,这意味着Kubernetes系统中的任何Pod都可以使用其节点的所有可用的CPU和内存。

如果一个机器的Pod特别多,我们又不愿意为每个Pod都配置上Requests和Limits,我们可以对集群内Requests和Limits的配置做一个全局限制,常见的配置场景如下:

1.集群中的诶个节点都有2GB内存,集群管理员不希望任何Pod申请超过2GB的内存,可以在系统管理功能中设置禁止Pod申请超过2GB内存。

2.集群由同一个组织中的两个团队共享,分别为生产环境和开发环境。生产环境最多可以使用8GB诶存,而开发环境最多可以使用512MB内存。集群管理员希望通过为这两个环境创建不同的namespace,并为每个namespace都设置不同的限制来满足这个要求。

3.用户创建Pod时使用的资源可能会刚好比整个机器的上限稍小,而恰好剩余的资源大小又不足以分配其他的Pod,这样就显得有点浪费,集群管理员希望将每个Pod都设置为必须至少使用集群平均值(CPU和内存)的20%,这样集群就能够提供更好的资源一致性调度,从而减少资源浪费。

下面我们举例说明:

1.创建一个名为limit-example的Namespace

复制代码
[root@k8s-master ~]# kubectl create namespace limit-example
namespace/limit-example created
[root@k8s-master ~]# kubectl get namespaces 
NAME              STATUS   AGE
default           Active   23d
kube-node-lease   Active   23d
kube-public       Active   23d
kube-system       Active   23d
limit-example     Active   7s

2.为命名空间设置LimitRange

复制代码
#1.创建limits.yaml文件
[root@k8s-master limit-example]# cat limits.yaml 
apiVersion: v1
kind: LimitRange
metadata:
  name: mylimits
spec:
  limits:
  - max:
      cpu: "4"
      memory: 2Gi
    min: 
      cpu: 200m
      memory: 6Mi
    maxLimitRequestRatio:
      cpu: 3
      memory: 2
    type: Pod
  - default:
      cpu: 300m
      memory: 200Mi
    defaultRequest:
      cpu: 200m
      memory: 100Mi
    max:
      cpu: "2"
      memory: 1Gi
    min: 
      cpu: 100m
      memory: 3Mi
    maxLimitRequestRatio:
      cpu: 5
      memory: 4
    type: Container
#2.创建该LimitRange:
[root@k8s-master limit-example]# kubectl create -f limits.yaml --namespace=limit-example
#3.查看limit-example中的LimitRange:
[root@k8s-master limit-example]# kubectl describe limits --namespace=limit-example
Name: mylimits
Namespace: limit- example
Type  		Resource   Min    Max    Default Request    Default Limit     Max Limit/Request Ratio
Pod    		cpu        200m   4       -                  -				  3
Pod    		memory     6Mi    2Gi     -                  -				  2
Container   cpu 	   100m   2       200m				 300m			  5
Container   memory     3Mi    1Gi     lOOMi				 200Mi			  4

(1).不论是CPU还是内存,在LimitRange中,Pod和Container都可以设置Min、Max和Max Limit/Requests Ratio参数。Container还可以设置Default Request和Default Limit参数,而Pod不能设置Default Request和Default Limit 参数。

(2).对Pod和Container的参数解释如下:

Container的Min(100m和3Mi)是Pod中所有容器的Requests值下限;

Container的Max(上面的2和lGi)是Pod中所有容器的Limits值上限;

Container的Default Request(上面的200m和100Mi)是Pod中所有未指定Requests值的容器的默认Requests值;

Container的Default Limit(上面的300m和200Mi)是Pod中所有未指定Limits值的容器的默认Limits值。

对于同一资源类型,这4个参数必须满足以下关系:Min≤Default Request≤Default Limit≤Max。

Pod的Min(上面的200m和6Mi)是Pod中所有容器的Requests值的总和下限;

Pod的Max(上面的4和2Gi)是Pod中所有容器的Limits值的总和上限。

容器未指定Requests值或者Limits值时,将使用Container的Default Request值或者Default Limit值。

Container的Max Limit/Requests Ratio(上面的5和4)限制了Pod中所有容器的Limits值与Requests值的比例上限;

而Pod的Max Limit/Requests Ratio(上面的3和2)限制了Pod中所有容器的Limits值总和与Requests值总和的比例上限。

(3).如果设置了Container的Max,那么对于该类资源而言,整个集群中的所有容器都必须设置Limits,否则无法成功创建。Pod内的容器未配置Limits时,将使用Default Limit额值(上面的300m CPU和200MiB内存),如果也未配置Default,则无法成功创建。

(4).如果设置了Container的Min,那么对于该类资源而言,整个集群中的所有容器都必须设置Requests。如果创建Pod的容器时未配置该类资源的Requests,那么在创建过程中会报验证错误。Pod里容器的Requests在未配置时,可以使用默认值defaultRequest(本例中的200m CPU 和100MiB内存);如果未配置而且没有使用默认值defaultRequest,那么默认等千该容器的Limits;如果容器的Limits也未定义,就会报错。

(5).对于任意一个Pod而言,该Pod中所有容器的Requests总和都必须大于或等于6MiB,而且所有容器的Limits总和都必须小于或等于lGiB;同样,所有容器的CPURequests总和都必须大于或等于200m,而且所有容器的CPU Limits总和都必须小于或等于2 。

(6).Pod里任何容器的Limits与Requests的比例都不能超过Container的Max Limit/Requests Ratio;Pod里所有容器的Limits总和与Requests总和的比例都不能超过Pod的Max Limit/Requests Ratio。

3.创建Pod时触发LimitRange限制

我们来举例说明LimitRange生效时对容器的资源限制效果

命名空间中的LimitRange只会在Pod创建或者更新时执行检查 。 如果手动修改LimitRange为一个新的值,那么这个新的值不会去检查或限制之前已经在该命名空间中创建好的Pod

如果在创建Pod时配置的资源值(CPU或者内存)超出了LimitRange的限制,那么该创建过程会报错,在错误信息中会说明详细的错误原因。

我们现在先创建一个pod

复制代码
[root@k8s-master limit-example]#kubectl run nginx --image=nginx --replicas=l --namespace=limit-example
deployment "nginx " created

查看已创建的pod信息

复制代码
[root@k8s-master limit-example]#kubectl get pods -- namespace=limit-example
[root@k8s-master limit-example]#kubectl get pods nginx- 2040093540-sBvzu --namespace=l imi t-example -o yaml |grep resources -C 8
  resourceVersion : " 57 "
  selfLink: /api/vl/namespaces/limit-example/pods/nginx-2040093540-ivimu
  uid: 67b20 741 - f53b-lle5-b066 - 64510658e388
spec:
  containers:
  - image: nginx
    imagePull Policy: Always
    name: nginx
    resources:
      limiys:
      cpu: 300m
      memory: 200Mi
      requests:
      cpu: 200m
      memory: lOOMi
      terminationMessagePath: /dev/termination-log
      volumeMouns:

由于该Pod未配置资源Requests和Limits, 所以使用了namespace limit-example中的默认CPU和内存定义的Requests和Limits值

我们在创建一个超出资源限制的Pod

复制代码
[root@k8s-master limit-example]#cat invalid-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
  name: invalid-pod
spec:
  containers:
  - name: kubernetes-serve-hostname
    image: gcr.io/google_containers/serve_hostname
    resources:
    limits:
    cpu: "3 "
    memory: 100Mi

创建该Pod, 可以看到系统报错,并且提供的错误原因为超过资源限制:

kubectl create -f invalid-pod.yaml --namespace=limit-example

Error from server:error when creating "invalid-pod.yaml": Pod " invalid-pod" is forbidden: Maximum cpu usage per Pod is 2 , but limit is 3,Maximum cpu usage per Container is 2 , but limit is 3.

相关推荐
运维老郭10 小时前
【K8s运维实战】Kubernetes临时存储卷实战:emptyDir核心用法与gitRepo弃用迁移指南
运维·云原生·kubernetes
AAA@峥13 小时前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
十年磨一剑~15 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka
gs8014017 小时前
记一次多 Agent 架构在单节点 K8s 触发的 PID 耗尽与 Pod 驱逐(Evicted)大摸排
容器·架构·kubernetes
bukeyiwanshui17 小时前
20260701 k8s Metric Server
容器·贪心算法·kubernetes
江湖有缘18 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
鸿儒51720 小时前
MR-50国产化GPU docker配置方法
docker·容器·mr
Zhu75821 小时前
在k8s集群部署ApacheHadoop单节点单数据副本
云原生·容器·kubernetes
Akamai中国21 小时前
Akamai收购安全企业浏览器提供商LayerX
人工智能·云原生·云计算·云服务