ReplicaSet - Kubernetes (BR)
Tags: kubernetes, devops
Published: 2023-07-15 15:23:21

---
title: ReplicaSet - Kubernetes (BR)
published: true
description: 
tags: #kubernetes #devops
# cover_image: https://direct_url_to_image.jpg
# Use a ratio of 100:42 for best results.
# published_at: 2023-07-11 16:19 +0000
---
O que é o **ReplicaSet** no kubernetes ?
> **ReplicaSet** tem a funcionalidade de manter a quantidade de **pods** desejada disponível em execução a todo momento, replicando de forma idêntica.

Como funciona o **ReplicaSet** ?
> Na sua definição terá que ter um seletor para funcionar como um identificador de pods, também terá que ter a informação de quantas replicas deseja ter desse determinado recurso.

Assim o **ReplicaSet** trabalhará para manter o número de replicas, excluindo e criando novos pods de acordo com o template que passar na criação.

---

### Entendendo a criação de um **ReplicaSet**.
Nesse exemplo vamos criar um **ReplicaSet** que terá 3 replicas de um template com apenas um container de nginx na última versão. usando o seletor **matchLabels** para encontrar pods com labels iguais.

Caso não especifique o número de replicas o padrão é 1.


```Yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rsnginx
spec:
  replicas: 3 # <-- Esse é o campo que define a quantidade de replicas desejadas
  selector:
    matchLabels: # <-- Esse seria o seletor para dar match com pods que tiverem o mesmo Label implícito. 
      tier: web
  template:
    metadata:
      labels:
        tier: web # <-- definindo o mesmo Label observado pelo matchLabels
    spec:
      containers:
        - name: nginxweb
          image: nginx:latest

```

Para criar o **ReplicaSet** acima basta rodar o seguinte comando:
```Bash
kubectl apply -f {nome_do_seu_arquivo}
```

Você pode ver seus **ReplicaSets**: ```Bash
kubectl get rs
```

Podemos inspecionar os **ReplicaSets**: ```Bash
kubectl describe rs/{nome_do_seu_replicaSet_criado}
```

---

### O **ReplicaSet** pode adquirir pods sem ser os definidos no template ?

Sim, mas temos algumas regras para esse uso:

- 1) Se os pods conterem o mesmo Label que o do **ReplicaSet** porém foram criados depois, o **ReplicaSet** irá adquirir os pods e encerrar logo em seguida, excederia a quantidade definida na criação do **ReplicaSet**.

- 2) Se os pods forem criados antes do **ReplicaSet**, ele iria adquiri-los e criar os faltantes para dar o número  de replicas especificadas.

Basicamente o **ReplicaSet** vai trabalhando para manter o número de replicas desejadas. Exemplo:
![Exemplo replicaSet](https://miro.medium.com/v2/resize:fit:1400/1*lH0EI3FRPNVI5wsxgtx9IQ.png)


---

É possível isolar pods de um **replicaSet** trocando seu label, assim o **replicaSet** irá abandonar esse pod e criar outro em seu lugar(se o número de replicas não for alterado).

---

Você também consegue utilizar o **replicaSet** como um alvo de escala horizontal:
```Bash
kubectl autoscale rs {nome_do_seu_rs} --max=10 --min=3 --cpu-percent=50
```

essa é a maneira mais fácil de criar um **HPA** com multiplicação máxima de 10 e mínima de 3 com 50% da cpu para a escala, porém você pode optar por um ``yaml`` com esse scale.

---

### Conclusão

Sobre o **replicaSet**, ele consegue manter os pods ativos de acordo com a configuração de replicas, porém se quiser gerenciar o versionamento de seus pods aconselho a usar **Deployment**, uma forma melhor e mais completa de se trabalhar com seus pods. Mesmo para casos de se trabalhar com apenas uma replica o ideal é que use um recurso e nunca apenas um pod.

> ### Referências
>> [Kubernetes](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/)