K8s em Exemplos: ReplicaSets

Um ReplicaSet garante que N Pods idênticos estejam rodando o tempo todo. Ele implementa self-healing: se um Pod falha, o ReplicaSet cria um substituto. Você raramente cria ReplicaSets diretamente - Deployments os gerenciam.

replicaset.yaml

ReplicaSets usam a API apps/v1. O selector vincula o ReplicaSet aos Pods que ele gerencia.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app

O template do Pod define os Pods. Labels devem corresponder ao selector.

  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: app
          image: my-app:v1
terminal

ReplicaSets executam um loop de reconciliação, constantemente comparando estado desejado vs estado atual. Delete um Pod e observe-o ser substituído.

$ kubectl delete pod my-app-abc12 &
$ kubectl get pods -w
NAME           READY   STATUS        AGE
my-app-abc12   1/1     Terminating   5m
my-app-def34   0/1     Pending       0s
my-app-def34   1/1     Running       2s
terminal

DESIRED vs CURRENT é sempre reconciliado automaticamente. Este é o core do self-healing do Kubernetes.

$ kubectl get rs my-app
NAME     DESIRED   CURRENT   READY   AGE
my-app   3         3         3       10m
terminal

Deployments criam um novo ReplicaSet para cada mudança no template do Pod. O nome do RS é deployment-name + pod-template-hash.

$ kubectl get rs -l app=my-app
NAME                DESIRED   CURRENT   READY   AGE
my-app-7d9f8b6c5d   3         3         3       10m
my-app-5f8d9a7b3c   0         0         0       1h

$ kubectl get rs my-app-7d9f8b6c5d -o jsonpath='{.metadata.labels.pod-template-hash}'
7d9f8b6c5d
terminal

ReplicaSets usam owner references para rastrear Pods. Quando você deleta um ReplicaSet, Kubernetes cascateia a deleção para seus Pods (todos os Pods são deletados também).

$ kubectl get pod my-app-abc12 -o jsonpath='{.metadata.ownerReferences}'
[{"kind":"ReplicaSet","name":"my-app-7d9f8b6c5d",...}]

$ kubectl delete rs my-app
replicaset.apps "my-app" deleted
replicaset-labels.yaml

O selector vincula o ReplicaSet aos seus Pods. Pods devem ter todas as labels no selector. Labels extras no template do Pod são permitidas.

spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
        version: v1
    spec:
      containers:
        - name: app
          image: my-app:v1
terminal

Aviso: escalar réplicas do ReplicaSet diretamente (kubectl scale rs) é sobrescrito pelo controller do Deployment. Sempre escale via Deployment.

$ kubectl scale deployment my-app --replicas=5
deployment.apps/my-app scaled

Índice | GitHub | Use as setas do teclado para navegar |