Skip to content

Commit b0904d2

Browse files
zilmarrrikatz
andauthored
[l10n] PT-BR - docs/concepts/scheduling-eviction/taint-and-toleration.md (#30049)
* [l10n] starting pt-br l10n [l10n] Localização para pt-br finalizada * Apply suggestions from code review Co-authored-by: Ricardo Katz <[email protected]> Co-authored-by: Ricardo Katz <[email protected]>
1 parent f0c759d commit b0904d2

File tree

2 files changed

+225
-0
lines changed

2 files changed

+225
-0
lines changed
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
---
2+
title: Taints e Tolerâncias
3+
content_type: concept
4+
weight: 40
5+
---
6+
7+
8+
<!-- overview -->
9+
[_Afinidade de nó_](/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity)
10+
é uma propriedade dos {{< glossary_tooltip text="Pods" term_id="pod" >}} que os *associa* a um conjunto de {{< glossary_tooltip text="nós" term_id="node" >}} (seja como uma preferência ou uma exigência). _Taints_ são o oposto -- eles permitem que um nó repudie um conjunto de pods.
11+
12+
_Tolerâncias_ são aplicadas em pods e permitem, mas não exigem, que os pods sejam alocados em nós com _taints_ correspondentes.
13+
14+
Taints e tolerâncias trabalham juntos para garantir que pods não sejam alocados em nós inapropriados. Um ou mais taints são aplicados em um nó; isso define que o nó não deve aceitar nenhum pod que não tolera essas taints.
15+
16+
17+
<!-- body -->
18+
19+
## Conceitos
20+
21+
Você adiciona um taint a um nó utilizando [kubectl taint](/docs/reference/generated/kubectl/kubectl-commands#taint).
22+
Por exemplo,
23+
24+
```shell
25+
kubectl taint nodes node1 key1=value1:NoSchedule
26+
```
27+
28+
define um taint no nó `node1`. O taint tem a chave `key1`, valor `value1` e o efeito `NoSchedule`.
29+
Isso significa que nenhum pod conseguirá ser executado no nó `node1` a menos que possua uma tolerância correspondente.
30+
31+
Para remover o taint adicionado pelo comando acima, você pode executar:
32+
```shell
33+
kubectl taint nodes node1 key1=value1:NoSchedule-
34+
```
35+
36+
Você especifica uma tolerância para um pod na [especificação do Pod](/docs/reference/kubernetes-api/workload-resources/pod-v1#PodSpec). Ambas as seguintes tolerâncias "correspondem" ao taint criado pelo `kubectl taint` acima, e assim um pod com qualquer uma delas poderia ser executado no `node1`:
37+
38+
```yaml
39+
tolerations:
40+
- key: "key1"
41+
operator: "Equal"
42+
value: "value1"
43+
effect: "NoSchedule"
44+
```
45+
46+
```yaml
47+
tolerations:
48+
- key: "key1"
49+
operator: "Exists"
50+
effect: "NoSchedule"
51+
```
52+
53+
Aqui está um exemplo de um pod que utiliza tolerâncias:
54+
55+
{{< codenew file="pods/pod-with-toleration.yaml" >}}
56+
57+
O valor padrão de `operator` é `Equal`.
58+
59+
Uma tolerância "casa" um taint se as chaves e efeitos são os mesmos, e:
60+
61+
* o valor de `operator` é `Exists` (no caso nenhum `value` deve ser especificado), ou
62+
* o valor de `operator` é `Equal` e os valores de `value` são iguais.
63+
64+
{{< note >}}
65+
66+
Existem dois casos especiais:
67+
68+
Uma `key` vazia com o operador `Exists` "casa" todas as chaves, valores e efeitos, o que significa que o pod irá tolerar tudo.
69+
70+
Um `effect` vazio "casa" todos os efeitos com a chave `key1`.
71+
72+
{{< /note >}}
73+
74+
O exemplo acima usou `effect` de `NoSchedule`. De forma alternativa, você pode usar `effect` de `PreferNoSchedule`.
75+
Nesse efeito, o sistema *tentará* evitar que o pod seja alocado ao nó caso ele não tolere os taints definidos, contudo a alocação não será evitada de forma obrigatória. Pode-se dizer que o `PreferNoSchedule` é uma versão permissiva do `NoSchedule`. O terceiro tipo de `effect` é o `NoExecute` que será descrito posteriormente.
76+
77+
Você pode colocar múltiplos taints no mesmo nó e múltiplas tolerâncias no mesmo pod.
78+
O jeito que o Kubernetes processa múltiplos taints e tolerâncias é como um filtro: começa com todos os taints de um nó, em seguida ignora aqueles para os quais o pod tem uma tolerância relacionada; os taints restantes que não foram ignorados indicam o efeito no pod. Mais especificamente,
79+
80+
* se existe pelo menos um taint não tolerado com o efeito `NoSchedule`, o Kubernetes não alocará o pod naquele nó
81+
* se existe um taint não tolerado com o efeito `NoSchedule`, mas existe pelo menos um taint não tolerado com o efeito `PreferNoSchedule`, o Kubernetes *tentará* não alocar o pod no nó
82+
* se existe pelo menos um taint não tolerado com o efeito `NoExecute`, o pod será expulso do nó (caso já esteja em execução) e não será alocado ao nó (caso ainda não esteja em execução).
83+
84+
Por exemplo, imagine que você tem um nó com os seguintes taints
85+
86+
```shell
87+
kubectl taint nodes node1 key1=value1:NoSchedule
88+
kubectl taint nodes node1 key1=value1:NoExecute
89+
kubectl taint nodes node1 key2=value2:NoSchedule
90+
```
91+
92+
E um pod com duas tolerâncias:
93+
94+
```yaml
95+
tolerations:
96+
- key: "key1"
97+
operator: "Equal"
98+
value: "value1"
99+
effect: "NoSchedule"
100+
- key: "key1"
101+
operator: "Equal"
102+
value: "value1"
103+
effect: "NoExecute"
104+
```
105+
106+
Nesse caso, o pod não será alocado ao nó porque não possui uma tolerância para o terceiro taint. Porém, se ele já estiver rodando no nó quando o taint foi adicionado, não será afetado e continuará rodando, tendo em vista que o terceiro taint é o único não tolerado pelo pod.
107+
108+
Normalmente, se um taint com o efeito `NoExecute` é adicionado a um nó, qualquer pod que não o tolere será expulso imediatamente e pods que o toleram nunca serão expulsos. Contudo, uma tolerância com efeito `NoExecute` pode especificar de forma opcional o campo `tolerationSeconds`, que determina quanto tempo o pod continuará alocado ao nó depois que o taint é adicionado. Por exemplo,
109+
110+
```yaml
111+
tolerations:
112+
- key: "key1"
113+
operator: "Equal"
114+
value: "value1"
115+
effect: "NoExecute"
116+
tolerationSeconds: 3600
117+
```
118+
119+
significa que se esse pod está sendo executado e um taint correspondente é adicionado ao nó, o pod irá continuar rodando neste nó por 3600 segundos e depois será expulso. Se o taint for removido antes desse tempo acabar, o pod não será expulso.
120+
121+
## Exemplos de Casos de Uso
122+
123+
Taints e tolerâncias são um modo flexível de conduzir pods para *fora* dos nós ou expulsar pods que não deveriam estar sendo executados. Alguns casos de uso são
124+
125+
* **Nós Dedicados**: Se você quiser dedicar um conjunto de nós para uso exclusivo de um conjunto específico de usuários, poderá adicionar um taint nesses nós. (digamos, `kubectl taint nodes nodename dedicated=groupName:NoSchedule`) e em seguida adicionar uma tolerância correspondente para seus pods (isso seria feito mais facilmente com a escrita de um [controlador de admissão](/docs/reference/access-authn-authz/admission-controllers/) customizado).
126+
Os pods com tolerância terão sua execução permitida nos nós com taints (dedicados), assim como em qualquer outro nó no cluster. Se você quiser dedicar nós a esses pods *e garantir* que eles usem *apenas* os nós dedicados, precisará adicionar uma label similar ao taint para o mesmo conjunto de nós (por exemplo, `dedicated=groupName`), e o controle de admissão deverá adicionar uma afinidade de nó para exigir que os pods podem ser executados apenas nos nós definidos com a label `dedicated=groupName`.
127+
128+
* **Nós com hardware especial**: Em um cluster no qual um pequeno grupo de nós possui hardware especializado (por exemplo, GPUs), é desejável manter pods que não necessitem desse tipo de hardware fora desses nós, dessa forma o recurso estará disponível para pods que precisem do hardware especializado. Isso pode ser feito aplicando taints nos nós com o hardware especializado (por exemplo, `kubectl taint nodes nodename special=true:NoSchedule` or `kubectl taint nodes nodename special=true:PreferNoSchedule`) e aplicando uma tolerância correspondente nos pods que usam o hardware especial. Assim como no caso de uso de nós dedicados, é provavelmente mais fácil aplicar as tolerâncias utilizando um [controlador de admissão](/docs/reference/access-authn-authz/admission-controllers/).
129+
Por exemplo, é recomendado usar [Extended Resources](/docs/concepts/configuration/manage-resources-containers/#extended-resources) para representar hardware especial, adicione um taint ao seus nós de hardware especializado com o nome do recurso estendido e execute o controle de admissão [ExtendedResourceToleration](/docs/reference/access-authn-authz/admission-controllers/#extendedresourcetoleration). Agora, tendo em vista que os nós estão marcados com um taint, nenhum pod sem a tolerância será executado neles. Porém, quando você submete um pod que requisita o recurso estendido, o controlador de admissão `ExtendedResourceToleration` irá adicionar automaticamente as tolerâncias necessárias ao pod que irá, por sua vez, ser alocado no nó com hardware especial. Isso garantirá que esses nós de hardware especial serão dedicados para os pods que requisitarem tal recurso e você não precisará adicionar manualmente as tolerâncias aos seus pods.
130+
131+
* **Expulsões baseadas em Taint**: Um comportamento de expulsão configurada por pod quando problemas existem em um nó, o qual será descrito na próxima seção.
132+
133+
## Expulsões baseadas em Taint
134+
135+
{{< feature-state for_k8s_version="v1.18" state="stable" >}}
136+
137+
O efeito de taint `NoExecute`, mencionado acima, afeta pods que já estão rodando no nó da seguinte forma
138+
139+
* pods que não toleram o taint são expulsos imediatamente
140+
* pods que toleram o taint sem especificar `tolerationSeconds` em sua especificação de tolerância, ficam alocados para sempre
141+
* pods que toleram o taint com um `tolerationSeconds` especificado, permanecem alocados pela quantidade de tempo definida
142+
143+
O controlador de nó automaticamente adiciona um taint ao Nó quando certas condições se tornam verdadeiras. Os seguintes taints são embutidos:
144+
145+
* `node.kubernetes.io/not-ready`: Nó não está pronto. Isso corresponde ao NodeCondition `Ready` com o valor "`False`".
146+
* `node.kubernetes.io/unreachable`: Nó é inalcançável a partir do controlador de nó. Isso corresponde ao NodeCondition `Ready` com o valor "`Unknown`".
147+
* `node.kubernetes.io/memory-pressure`: Nó possui pressão de memória.
148+
* `node.kubernetes.io/disk-pressure`: Nó possui pressão de disco.
149+
* `node.kubernetes.io/pid-pressure`: Nó possui pressão de PID.
150+
* `node.kubernetes.io/network-unavailable`: A rede do nó está indisponível.
151+
* `node.kubernetes.io/unschedulable`: Nó não é alocável.
152+
* `node.cloudprovider.kubernetes.io/uninitialized`: Quando o kubelet é iniciado com um provedor de nuvem "externo", esse taint é adicionado ao nó para que ele seja marcado como não utilizável. Após o controlador do cloud-controller-manager inicializar o nó, o kubelet remove esse taint.
153+
154+
No caso de um nó estar prestes a ser expulso, o controlador de nó ou kubelet adicionam os taints relevantes com o efeito `NoExecute`. Se a condição de falha retorna ao normal, o kubelet ou controlador de nó podem remover esses taints.
155+
156+
{{< note >}}
157+
A camada de gerenciamento limita a taxa de adição de novos taints aos nós. Esse limite gerencia o número de expulsões que são disparadas quando muitos nós se tornam inalcançáveis ao mesmo tempo (por exemplo: se ocorre uma falha na rede).
158+
{{< /note >}}
159+
160+
Você pode especificar `tolerationSeconds` em um Pod para definir quanto tempo ele ficará alocado em um nó que está falhando ou está sem resposta.
161+
162+
Por exemplo, você talvez queira manter uma aplicação com vários estados salvos localmente alocado em um nó por um longo período na ocorrência de uma divisão na rede, esperando que essa divisão se recuperará e assim a expulsão do pod pode ser evitada.
163+
A tolerância que você define para esse Pod poderia ficar assim:
164+
165+
```yaml
166+
tolerations:
167+
- key: "node.kubernetes.io/unreachable"
168+
operator: "Exists"
169+
effect: "NoExecute"
170+
tolerationSeconds: 6000
171+
```
172+
173+
{{< note >}}
174+
O Kubernetes automaticamente adiciona uma tolerância para `node.kubernetes.io/not-ready` e `node.kubernetes.io/unreachable` com `tolerationSeconds=300`, a menos que você, ou um controlador, defina essas tolerâncias explicitamente.
175+
176+
Essas tolerâncias adicionadas automaticamente significam que Pods podem continuar alocados aos Nós por 5 minutos após um desses problemas ser detectado.
177+
{{< /note >}}
178+
179+
Pods do tipo [DaemonSet](/docs/concepts/workloads/controllers/daemonset/) são criados com tolerâncias `NoExecute` sem a propriedade `tolerationSeconds` para os seguintes taints:
180+
181+
* `node.kubernetes.io/unreachable`
182+
* `node.kubernetes.io/not-ready`
183+
184+
Isso garante que esses pods do DaemonSet nunca sejam expulsos por conta desses problemas.
185+
186+
## Taints por condições de nó
187+
188+
A camada de gerenciamento, usando o {{<glossary_tooltip text="controlador" term_id="controller">}} do nó, cria taints automaticamente com o efeito `NoSchedule` para [condições de nó](/docs/concepts/scheduling-eviction/node-pressure-eviction/#node-conditions).
189+
190+
O agendador verifica taints, não condições de nó, quando realiza suas decisões de agendamento. Isso garante que as condições de nó não afetem diretamente o agendamento.
191+
Por exemplo, se a condição de nó `DiskPressure` está ativa, a camada de gerenciamento adiciona o taint `node.kubernetes.io/disk-pressure` e não aloca novos pods no nó afetado. Se a condição `MemoryPressure` está ativa, a camada de gerenciamento adiciona o taint `node.kubernetes.io/memory-pressure`.
192+
193+
Você pode ignorar condições de nó para pods recém-criados adicionando tolerâncias correspondentes. A camada de controle também adiciona a tolerância `node.kubernetes.io/memory-pressure` em pods que possuem uma {{< glossary_tooltip text="classe de QoS" term_id="qos-class" >}} diferente de `BestEffort`. Isso ocorre porque o Kubernetes trata pods nas classes de QoS `Guaranteed` ou `Burstable` (até mesmo pods sem requisitos de memória definidos) como se fossem capazes de lidar com pressão de memória, enquanto novos pods com `BestEffort` não são alocados no nó afetado.
194+
195+
O controlador DaemonSet adiciona automaticamente as seguintes tolerâncias de `NoSchedule` para todos os daemons, prevenindo que DaemonSets quebrem.
196+
197+
* `node.kubernetes.io/memory-pressure`
198+
* `node.kubernetes.io/disk-pressure`
199+
* `node.kubernetes.io/pid-pressure` (1.14 ou superior)
200+
* `node.kubernetes.io/unschedulable` (1.10 ou superior)
201+
* `node.kubernetes.io/network-unavailable` (*somente rede do host*)
202+
203+
Adicionando essas tolerâncias garante retro compatibilidade. Você também pode adicionar tolerâncias de forma arbitrária aos DaemonSets.
204+
205+
## {{% heading "whatsnext" %}}
206+
207+
* Leia sobre [Node-pressure Eviction](/docs/concepts/scheduling-eviction/node-pressure-eviction/) e como você pode configurá-la
208+
* Leia sobre [Pod Priority](/docs/concepts/scheduling-eviction/pod-priority-preemption/)
209+
210+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
name: nginx
5+
labels:
6+
env: test
7+
spec:
8+
containers:
9+
- name: nginx
10+
image: nginx
11+
imagePullPolicy: IfNotPresent
12+
tolerations:
13+
- key: "example-key"
14+
operator: "Exists"
15+
effect: "NoSchedule"

0 commit comments

Comments
 (0)