Skip to content

Commit 39618b2

Browse files
committed
[pt-br] Add concepts/workloads/controllers/replicaset.md
1 parent a7d02c4 commit 39618b2

File tree

4 files changed

+416
-0
lines changed

4 files changed

+416
-0
lines changed
Lines changed: 361 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,361 @@
1+
---
2+
title: ReplicaSet
3+
content_type: concept
4+
weight: 20
5+
---
6+
7+
<!-- overview -->
8+
9+
O propósito de um ReplicaSet é gerenciar um conjunto de réplicas de Pods em execução a qualquer momento. Por isso, é geralmente utilizado para garantir a disponibilidade de um certo número de Pods idênticos.
10+
11+
12+
<!-- body -->
13+
14+
## Como um ReplicaSet funciona
15+
16+
Um ReplicaSet é definido por campos, incluindo um seletor que identifica quais Pods podem ser adquiridos, um número de réplicas indicando quantos Pods devem ser mantidos, e um pod template especificando as definições para novos Pods que devem ser criados para atender ao número de réplicas estipuladas. Um ReplicaSet cumpre seu propósito criando e deletando Pods conforme for preciso para atingir o número desejado. Quando um ReplicaSet precisa criar novos Pods, ele usa o seu Pod template.
17+
18+
Um ReplicaSet é conectado ao seus Pods pelo campo do Pod [metadata.ownerReferences](/docs/concepts/workloads/controllers/garbage-collection/#owners-and-dependents), que especifíca qual recurso é dono do objeto atual. Todos os Pods adquiridos por um ReplicaSet possuem as informações de indetificação do ReplicaSet pai no campo ownerReferences. É por esse elo que o ReplicaSet tem conhecimento do estado dos Pods que está mantendo e assim planeja de acordo.
19+
20+
Um ReplicaSet identifica novos Pods a serem adquiridos utilizando o seu seletor. Caso exista um Pod que não tenha OwnerReference ou se o OwnerReference não for um {{< glossary_tooltip term_id="controller" >}} e o seu seletor corresponde com o do ReplicaSet, o Pod é adquirido imediatamente por esse ReplicaSet.
21+
22+
## Quando usar um ReplicaSet
23+
24+
Um ReplicaSet garante que um número de pod réplicas estão executando em qualquer momento. Entretanto, um Deployment é um conceito de nível superior que gerencia ReplicaSets e fornece atualizações declarativas aos Pods assim como várias outras funções úteis. Portanto, nós recomendamos a utilização de Deployments em oposição ao uso direto de ReplicaSets, exceto se for preciso uma orquestração de atualização customizada ou que nenhuma atualização seja necessária.
25+
26+
Isso na realidade significa que você pode nunca precisar manipular objetos ReplicaSet:
27+
prefira usar um Deployment, e defina sua aplicação na seção spec.
28+
29+
## Exemplo
30+
31+
{{< codenew file="controllers/frontend.yaml" >}}
32+
33+
Salvando esse manifesto como `frontend.yaml` e submetendo no cluster Kubernetes irá criar a ReplicaSet definida e os Pods mantidos pela mesma.
34+
35+
```shell
36+
kubectl apply -f https://kubernetes.io/pt-br/examples/controllers/frontend.yaml
37+
```
38+
39+
Você pode então retornar as ReplicaSets implementadas atualmente no cluster:
40+
41+
```shell
42+
kubectl get rs
43+
```
44+
45+
E observar a frontend que você criou:
46+
47+
```shell
48+
NAME DESIRED CURRENT READY AGE
49+
frontend 3 3 3 6s
50+
```
51+
52+
Você também pode checar o estado da ReplicaSet:
53+
54+
```shell
55+
kubectl describe rs/frontend
56+
```
57+
58+
E você deve ver um output similar a este:
59+
60+
```shell
61+
Name: frontend
62+
Namespace: default
63+
Selector: tier=frontend
64+
Labels: app=guestbook
65+
tier=frontend
66+
Annotations: kubectl.kubernetes.io/last-applied-configuration:
67+
{"apiVersion":"apps/v1","kind":"ReplicaSet","metadata":{"annotations":{},"labels":{"app":"guestbook","tier":"frontend"},"name":"frontend",...
68+
Replicas: 3 current / 3 desired
69+
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
70+
Pod Template:
71+
Labels: tier=frontend
72+
Containers:
73+
php-redis:
74+
Image: gcr.io/google_samples/gb-frontend:v3
75+
Port: <none>
76+
Host Port: <none>
77+
Environment: <none>
78+
Mounts: <none>
79+
Volumes: <none>
80+
Events:
81+
Type Reason Age From Message
82+
---- ------ ---- ---- -------
83+
Normal SuccessfulCreate 117s replicaset-controller Created pod: frontend-wtsmm
84+
Normal SuccessfulCreate 116s replicaset-controller Created pod: frontend-b2zdv
85+
Normal SuccessfulCreate 116s replicaset-controller Created pod: frontend-vcmts
86+
```
87+
88+
E por fim você consegue verificar os Pods que foram levantados:
89+
90+
```shell
91+
kubectl get pods
92+
```
93+
94+
Você deve receber uma informação do Pod similar à esta:
95+
96+
```shell
97+
NAME READY STATUS RESTARTS AGE
98+
frontend-b2zdv 1/1 Running 0 6m36s
99+
frontend-vcmts 1/1 Running 0 6m36s
100+
frontend-wtsmm 1/1 Running 0 6m36s
101+
```
102+
103+
Você consegue também validar que a referência de dono desses pods está definida para a ReplicaSet frontend.
104+
Para fazer isso, retorne o yaml de um dos Pods que estão executando:
105+
106+
```shell
107+
kubectl get pods frontend-b2zdv -o yaml
108+
```
109+
110+
O output será parecido com algo assim, com as informações do ReplicaSet frontend definidas no campo ownerReferences dentro da metadata do Pod:
111+
112+
```shell
113+
apiVersion: v1
114+
kind: Pod
115+
metadata:
116+
creationTimestamp: "2020-02-12T07:06:16Z"
117+
generateName: frontend-
118+
labels:
119+
tier: frontend
120+
name: frontend-b2zdv
121+
namespace: default
122+
ownerReferences:
123+
- apiVersion: apps/v1
124+
blockOwnerDeletion: true
125+
controller: true
126+
kind: ReplicaSet
127+
name: frontend
128+
uid: f391f6db-bb9b-4c09-ae74-6a1f77f3d5cf
129+
...
130+
```
131+
132+
## Aquisições de Pod sem Template
133+
134+
Enquanto você pode criar Pods diretamente sem problemas, é fortemente recomendado que você se certifique que esses Pods não tenham labels que combinem com o seletor de um dos seus ReplicaSets. O motivo para isso é que um ReplicaSet não é limitado a possuir apenas Pods estipulados por seu template-- Ele pode adquirir outros Pods na maneira discriminada nas seções anteriores.
135+
136+
Observe o último exemplo do ReplicaSet frontend, e seus Pods especificados no seguinte manifesto:
137+
138+
{{< codenew file="pods/pod-rs.yaml" >}}
139+
140+
Como esses Pods não possuem um Controller (ou qualquer objeto) referenciados como seu dono e possuem labels que casam com o seletor do ReplicaSet frontend, eles serão imediatamente adquiridos pelo ReplicaSet.
141+
142+
Imagine que você crie os Pods depois que o ReplicaSet frontend foi implantado e criou as réplicas de Pod inicial definida para cumprir o número de réplicas requiridas:
143+
144+
```shell
145+
kubectl apply -f https://kubernetes.io/examples/pods/pod-rs.yaml
146+
```
147+
148+
Os novos Pods serão adquiridos pela ReplicaSet, e logo depois terminados já que a ReplicaSet estará acima do número desejado.
149+
150+
Trazendo os Pods:
151+
152+
```shell
153+
kubectl get pods
154+
```
155+
156+
O output mostra que os novos Pods ou já estão terminados, ou no processo de ser terminados.
157+
158+
```shell
159+
NAME READY STATUS RESTARTS AGE
160+
frontend-b2zdv 1/1 Running 0 10m
161+
frontend-vcmts 1/1 Running 0 10m
162+
frontend-wtsmm 1/1 Running 0 10m
163+
pod1 0/1 Terminating 0 1s
164+
pod2 0/1 Terminating 0 1s
165+
```
166+
167+
Se você criar os Pods primeiro:
168+
169+
```shell
170+
kubectl apply -f https://kubernetes.io/examples/pods/pod-rs.yaml
171+
```
172+
173+
mas em seguida criar o ReplicaSet:
174+
175+
```shell
176+
kubectl apply -f https://kubernetes.io/examples/controllers/frontend.yaml
177+
```
178+
179+
Você vai perceber que o ReplicaSet adquiriu os Pods e criou apenas novos de acordo com o seu spec até que o número de novo Pods e os Pods iniciais igualem ao número desejado. Trazendo os Pods:
180+
181+
```shell
182+
kubectl get pods
183+
```
184+
185+
Will reveal in its output:
186+
```shell
187+
NAME READY STATUS RESTARTS AGE
188+
frontend-hmmj2 1/1 Running 0 9s
189+
pod1 1/1 Running 0 36s
190+
pod2 1/1 Running 0 36s
191+
```
192+
193+
Nesse sentido, um ReplicaSet pode possuir um grupo não-homogêneo de Pods
194+
## Escrevendo um manifesto ReplicaSet
195+
196+
Como todos os outros objetos de Kubernetes API, um ReplicaSet necessita dos campos `apiVersion`, `kind`, e `metadata`.
197+
Para ReplicaSets, o `kind` sempre será um ReplicaSet.
198+
199+
O nome de um objeto ReplicaSet precisa ser [nome de subdomínio de DNS](/pt-br/docs/concepts/overview/working-with-objects/names#dns-subdomain-names) válido.
200+
201+
Um ReplicaSet também precisa de uma [seção `.spec`](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status).
202+
203+
### Template de Pod
204+
205+
O `.spec.template` é um [template de pod](/docs/concepts/workloads/pods/#pod-templates) que também necessita de labels configurados. No nosso exemplo `frontend.yaml` nós temos uma label: `tie: frontend`.
206+
Fique atento para não sobrepor com seletores de outros controllers, para que eles não tentem adquirir esse Pod.
207+
208+
Para o campo de [restart policy](/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy) do template, `.spec.template.spec.restartPolicy`, o único valor permitido é `Always`, que é o padrão.
209+
210+
### Seletor de Pod
211+
212+
O campo `.spec.selector` é um [seletor de labels](/docs/concepts/overview/working-with-objects/labels/). Como discutido [anteriormente](#como-um-replicaset-funciona) esses são os labels usados para identificar Pods em potencial para aquisição. No nosso exemplo `frontend.yaml`, o seletor era:
213+
214+
```yaml
215+
matchLabels:
216+
tier: frontend
217+
```
218+
219+
No ReplicaSet, `.spec.template.metadata.labels` precisa casar com `spec.selector`, ou irá ser rejeitado pela API.
220+
221+
{{< note >}}
222+
Para 2 ReplicaSets definindo o mesmo `.spec.selector` mas diferentes campos de `.spec.template.metadata.labels` e `.spec.template.spec`, cada ReplicaSet ignorará os Pods criados pelo outro ReplicaSet.
223+
{{< /note >}}
224+
225+
### Replicas
226+
227+
Você pode definir quantos Pods devem executar simultaneamente determinando `.spec.replicas`. O ReplicaSet irá criar/deletar os Pods para igualar à esse número.
228+
229+
Se você não especificar o `.spec.replicas`, seu padrão é 1.
230+
231+
## Trabalhando com ReplicaSets
232+
233+
### Deletando um ReplicaSet e seus Pods
234+
235+
Para deletar um ReplicaSet e todos os seus Pods, use [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete). O [Garbage collector](/docs/concepts/workloads/controllers/garbage-collection/) automaticamente deleta todos os Pods dependentes por padrão.
236+
237+
Quando usar a API REST ou a biblioteca `client-go`, você precisa definir `propagationPolicy` para `Background` ou `Foreground` na opção -d.
238+
Por exemplo:
239+
```shell
240+
kubectl proxy --port=8080
241+
curl -X DELETE 'localhost:8080/apis/apps/v1/namespaces/default/replicasets/frontend' \
242+
> -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
243+
> -H "Content-Type: application/json"
244+
```
245+
246+
### Deletando apenas o ReplicaSet
247+
248+
Você consegue deletar um ReplicaSet sem afetar qualquer um dos Pods usando [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete) com a opção `--cascade=orphan`.
249+
Quando usar a API REST ou a biblioteca `client-go`, você precisa definir `propagationPolicy` para `Orphan`.
250+
Por exemplo:
251+
```shell
252+
kubectl proxy --port=8080
253+
curl -X DELETE 'localhost:8080/apis/apps/v1/namespaces/default/replicasets/frontend' \
254+
> -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
255+
> -H "Content-Type: application/json"
256+
```
257+
258+
Quando o original for deletado, você pode criar um novo ReplicaSet para substituí-lo. Contanto que o `.spec.selector` do velho e do novo sejam o mesmo, o novo irá adquirir os Pods antigos. Porém, o ReplicaSet não fará nenhum esforço nos Pods existentes para ajustá-los caso surja um novo e diferente template de pod.
259+
Para atualizar esses Pods para um novo spec de um modo controlado, use um [Deployment](/docs/concepts/workloads/controllers/deployment/#creating-a-deployment), já que ReplicaSets não suportam um rolling update diretamente.
260+
261+
### Isolando Pods de um ReplicaSet
262+
263+
Você pode remover Pods de um Replicaset trocando suas labels. Essa técnica pode ser usada para remover Pods de um service para depuramento, recuperação de dados, etc. Pods que forem removidos por esse método serão substituídos imediatamente (assumindo que o número de replicas não tenha sido alterado).
264+
265+
### Escalando um ReplicaSet
266+
267+
Um ReplicaSet pode ser facilmente escalado ou decaído simplismente atualizando o campo de `.spec.replicas`. O Replicaset controller garante que o número desejado de Pods com um seletor de label correspondente estejam disponíveis e operando.
268+
269+
Ao escalar para baixo, o ReplicaSet controller escolhe quais pods irá deletar ordenando os pods disponíveis para priorizar quais pods seram decaídos seguindo o seguinte algoritmo geral:
270+
1. Pods pending (e unschedulable) são decaídos primeiro
271+
2. Se a anotação `controller.kubernetes.io/pod-deletion-cost` estiver definida, então o pod com o menor valor será priorizado primeiro.
272+
3. Pods em nodes com mais réplicas são decaídos primeiro que pods em nodes com menos réplicas.
273+
4. Se a data de criação dos pods for diferente, o pod que foi criado mais recentemente vem antes que o pod mais antigo (as datas de criação são guardados em uma escala logaritmica caso o [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) `LogarithmicScaleDown` esteja habilitado)
274+
275+
Se o Pod obdecer todos os items acima simultaneamente, a seleção é aleatória.
276+
277+
### Custo de deleção de Pods
278+
{{< feature-state for_k8s_version="v1.22" state="beta" >}}
279+
280+
Utilizando a anotação [`controller.kubernetes.io/pod-deletion-cost`](/docs/reference/labels-annotations-taints/#pod-deletion-cost),
281+
usuários podem definir uma preferência em relação à quais pods seram removidos primeiro caso o ReplicaSet precisa escalar para baixo.
282+
283+
A anotação deve ser definida no pod, com uma variação de [-2147483647, 2147483647]. Isso representa o custo de deletar um pod comparado com outros pods que pertencem à esse mesmo ReplicaSet. Pods com um custo de deleção menor são eleitos para deleção antes de pods com um custo maior.
284+
285+
O valor implícito para essa anotação para pods que não a tem definida é 0; valores negativos são permitidos.
286+
Valores inválidos serão rejeitados pelo servidor API.
287+
288+
Esse recurso está em beta e é habilitado por padrão. Você consegue desabilita-lo usando o
289+
[feature gate](/docs/reference/command-line-tools-reference/feature-gates/)
290+
`PodDeletionCost` ambos no kube-apiserver e no kube-controller-manager.
291+
292+
{{< note >}}
293+
- Esse recurso é honrado baseado no melhor esforço, portanto não oferece qualquer garantia na ordem de deleção dos pods.
294+
- Usuários são recomendados à evitar atualizações frequentes em anotações, como gerar atualizações baseando-se em alguma métrica, porque fazendo isso irá criar um número significante de atualizações de pod para o apiserver.
295+
{{< /note >}}
296+
297+
#### Exemplo de caso de uso
298+
Os diferentes pods de uma aplicação podem ter níves de utilização divergentes. Ao escalar para baixo, a aplicação pode prefirir remover os pods com a menor utilização. Para evitar atualizações frequentes nos pods, a aplicação deve atualizar `controller.kubernetes.io/pod-deletion-cost` uma vez antes de expedir o decaimento das réplicas (configurando a anotação para um valor proporcional ao nível de utilização do pod). Isso funciona se a própria aplicação controlar a escala para baixo; por exemplo, o pod condutor de um deployment de Spark.
299+
300+
### ReplicaSet como um Horizontal Pod Autoscaler Target
301+
302+
Um ReplicaSet pode também ser controlado por um
303+
[Horizontal Pod Autoscalers (HPA)](/docs/tasks/run-application/horizontal-pod-autoscale/). Isto é,
304+
um ReplicaSet pode ser automaticamente escalado por um HPA. Aqui está um exemplo de um HPA controlando o ReplicaSet que nós criamos no exemplo anterior.
305+
306+
{{< codenew file="controllers/hpa-rs.yaml" >}}
307+
308+
Salvando esse manifesto como `hpa-rs.yaml` e enviando para o cluster Kubernetes deve
309+
criar um HPA definido que autoescala o ReplicaSet controlado dependendo no uso de CPU
310+
dos Pods replicados.
311+
312+
```shell
313+
kubectl apply -f https://k8s.io/examples/controllers/hpa-rs.yaml
314+
```
315+
316+
317+
Alternativamente, você pode usar o comando `kubectl autoscale` para realizar a mesma coisa
318+
(e é bem mais simples!)
319+
320+
```shell
321+
kubectl autoscale rs frontend --max=10 --min=3 --cpu-percent=50
322+
```
323+
324+
## Alternativas ao ReplicaSet
325+
326+
### Deployment (recomendado)
327+
328+
[`Deployment`](/docs/concepts/workloads/controllers/deployment/) é um objeto o qual pode possuir ReplicaSets, atualiza-los e por consequência seus Pods via atualizações declarativas, gradativas do lado do servidor.
329+
Enquanto ReplicaSets conseguem ser usados independentemente, hoje eles são principalmente usados por Deployments como um mecanismo para orquestrar a criação, deleção e atualização de um Pod. Quando você usa Deployments você não precisa se preocupar com o gerenciamento de ReplicaSets que são criados por ele. Deployments controlam e gerenciam seus ReplicaSets.
330+
Por isso, é recomendado o uso de Deployments quando você deseja ReplicaSets.
331+
332+
### Bare Pods
333+
334+
Diferente do caso onde um usuário cria Pods diretamente, um ReplicaSet substitui Pods que forem deletados ou terminados por qualquer motivo, como em caso de falha de node ou manutenção disruptivo de node, como uma atualização de kernel. Por esse motivo, nós recomendamos que você use um ReplicaSet mesmo que sua aplicação necessite apenas de um único Pod. Pense na semelhança com um supervisor de processos, apenas que ele supervise vários Pods em múltiplos nodes ao invés de apenas um Pod. Um ReplicaSet delega reinicializações de um container local para algum agente do node (Kubelet ou Docker, por exemplo).
335+
336+
### Job
337+
338+
Use um [`Job`](/docs/concepts/workloads/controllers/job/) no lugar de um ReplicaSet para Pods que tem por objetivo sua terminação no final da execução (como batch jobs).
339+
340+
### DaemonSet
341+
342+
Use um [`DaemonSet`](/docs/concepts/workloads/controllers/daemonset/) no lugar de um ReplicaSet para Pods que precisam prover funções no nível de sistema, como monitoramento do sistema ou logs do sistema. Esses Pods tem um tempo de vida ligado à vida útil do sistema:
343+
os Pods precisam estar executando na máquina antes de outros Pods inicializarem, e são seguros de terminarem quando a máquina esta preparada para reiniciar/desligar.
344+
345+
### ReplicationController
346+
ReplicaSets são sucessores ao [_ReplicationControllers_](/docs/concepts/workloads/controllers/replicationcontroller/).
347+
Os dois servem para o mesmo propósito, e tem comportamentos semelhantes, exceto que um ReplicationController não suporta os requerimentos de um seletor baseado em definição como descrito no [guia de usuário de label](/docs/concepts/overview/working-with-objects/labels/#label-selectors).
348+
Portantom, ReplicaSets são preferíveis à ReplicationControllers
349+
350+
351+
## {{% heading "whatsnext" %}}
352+
353+
* Aprenda sobre [Pods](/docs/concepts/workloads/pods).
354+
* Aprenda sobre [Deployments](/docs/concepts/workloads/controllers/deployment/).
355+
* [Executar uma aplicação Stateless usando um Deployment](/docs/tasks/run-application/run-stateless-application-deployment/),
356+
o qual necessita de ReplicaSets para funcionar.
357+
* `ReplicaSet` é um recurso alto nível na API REST do Kubernetes.
358+
Leia a {{< api-reference page="workload-resources/replica-set-v1" >}}
359+
definição de objeto para entender a API para replica sets.
360+
* Leia sobre [PodDisruptionBudget](/docs/concepts/workloads/pods/disruptions/) e como
361+
você consegue usá-lo para gerenciar disponibilidade de aplicação durante interrupções.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
apiVersion: apps/v1
2+
kind: ReplicaSet
3+
metadata:
4+
name: frontend
5+
labels:
6+
app: guestbook
7+
tier: frontend
8+
spec:
9+
# modifique o número de replicas de acordo com o seu caso
10+
replicas: 3
11+
selector:
12+
matchLabels:
13+
tier: frontend
14+
template:
15+
metadata:
16+
labels:
17+
tier: frontend
18+
spec:
19+
containers:
20+
- name: php-redis
21+
image: gcr.io/google_samples/gb-frontend:v3
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apiVersion: autoscaling/v1
2+
kind: HorizontalPodAutoscaler
3+
metadata:
4+
name: frontend-scaler
5+
spec:
6+
scaleTargetRef:
7+
kind: ReplicaSet
8+
name: frontend
9+
minReplicas: 3
10+
maxReplicas: 10
11+
targetCPUUtilizationPercentage: 50

0 commit comments

Comments
 (0)