Skip to content

Commit c02ad13

Browse files
authored
Merge pull request #34017 from joaoceragioli/main
[pt-br] Add concepts/workloads/controllers/replicaset.md
2 parents 0c41cf7 + 1faba40 commit c02ad13

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 podTemplate.
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 identificação do ReplicaSet vinculado no campo ownerReferences. É por esse elo que o ReplicaSet tem conhecimento do estado dos Pods que está mantendo e assim faz seu planejamento.
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 réplicas de um Pod 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 ao invés do 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 o ReplicaSet definido e os Pods mantidos pelo mesmo.
34+
35+
```shell
36+
kubectl apply -f https://kubernetes.io/pt-br/examples/controllers/frontend.yaml
37+
```
38+
39+
Você pode então retornar os ReplicaSets atualmente existentes atualmente no cluster:
40+
41+
```shell
42+
kubectl get rs
43+
```
44+
45+
E observar o ReplicaSet com o nome de 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 do ReplicaSet:
53+
54+
```shell
55+
kubectl describe rs/frontend
56+
```
57+
58+
E você deve ver uma saída similar a esta:
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 criados:
89+
90+
```shell
91+
kubectl get pods
92+
```
93+
94+
Você deve ver 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 o 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á semelhante ao exibido abaixo, 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 descrita nas seções anteriores.
135+
136+
Observe o exemplo anterior 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 combinam 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 instalado 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 pelo ReplicaSet, e logo depois terminados já que o ReplicaSet estará acima do número desejado.
149+
150+
Buscando 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 estão 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 seja igual a ao número desejado. Listando os Pods:
180+
181+
```shell
182+
kubectl get pods
183+
```
184+
185+
Irá retornar a seguinte saída:
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: `tier: 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 combinar com `spec.selector`, ou 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 ReplicaSet original for deletado, você pode criar um novo ReplicaSet para substituí-lo. Contanto que o `.spec.selector` do antigo e do atual sejam o mesmo, o novo irá adquirir os Pods antigos. Porém, o ReplicaSet não atualizará as definições dos Pods existentes 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 atualização gradual 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 serviço para depuração, 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+
### Escalonando um ReplicaSet
266+
267+
Um ReplicaSet pode ser facilmente escalonado para cima ou para baixo simplesmente 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 escalonar para baixo, o Replicaset controller escolhe quais pods irá deletar ordenando os pods disponíveis para priorizar quais pods seram escalonados para baixo seguindo o seguinte algoritmo geral:
270+
1. Pods pendentes (e não agendáveis) 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 nós 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 logarítmica caso o [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) `LogarithmicScaleDown` esteja habilitado)
274+
275+
Se o Pod obedecer 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 serão removidos primeiro caso o ReplicaSet precise escalonar 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íveis de utilização divergentes. Ao escalonar para baixo, a aplicação pode preferir 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 escalonamento para baixo 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 o escalonamento; 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 escalonado 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 autoescalona o ReplicaSet controlado dependendo do 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, atualizá-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 nó ou manutenção disruptiva de nó, 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 supervisione vários Pods em múltiplos nós ao invés de apenas um Pod. Um ReplicaSet delega reinicializações de um container local para algum agente do nó (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+
Portanto, 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

0 commit comments

Comments
 (0)