一.资源配额
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资源使用率平均
评论区