A primitiva Resource Quota estabelece a quantidade máxima utilizável de recursos por namespace. Uma vez aplicada, o Kubernetes Scheduler cuidará do cumprimento destas regras e, além disso, fará a distribuição/escalonamento dos Pods para os nodes que possuem recursos suficientes. Se, em algum momento, todos os nodes estiverem ocupados, as tentativas de escalonamento dos Pods resultarão em status Pending para cada um destes Pods.
A lista a seguir da uma ideia das regras que podem ser aplicadas com ResourceQuota:
<aside> 💡 if you set a CPU request quota in a namespace, then all pods need to set a CPU request in their definition, otherwise they will not be scheduled.
</aside>
Criando de Forma Imperativa
# Exemplo retirado do `kubectl create quota --help`
$ kubectl create quota my-quota \\
--hard=\\
cpu=1,\\
memory=1G,\\
pods=2,\\
services=3,\\
replicationcontrollers=2,\\
resourcequotas=1,\\
secrets=5,\\
persistentvolumeclaims=10
apiVersion: v1
kind: ResourceQuota
metadata:
creationTimestamp: null
name: my-quota
spec:
hard:
cpu: "1"
memory: 1G
persistentvolumeclaims: "10"
pods: "2"
replicationcontrollers: "2"
resourcequotas: "1"
secrets: "5"
services: "3"
# Kubectl also supports object count quota for all standard
# namespaced resources using the syntax count/<resource>.<group>
$ kubectl create quota my-quota \\
--hard=\\
cpu=1,\\
memory=1G,\\
count/deployments.apps=2,\\
count/replicasets.apps=4,\\
count/pods=3,\\
count/secrets=4
apiVersion: v1
kind: ResourceQuota
metadata:
creationTimestamp: null
name: my-quota
spec:
hard:
count/deployments.apps: "2"
count/pods: "3"
count/replicasets.apps: "4"
count/secrets: "4"
cpu: "1"
memory: 1G
status: {}
Exemplo 01 - Internet
Understanding Kubernetes Limits and Requests | Sysdig
# manifesto Resource Quota
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-example
spec:
hard:
requests.cpu: 2
requests.memory: 2Gi
limits.cpu: 3
limits.memory: 4Gi
Aplicando o ResourceQuota a um namespace:
request.cpu
não pode ser maior que 2 coreslimits.cpu
não pode ser maior que 3 coresrequest.memory
não pode ser maior do que 2 GiBlimits.memory
não pode ser maior que 4 GiBExemplo 02 - Livro
Vamos criar um namespace chamado production para aplicar restrições com Resource Quota e demonstrar sua funcionalidade.
As seguintes restrições serão aplicadas ao namespace production:
Limit the number of Pods to 2.
Será possível criar apenas dois Pods neste namespace.
Define the minimum resources requested by a Pod to 1 CPU and 1024m of RAM.
É preciso dividir 1 CPU e 1024MB de memória na criação dos dois Pods permitidos neste namespace. Fica claro que cada container fará request de 0.5 CPU e 512MB de memória caso a divisão de recursos seja feita meio-a-meio.
Define the maximum resources used by a Pod to 4 CPUs and 4096m of RAM.
Os limits dos containers não podem ultrapassar 4 CPUs e 4096 MB de memória.
Manifesto Namespace
# NAMESPACE
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: production
spec: {}
status: {}
Listagem de Namespaces
**$ kubectl get namespaces**
NAME STATUS AGE
**production Active 5s**
default Active 7d10h
kube-node-lease Active 7d10h
kube-public Active 7d10h
kube-system Active 7d10h
local-path-storage Active 7d10h
Manifesto ResourceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
name: awesome-quota
spec:
hard:
pods: 2
requests.cpu: "1"
requests.memory: 1024m
limits.cpu: "4"
limits.memory: 4096m
Criando e Inspecionando o ResourceQuota
**$ kubectl apply -f resource-quota.yaml --namespace=production**
resourcequota/awesome-quota created
**$ kubectl describe resourcequotas awesome-quota --namespace=production**
Name: awesome-quota
Namespace: production
Resource Used Hard
-------- ---- ----
limits.cpu 0 4
limits.memory 0 4096m
pods 0 2
requests.cpu 0 1
requests.memory 0 1024m
Na próxima página(Exploring ResourceQuota Enforcement ) são criados Pods e containers para exemplificar a funcionalidade do Resource Quota.
API Reference para Resource Quotas.