侧边栏壁纸
博主头像
cloudnative-blog博主等级

I can break through the limitations !

  • 累计撰写 23 篇文章
  • 累计创建 12 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

三.资源配额

周锐豪
2023-12-05 / 0 评论 / 0 点赞 / 45 阅读 / 9521 字 / 正在检测是否收录...

一.资源配额

1.简介

    request(资源需求):即运行pod的节点必须满足运行pod的最基本需求才能运行pod。
    limit(资源限制):即运行pod期间,可能内存使用量会增加,那最多能使用多少内存,这就是资源限额。

2.资源类型

    CPU的单位是核心数,内存的单位是字节。
    一个容器申请0.5各CPU,就相当于申请1个CPU的一半,可以加个后缀m表示千分之一的概念。比如说100m的CPU,100豪的CPU和0.1个CPU都是一样的。
    
    K,M,G,T,P,E #通常是以1000为换算标准的。
    Ki,Mi,Gi,Ti,Pi,Ei #通常是以1024为换算标准的。

3.服务质量等级

Pod的三种QoS级别:
    Guaranteed(完全可靠的):如果Pod中的所有容器对所有资源类型都定义了Limits和Requests,并且所有容器的Limits值都和Requests值相等(且都不为0),那么该Pod的QoS级别就是Guaranteed。
        未定义Requests值,所以其默认等于Limits值。
        其中定义的Requests与Limits的值完全相同。
    BestEffort(尽力而为、不太可靠的):如果Pod中所有容器都未定义资源配置(Requests和Limits都未定义),那么该Pod的QoS级别就是BestEffort。
    Burstable(弹性波动、较可靠的):当一个Pod既不为Guaranteed级别,也不为BestEffort级别时,该Pod的QoS级别就是Burstable。
        Pod中的一部分容器在一种或多种资源类型的资源配置中定义了Requests值和Limits值(都不为0),且Requests值小于Limits值。
        Pod中的一部分容器未定义资源配置(Requests和Limits都未定义)。

工作特点:
    BestEffort Pod的优先级最低,在这类Pod中运行的进程会在系统内存紧缺时被第一优先“杀掉”。当然,从另一个角度来看,BestEffortPod由于没有设置资源Limits,所以在资源充足时,它们可以充分使用所有闲置资源。
    Burstable Pod的优先级居中,这类Pod在初始时会被分配较少的可靠资源,但可以按需申请更多的资源。当然,如果整个系统内存紧缺,又没有BestEffort容器可以被杀掉以释放资源,那么这类Pod中的进程可能被“杀掉”。
    Guaranteed Pod的优先级最高,而且一般情况下这类Pod只要不超过其资源Limits的限制就不会被“杀掉”。当然,如果整个系统内存紧缺,又没有其他更低优先级的容器可以被“杀掉”以释放资源,那么这类Pod中的进程也可能会被“杀掉”。

二.资源配额resourcequota

1.支持的资源限制

resourcequota对namespace中容器、pod等使用总和限制 

资源限制对象:
    容器资源请求值(requests):命名空间下的所有pod申请资源时设置的requests总和不能超过这个值。
        resources.requests.cpu
        resources.requests.memory
    容器资源限制值(limits):命名空间下的所有pod申请资源时设置的limits总和不能超过这个值。
        resources.limits.cpu
        resources.limits.memory
        
说明:
  CPU单位:可以写m也可以写浮点数,例如0.5=500m,1=1000m
  requests必须小于limits,建议:requests值小于limits的20%-30%,一般是limits的70%。
  requests只是一个预留性质,并非实际的占用,用于k8s合理的分配资源(每个节点都有可分配的资源,k8s抽象的将这些节点资源统一分配)。比如requests分配1核1G,在满足的节点上创建完容器后实际资源可能只有0.5C1G。
  requests会影响pod调度,k8s只能将pod分配到能满足该requests值的节点上。
  ResourceQuota功能是一个准入控制插件,默认已经启用。

2.资源配额

2.1计算资源配额

用户可以对给定命名空间下的可被请求的计算资源总量进行限制。
资源名称描述
limits.cpu所有非终止状态的 Pod,其 CPU 限额总量不能超过该值。
limits.memory所有非终止状态的 Pod,其内存限额总量不能超过该值。
requests.cpu所有非终止状态的 Pod,其 CPU 需求总量不能超过该值。
requests.memory所有非终止状态的 Pod,其内存需求总量不能超过该值。
apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota
  namespace: test
spec:
  hard:
    requests.cpu: "8"        #限制初始容器cpu使用
    limits.cpu: "8"          #限制容器cpu最大使用数
    requests.memory: 4Gi     #限制初始容器内存使用
    limits.memory: 4Gi       #限制容器内存最大使用数

2.2存储资源配额

用户可以对给定命名空间下的存储资源总量进行限制。
资源名称说明
requests.storage所有 PVC,存储资源的需求总量不能超过该值。
persistentvolumeclaims在该命名空间中所允许的 PVC 总量。
< storage-class-name>.storageclass.storage.k8s.io/requests.storage在所有与 < storage-class-name> 相关的持久卷申领中,存储请求的总和不能超过该值。
< storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims在与 storage-class-name 相关的所有持久卷申领中,命名空间中可以存在的持久卷申领总数。
apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota
  namespace: test
spec:
  hard:
    requests.storage: "100G"     #限制pvc能使用的最大内存
    persistentvolumeclaims: "5"  #限制命名空间允许的pvc总量

2.3对象数量配额

        你可以使用以下语法对所有标准的、命名空间域的资源类型进行配额设置。
        count/< resource >.< group >:用于非核心(core)组的资源。
        count/< resource >:用于核心组的资源
资源名称描述
configmaps在该命名空间中允许存在的 ConfigMap 总数上限。
persistentvolumeclaims在该命名空间中允许存在的 PVC 的总数上限。
pods在该命名空间中允许存在的非终止状态的 Pod 总数上限。Pod 终止状态等价于 Pod 的 .status.phase in (Failed, Succeeded) 为真。
replicationcontrollers在该命名空间中允许存在的 ReplicationController 总数上限。
resourcequotas在该命名空间中允许存在的 ResourceQuota 总数上限。
services在该命名空间中允许存在的 Service 总数上限。
services.loadbalancers在该命名空间中允许存在的 LoadBalancer 类型的 Service 总数上限。
services.nodeports在该命名空间中允许存在的 NodePort 类型的 Service 总数上限。
secrets在该命名空间中允许存在的 Secret 总数上限。
apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota
  namespace: test
spec:
  hard:
    pods: "20"      #限制pod数量最多为20各
    services: "6"   #限制svc数量最多为6个

三.资源限制limitrange

limitrange对namespace中容器、pod等使用单独限制

   默认情况下,K8s集群上的容器对计算资源没有任何限制,可能会导致个别容器资源过大导致影响其他容器正常工作,这时可以使用LimitRange定义容器默认CPU和内存请求值或者最大上限。也存在员工在设置ResourceQuota时,过大或过小,甚至忘记设置。那么limirange就可以设置个默认值,即时忘记没有设置限制值时,也可给你设置个默认限制值;也可以限制员工在设置限制值时要合理,不能超过limitrange的最小值,也不能低于limitrange的最小值。

LimitRange限制维度:
    限制容器配置requests.cpu/memory,limits.cpu/memory的最小、最大值。
    限制容器配置requests.cpu/memory,limits.cpu/memory的默认值。
    限制PVC配置requests.storage的最小、最大值。

1.限制资源大小值

apiVersion: v1
kind: LimitRange
metadata:
  name: quota
  namespace: test        ##策略作用哪个命名空间。
spec:
  limits:
  - max:                 ##容器能设置limit的最大值。
      cpu: 2
      memory: 2Gi
    min:                 ##容器能设置request的最小值。
      cpu: 1 
      memory: 1Gi
    type: Container      ##限制对象。

2.限制默认值

这个资源默认值,是在限制资源大小值时就会默认创建,根据max最大值创建。
当默认值不合理时,需要我们手动去设置。
Containers可以设置限制默认值,Pod不能设置Default Request和Default Limit参数。
apiVersion: v1
kind: LimitRange
metadata:
  name: quota
  namespace: test
spec:
  limits:
  - type: Container     # 资源类型
    default:            # 如果没有配置资源配额,以下配置生效
      cpu: 500m 		# CPU限额
      memory: 500Mi     # 内存限额
    defaultRequest:
      cpu: 100m  	     # 最小保留资源,CPU
      memory: 100Mi 	 # 最小保留资源,内存

3.限制存储大小值

apiVersion: v1
kind: LimitRange
metadata:
  name: quota
  namespace: test
spec:
  limits:
  - type: PersistentVolumeClaim
    max:
      storage: 5Gi
    min:
      storage: 1Gi

4.限制pod的cpu和内存

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        memory: 100Mi	     #最少需要100Mi内存才能运行
        cpu: "1"	         #最少需要1个cpu才能运行
      limits:
        cpu: "4"	         #最多使用10个CPU,超过会重启
        memory: 200Mi	     #最多200Mi内存,超过会重启

四.查看资源

1.查看ResourceQuota

[root@master01 ~]# kubectl get ResourceQuota -A
NAMESPACE   NAME    AGE   REQUEST                                            LIMIT
server      quota   8s    requests.cpu: 0/8, requests.memory: 39480Mi/10Gi   limits.cpu: 0/8, limits.memory: 51888Mi/10Gi

[root@master01 ~]# kubectl describe ResourceQuota quota -n server
Name:            quota
Namespace:       server
Resource         Used     Hard
--------         ----     ----
limits.cpu       0        8
limits.memory    51888Mi  10Gi
requests.cpu     0        8
requests.memory  39480Mi  10Gi

2.查看LimitRange

[root@master01 ~]# kubectl get LimitRange -n server
NAME    CREATED AT
quota   2024-01-25T08:46:54Z

[root@master01 ~]# kubectl describe LimitRange -n server
Name:       quota
Namespace:  server
Type        Resource  Min  Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---  ---  ---------------  -------------  -----------------------
Container   cpu       1    2    2                2              -
Container   memory    1Gi  6Gi  6Gi              6Gi            -

3.查看pod资源限制

[root@master01 ~]# kubectl describe pod nginx-5678dd5ff5-jht6g  -n server
    Limits:
      cpu:     4
      memory:  2000Mi
    Requests:
      cpu:        1
      memory:     1000Mi

4.查看node资源限制

[root@master01 ~]# kubectl describe node 192.168.0.10
#所有pod资源限制
Namespace      Name                   CPU Requests  CPU Limits  Memory Requests  Memory Limits  Age
--------       ----                   ------------  --- ------  ------ --------  -------------  ---
kube-system    calico-node-n7qvl       250m (3%)     0 (0%)      0 (0%)           0 (0%)         182d
server         nginx-6847d5c4f-vrct2   1 (12%)       4 (50%)     1000Mi (5%)      2000Mi (10%)   2m54s

#这个node的所有pod加起来的资源限制
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests     Limits
  --------           --------     ------
  cpu                1250m (15%)  4 (50%)
  memory             1000Mi (5%)  2000Mi (10%)
  ephemeral-storage  0 (0%)       0 (0%)
  hugepages-1Gi      0 (0%)       0 (0%)
  hugepages-2Mi      0 (0%)       0 (0%)
Events:              <none>
#这个所有pod加起来的资源是这个node已经给出的资源配额,也是k8s集群合理分配资源的重要信息
#比如说有3个node节点,k8s会根据这三个节点的Requests(cpu+memory)去合理分配pod在哪个节点,保证node资源使用率平均
0

评论区