首先我們創建一個名稱空間
kubectl create namespace quota-mem-cpu-example
創建資源配額
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
通過命令創建它
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
查看它的詳細信息:
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
資源配額對名稱空間quota-mem-cpu-example增加了以下限制:
- 每一個pod都必須內存申請/限制,cpu申請/限制
這里是針對上面的示例來說的,因為示例中配額同時配置了這4個選項,因此pod必須聲明這四個選項
-
所有容器內存申請總和不得超過1G
-
所有內存限制不得超過2g
-
所有容器申請的cpu不得超過1
-
所有容器限制的cpu不得超過2
下面創建一個pod
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo
spec:
containers:
- name: quota-mem-cpu-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
cpu: "800m"
requests:
memory: "600Mi"
cpu: "400m"
創建它
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod.yaml --namespace=quota-mem-cpu-example
查看配額詳細信息
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
status:
hard:
limits.cpu: "2"
limits.memory: 2Gi
requests.cpu: "1"
requests.memory: 1Gi
used:
limits.cpu: 800m
limits.memory: 800Mi
requests.cpu: 400m
requests.memory: 600Mi
通過輸出信息可以看到資源的配額值和已經使用的值,可以看到pod的申請和限制均沒有超限
嘗試再創建一個pod
apiVersion: v1
kind: Pod
metadata:
name: quota-mem-cpu-demo-2
spec:
containers:
- name: quota-mem-cpu-demo-2-ctr
image: redis
resources:
limits:
memory: "1Gi"
cpu: "800m"
requests:
memory: "700Mi"
cpu: "400m"
通過配置文件可以看到,pod申請的內存為700M,請注意已使用的申請內存和新請求的和已經超限.
600M+700M>1G
嘗試創建pod
kubectl apply -f https://k8s.io/examples/admin/resource/quota-mem-cpu-pod-2.yaml --namespace=quota-mem-cpu-example
輸出信息
Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml":
pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo,
requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi
從輸出信息可以看到,創建這個pod將會導致內存申請超限,因此第二個pod不會創建成功
如果想要對pod的資源進行限制,則可以使用
LimitRange
,使用了LimitRange后,超過LimitRange限制資源的pod將不會創建,並且如果容器沒有指定申請或者限制,會被賦以LimitRange
的默認值.