在一个多用户、多团队的k8s集群上,通常会遇到一个问题,如何在不同团队之间取得资源的公平,即,不会因为某个流氓团队占据了所有资源,从而导致其他团队无法使用k8s。
k8s的解决方法是,通过RBAC将不同团队(or 项目)限制在不同的namespace下,通过resourceQuota来限制该namespace能够使用的资源。
资源分为以下三种。
kubectl create namespace sy
[root@master101 sy]# vim quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: sy
spec:
hard:
limits.cpu: "2"
limits.memory: 2Gi
persistentvolumeclaims: "8"
pods: "2"
requests.cpu: "1"
requests.memory: 1Gi
requests.storage: 30Gi
也可以设置namespace上下文,在这里执行,就不用指定namespace了
kubectl config set-context $(kubectl config current-context) --namespace=sy
[root@master101 sy]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
namespace: sy
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: "4Gi"
cpu: "800m"
requests:
memory: "3Gi"
cpu: "500m"
这时会报错
[root@master101 sy]# kubectl apply -f nginx.yaml
Error from server (Forbidden): error when creating "nginx.yaml": pods "quota-mem-cpu-demo" is forbidden: exceeded quota: compute-resources, requested: limits.memory=4Gi,requests.memory=3Gi, used: limits.memory=0,requests.memory=0, limited: limits.memory=2Gi,requests.memory=1Gi
当开启了resource quota时,用户创建pod,必须指定cpu、内存的 requests or limits ,否则创建失败。resourceQuota搭配 limitRanges口感更佳:limitRange可以配置创建Pod的默认limit/request。