概述
k8s资源配额(ResourceQuota)是对k8s集群中命名空间中资源的限制。
在k8s官网文档中,对k8s资源配置解决的问题描述是:
当多个用户或团队共享有固定节点数的一个集群时,可能会某个团队使用的资源超过其公平份额,从而应用其他用户或者团队的使用。
When several users or teams share a cluster with a fixed number of nodes, there is a concern that one team could use more than its fair share of resources.
Resource quotas are a tool for administrators to address this concern.
但是我觉得k8s资源配额即使不是团队共享集群场景也非常有必要,因为我们需要限制k8s集群的资源使用以防止整个集群崩溃,包括:预留足够的操作系统资源和k8s核心资源的资源(dns,api server,etcd,schduler)。
资源配额
启用ResourceQuota
在使用ResourceQuota之前需要先确认ResourceQuota是否被启用,我们需要查看一下k8s api-server的清单文件,如果kube-apiserver.yaml中没有启用,则直接添加–enable-admission-plugin=ResourceQuota或者追加,ResourceQuota即可。
vim vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 添加完成后生效
systemctl restart kubelet
资源配额类型
在 Kubernetes 中,你可以使用 ResourceQuota 对以下类型的资源进行限制:
- Pods: 你可以限制命名空间中可以运行的 Pod 的数量。
- Services: 你可以限制命名空间中可以创建的 Service 的数量。
- ReplicationControllers: 你可以限制命名空间中可以创建的 ReplicationController 的数量。
- Secrets: 你可以限制命名空间中可以保存的 Secret 的数量。
- ConfigMaps: 你可以限制命名空间中可以保存的 ConfigMap 的数量。
- PersistentVolumeClaims: 你可以限制命名空间中可以创建的 PersistentVolumeClaim 的数量。
- Requests 和 Limits: 对于 CPU 和内存资源,你可以限制命名空间中所有 Pod 可以请求(Requests)或者限制(Limits)的资源总量。
- PersistentVolumeClaim Size: 对于存储资源,你可以限制命名空间中所有 PersistentVolumeClaims 可以请求的存储总量。
- Requests.Storage: 对于持久卷存储,你可以限制命名空间中所有持久卷可以请求的存储总量。
- Ephemeral storage: 对于暂态存储,你可以限制命名空间中所有Pods可以请求的暂态存储总量。
以上类型是 Kubernetes 默认支持的资源类型,一些特殊的资源类型,比如自定义资源或者扩展资源(如 GPU),也是可以被 ResourceQuota 控制的,只需要正确配置即可。
资源配置级别
ResourceQuota 有两个级别:hard 和 soft。
-
Hard quotas: 如果设置了 hard quotas,一旦这个命名空间的资源用量达到了设定的上限,那么这个命名空间就不能再创建新的资源。这种情况下,Pod 可能会创建失败,或者不能被调度。
-
Soft quotas: soft quotas 则不同,如果设置了 soft quotas,这个命名空间的资源用量一旦超过设定的上限,就会生成一条警告信息。而不会如 hard quotas 那样阻止新的资源被创建。
资源配置示例
hard级别
apiVersion: v1
kind: ResourceQuota
metadata:
name: myresourcequota
namespace: default
spec:
hard:
pods: "10"
services: "5"
replicationcontrollers: "5"
secrets: "10"
configmaps: "10"
persistentvolumeclaims: "5"
requests.cpu: "1"
requests.memory: "1Gi"
requests.storage: "50Gi"
limits.cpu: "2"
limits.memory: "2Gi"
soft级别
apiVersion: v1
kind: ResourceQuota
metadata:
name: myresourcequota
namespace: default
spec:
soft:
pods: "10"
services: "5"
replicationcontrollers: "5"
secrets: "10"
configmaps: "10"
persistentvolumeclaims: "5"
requests.cpu: "1"
requests.memory: "1Gi"
requests.storage: "50Gi"
limits.cpu: "2"
limits.memory: "2Gi"
应用资源配额
创建ResourceQuota
kubectl apply -f rq.yaml
resourcequota/myresourcequota created
查询ResourceQuota
kubectl get resourcequota
kubectl describe resourcequota/myresourcequota
总结
k8s ResourceQuota用于限制命名空间资源使用,无论何时我们都要设置ResourceQuota以满足不同团队共享资源或者防止k8s集群过度使用硬件资源而导致集群故障。