#DevOps para noobs - Requests x limits no Kubernetes
Tags: devops, sre, kubernetes
Published: 2024-02-05 23:34:53

No universo do Kubernetes, é essencial não apenas implantar suas aplicações, mas também gerenciar eficientemente os recursos que elas consomem. 

Para isso, o Kubernetes oferece recursos como **limits** (limites) e **requests** (requisições), que permitem especificar tanto o mínimo quanto o máximo de recursos que uma aplicação pode utilizar. Vamos explorar esses conceitos neste artigo.

O que são **Limits** e **Requests**?

Em termos simples, os **limits** representam a quantidade máxima de recursos, como CPU e memória, que um container pode consumir. Por outro lado, as **requests** indicam a quantidade mínima de recursos que devem ser reservados para o container.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8snj4060dy0gi1c2ihh2.png)


No YAML de um Pod, podemos definir esses valores da seguinte forma:

```
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
   ** resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"**

```


Neste exemplo, especificamos que nossa aplicação requer no mínimo 64 megabytes de memória e 250 milicores de CPU, enquanto o limite máximo é de 128 megabytes de memória e 500 milicores de CPU, ou seja no limit deixamos uma "brecha" caso ultrapassemos a quantidade de consumo definida no request.

**Por que são importantes?**

Ao definir esses valores, estamos dando informações valiosas ao **Kubernetes Scheduler**, que utiliza esses dados para decidir em qual nó do cluster a aplicação será implantada. Isso garante que a aplicação tenha os recursos necessários para funcionar adequadamente.

**Kubernetes Scheduler**

 Sua função principal é selecionar os nós (nodes) do cluster nos quais os pods serão implantados. Isso é feito com base nos requisitos de recursos dos pods, como CPU e memória.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/95j2oqxt8lrllh1bsaoz.png)

**Gerenciando Recursos Excedentes**

Mas e se nossa aplicação exceder os limites definidos?

1. Throttling (Estrangulamento):
 O Kubernetes pode limitar a quantidade de recursos disponíveis para o container, o que pode resultar em um desempenho reduzido ou mais lento para a aplicação.

2. Termino do Container: Em situações extremas, se uma aplicação consistentemente consome mais recursos do que o especificado em seus limites, o Kubernetes pode decidir terminar ou reiniciar o container. Isso é feito para proteger a integridade do cluster e garantir que outras aplicações tenham acesso aos recursos necessários.

**Conclusão**

Estabelecer limites e requisitos adequados para suas aplicações Kubernetes é crucial para garantir um desempenho eficiente e estável do cluster. Ao entender e utilizar corretamente esses recursos, você pode maximizar a utilização dos recursos disponíveis e garantir uma operação tranquila das suas aplicações no Kubernetes.


Referências:
1. [Memory, requests and limits in Kubernetes](https://itnext.io/memory-requests-and-limits-in-kubernetes-1c9cd573b3ab) 
2. [Documentação do Kubernetes](https://kubernetes.io/pt-br/docs/concepts/configuration/manage-resources-containers/)