當一個node上有多個服務史辙,每個服務有自己的命名空間,且我們不希望因為一個服務請求過多而餓死其他服務時,可以限制每個命名空間的最大資源持有率
先生成一個命名空間
kubectl create ns rq-test-ns
創(chuàng)建一個限制命名空間資源利用率的約束
apiVersion: v1
kind: ResourceQuota
metadata:
name: test-rq
namespace: rq-test-ns
spec:
hard:
pods: "10"
requests.cpu: "1"
requests.memory: "500Mi"
limits.cpu: "1"
limits.memory: "500Mi"
P.S. 若ResourceQuota中設置了limit,則pod文件中必須包含limit參數(shù)
應用
編寫在這個命名空間中創(chuàng)建pod的腳本
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-3
namespace: rq-test-ns
spec:
containers:
- name: nginx-pod-1
image: nginx:latest
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "100m"
memory: "200Mi"
連續(xù)在這個命名空間中創(chuàng)建pod,當pod的request.memory總和超過規(guī)定的命名空間request.memory時谷丸,會報錯
$ kubectl apply -f .\podConfig.yml
pod/nginx-pod-1 created
$ kubectl apply -f .\podConfig.yml
pod/nginx-pod-2 created
$ kubectl apply -f .\podConfig.yml
Error from server (Forbidden): error when creating ".\\podConfig.yml": pods "nginx-pod-3" is forbidden: exceeded quota: test-rq, requested: limits.memory=200Mi,requests.memory=200Mi, used: limits.memory=400Mi,requests.memory=400Mi, limited: limits.memory=500Mi,requests.memory=500Mi
可以通過一下命令修改已存在的ResourceQuota
$ kubectl patch resourcequota test-rq -n rq-test-ns --type='json' -p="[{'op': 'replace', 'path': '/spec/hard/requests.memory', 'value': '300Mi'}]"
resourcequota/test-rq patched
然而,修改ResourceQuota并不會導致任何已經(jīng)創(chuàng)建的Pod被驅逐念秧。一旦Pod被創(chuàng)建淤井,并且其資源請求被ResourceQuota接受,那么即使后續(xù)改變了ResourceQuota,該Pod的資源也不會被回收币狠。