作为完备的企业级容器管理平台,Kubernetes提供了资源配额管理(ResourceQuota)这一高级功能,资源配额管理确保指定的资源对象在任何时候都不会超量占用系统物理资源。
支持如下三个层次的资源配额管理
1、容器级别:可以对cpu和memory进行限制
2、Pod级别:可以对一个pod内所有容器的可用资源进行限制
3、Namespace级别:为Namespace(多租户)的级别资源限制,包括如下所示:
Pod数量
Replication Controller数量
Service数量
ResourceQuota数量
Secret数量
可持有的PV(Persistent Volume)数量
说明:
k8s配额管理是通过Admission Control(准入控制)来控制的。
Admission Control提供两种配额约束方式:LimitRanger和ResourceQuota
LimitRanger作用于Pod和Container。
ResourceQuota作用于Namespace上,限定一个Namespace里的各类资源的使用总额。
这里主要介绍基于Namespace(多租户)进行资源配额管理。
在Kuberners中,资源配额能够对计算资源(CPU和内存)、存储资源、以及对资源对象的数量进行管理。
用户可以对给定命名空间下的可被请求的计算资源总量进行限制,配额机制所支持的资源类型:
用户可以对给定命名空间下的存储资源 总量进行限制。此外,还可以根据相关的存储类(Storage Class)来限制存储资源的消耗。
例如,如果一个操作人员针对 gold 存储类型与 bronze 存储类型设置配额, 操作人员可以定义如下配额:
gold.storageclass.storage.k8s.io/requests.storage: 500Gi
bronze.storageclass.storage.k8s.io/requests.storage: 100Gi
给定类型的对象数量可以被限制。 支持以下类型:
说明:pods 配额统计并保证单个namespace下创建 pods 的最大数量。用户可能希望在namespace中为pod设置配额,来避免有用户创建很多小的pod,从而耗尽集群提供的pod IP地址。
由于在资源配额是基于命名空间进行设置的,因此,在此示例中先创建一个名称为quota-mem-cpu-example的命名空间:
kubectl create namespace lolaage
下面是定义管理计算资源配额的YAML文件,在此文件中,资源配额管理的名称为compute-resources,pod的数量为4,cpu的需求数量为2核,cpu的限制数量为4核;内存的需求大小为4Gi,内存的限制大小为8Gi。
vim compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
pods: "4"
requests.cpu: "2"
requests.memory: 4Gi
limits.cpu: "4"
limits.memory: 8Gi
通过下面的kubectl命令在myspaces命名空间下创建资源配额:
kubectl create -f ./compute-resources.yaml --namespace=lolaage
在创建完资源配额后,通过执行下面的命令查看资源配额的详细信息
kubectl describe quota compute-resources --namespace=lolaage
或
kubectl get resourcequota compute-resources --namespace=lolaage --output=yaml
kubectl delete namespace compute-resources
总结:ResourceQuota在lolaage命名空间中设置了如下要求:
每个容器必须有内存请求和限制,以及 CPU 请求和限制。
所有容器的内存请求总和不能超过4 GiB。
所有容器的内存限制总和不能超过8 GiB。
所有容器的 CPU 请求总和不能超过2 cpu。
所有容器的 CPU 限制总和不能超过4 cpu
下面是定义管理资源对象数量配额的YAML文件,在此文件中,资源配额管理的名称为resource-object-counts:
vim resource-object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: resource-object-counts
spec:
hard:
configmaps: "10"
persistentvolumeclaims: "4"
replicationcontrollers: "20"
secrets: "10"
services: "10"
services.loadbalancers: "2"
通过下面的kubectl命令在lolaage命名空间下创建资源配额:
kubectl create -f ./resource-object-counts.yaml --namespace=lolaage
在创建完资源配额后,通过执行下面的命令查看资源配额的详细信息:
kubectl describe quota resource-object-counts --namespace=lolaage
或
kubectl get resourcequota resource-object-counts --namespace=lolaage --output=yaml
kubectl delete namespace resource-object-counts
参考官方资源配额说明
更多详细内容请参考:企业级K8s集群运维实战