Skip to content

Commit 7a3d98a

Browse files
authored
Merge pull request #21072 from joao-luna-98/master
Add docs/concepts/configuration/pod-overhead.md
2 parents b31f2e3 + 52adcbf commit 7a3d98a

File tree

2 files changed

+202
-0
lines changed

2 files changed

+202
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
title: "Configuração"
3+
weight: 80
4+
---
5+
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
---
2+
reviewers:
3+
- dchen1107
4+
- egernst
5+
- tallclair
6+
title: Pod Overhead
7+
content_template: templates/concept
8+
weight: 50
9+
---
10+
11+
{{% capture overview %}}
12+
13+
{{< feature-state for_k8s_version="v1.18" state="beta" >}}
14+
15+
Quando executa um Pod num nó, o próprio Pod usa uma quantidade de recursos do sistema. Estes
16+
recursos são adicionais aos recursos necessários para executar o(s) _container(s)_ dentro do Pod.
17+
Sobrecarga de Pod, do inglês _Pod Overhead_, é uma funcionalidade que serve para contabilizar os recursos consumidos pela
18+
infraestrutura do Pod para além das solicitações e limites do _container_.
19+
20+
21+
{{% /capture %}}
22+
23+
24+
{{% capture body %}}
25+
26+
No Kubernetes, a sobrecarga de _Pods_ é definido no tempo de
27+
[admissão](/docs/reference/access-authn-authz/extensible-admission-controllers/#what-are-admission-webhooks)
28+
de acordo com a sobrecarga associada à
29+
[RuntimeClass](/docs/concepts/containers/runtime-class/) do _Pod_.
30+
31+
Quando é ativada a Sobrecarga de Pod, a sobrecarga é considerada adicionalmente à soma das
32+
solicitações de recursos do _container_ ao agendar um Pod. Semelhantemente, o _kubelet_
33+
incluirá a sobrecarga do Pod ao dimensionar o cgroup do Pod e ao
34+
executar a classificação de despejo do Pod.
35+
36+
## Possibilitando a Sobrecarga do Pod {#set-up}
37+
38+
Terá de garantir que o [portão de funcionalidade](/docs/reference/command-line-tools-reference/feature-gates/)
39+
`PodOverhead` está ativo (está ativo por defeito a partir da versão 1.18)
40+
por todo o cluster, e uma `RuntimeClass` é utilizada que defina o campo `overhead`.
41+
42+
## Exemplo de uso
43+
44+
Para usar a funcionalidade PodOverhead, é necessário uma RuntimeClass que define o campo `overhead`.
45+
Por exemplo, poderia usar a definição da RuntimeClass abaixo com um _container runtime_ virtualizado
46+
que usa cerca de 120MiB por Pod para a máquina virtual e o sistema operativo convidado:
47+
48+
```yaml
49+
---
50+
kind: RuntimeClass
51+
apiVersion: node.k8s.io/v1beta1
52+
metadata:
53+
name: kata-fc
54+
handler: kata-fc
55+
overhead:
56+
podFixed:
57+
memory: "120Mi"
58+
cpu: "250m"
59+
```
60+
61+
As cargas de trabalho que são criadas e que especificam o manipulador RuntimeClass `kata-fc` irão
62+
usar a sobrecarga de memória e cpu em conta para os cálculos da quota de recursos, agendamento de nós,
63+
assim como dimensionamento do cgroup do Pod.
64+
65+
Considere executar a seguinte carga de trabalho de exemplo, test-pod:
66+
67+
```yaml
68+
apiVersion: v1
69+
kind: Pod
70+
metadata:
71+
name: test-pod
72+
spec:
73+
runtimeClassName: kata-fc
74+
containers:
75+
- name: busybox-ctr
76+
image: busybox
77+
stdin: true
78+
tty: true
79+
resources:
80+
limits:
81+
cpu: 500m
82+
memory: 100Mi
83+
- name: nginx-ctr
84+
image: nginx
85+
resources:
86+
limits:
87+
cpu: 1500m
88+
memory: 100Mi
89+
```
90+
91+
Na altura de admissão o [controlador de admissão](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/) RuntimeClass
92+
atualiza o _PodSpec_ da carga de trabalho de forma a incluir o `overhead` como descrito na RuntimeClass. Se o _PodSpec_ já tiver este campo definido
93+
o _Pod_ será rejeitado. No exemplo dado, como apenas o nome do RuntimeClass é especificado, o controlador de admissão muda o _Pod_ de forma a
94+
incluir um `overhead`.
95+
96+
Depois do controlador de admissão RuntimeClass, pode verificar o _PodSpec_ atualizado:
97+
98+
```bash
99+
kubectl get pod test-pod -o jsonpath='{.spec.overhead}'
100+
```
101+
102+
O output é:
103+
```
104+
map[cpu:250m memory:120Mi]
105+
```
106+
107+
Se for definido um _ResourceQuota_, a soma dos pedidos dos _containers_ assim como o campo `overhead` são contados.
108+
109+
Quando o kube-scheduler está a decidir que nó deve executar um novo _Pod_, o agendador considera o `overhead` do _Pod_,
110+
assim como a soma de pedidos aos _containers_ para esse _Pod_. Para este exemplo, o agendador adiciona os
111+
pedidos e a sobrecarga, depois procura um nó com 2.25 CPU e 320 MiB de memória disponível.
112+
113+
Assim que um _Pod_ é agendado a um nó, o kubelet nesse nó cria um novo {{< glossary_tooltip text="cgroup" term_id="cgroup" >}}
114+
para o _Pod_. É dentro deste _pod_ que o _container runtime_ subjacente vai criar _containers_.
115+
116+
Se o recurso tiver um limite definido para cada _container_ (_QoS_ garantida ou _Burstrable QoS_ com limites definidos),
117+
o kubelet definirá um limite superior para o cgroup do _pod_ associado a esse recurso (cpu.cfs_quota_us para CPU
118+
e memory.limit_in_bytes de memória). Este limite superior é baseado na soma dos limites do _container_ mais o `overhead`
119+
definido no _PodSpec_.
120+
121+
Para o CPU, se o _Pod_ for QoS garantida ou _Burstrable QoS_, o kubelet vai definir `cpu.shares` baseado na soma dos
122+
pedidos ao _container_ mais o `overhead` definido no _PodSpec_.
123+
124+
Olhando para o nosso exemplo, verifique os pedidos ao _container_ para a carga de trabalho:
125+
```bash
126+
kubectl get pod test-pod -o jsonpath='{.spec.containers[*].resources.limits}'
127+
```
128+
129+
O total de pedidos ao _container_ são 2000m CPU e 200MiB de memória:
130+
```
131+
map[cpu: 500m memory:100Mi] map[cpu:1500m memory:100Mi]
132+
```
133+
134+
Verifique isto contra o que é observado pelo nó:
135+
```bash
136+
kubectl describe node | grep test-pod -B2
137+
```
138+
139+
O output mostra que 2250m CPU e 320MiB de memória são solicitados, que inclui _PodOverhead_:
140+
```
141+
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
142+
--------- ---- ------------ ---------- --------------- ------------- ---
143+
default test-pod 2250m (56%) 2250m (56%) 320Mi (1%) 320Mi (1%) 36m
144+
```
145+
146+
## Verificar os limites cgroup do Pod
147+
148+
Verifique os cgroups de memória do Pod no nó onde a carga de trabalho está em execução. No seguinte exemplo, [`crictl`] (https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md)
149+
é usado no nó, que fornece uma CLI para _container runtimes_ compatíveis com CRI. Isto é um
150+
exemplo avançado para mostrar o comportamento do _PodOverhead_, e não é esperado que os utilizadores precisem de verificar
151+
cgroups diretamente no nó.
152+
153+
Primeiro, no nó em particular, determine o identificador do _Pod_:
154+
155+
```bash
156+
# Execute no nó onde o Pod está agendado
157+
POD_ID="$(sudo crictl pods --name test-pod -q)"
158+
```
159+
160+
A partir disto, pode determinar o caminho do cgroup para o _Pod_:
161+
```bash
162+
# Execute no nó onde o Pod está agendado
163+
sudo crictl inspectp -o=json $POD_ID | grep cgroupsPath
164+
```
165+
166+
O caminho do cgroup resultante inclui o _container_ `pause` do _Pod_. O cgroup no nível do _Pod_ está um diretório acima.
167+
```
168+
"cgroupsPath": "/kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2/7ccf55aee35dd16aca4189c952d83487297f3cd760f1bbf09620e206e7d0c27a"
169+
```
170+
171+
Neste caso especifico, o caminho do cgroup do pod é `kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2`. Verifique a configuração cgroup de nível do _Pod_ para a memória:
172+
```bash
173+
# Execute no nó onde o Pod está agendado
174+
# Mude também o nome do cgroup de forma a combinar com o cgroup alocado ao pod.
175+
cat /sys/fs/cgroup/memory/kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2/memory.limit_in_bytes
176+
```
177+
178+
Isto é 320 MiB, como esperado:
179+
```
180+
335544320
181+
```
182+
183+
### Observabilidade
184+
185+
Uma métrica `kube_pod_overhead` está disponível em [kube-state-metrics] (https://github.com/kubernetes/kube-state-metrics)
186+
para ajudar a identificar quando o _PodOverhead_ está a ser utilizado e para ajudar a observar a estabilidade das cargas de trabalho
187+
em execução com uma sobrecarga (_Overhead_) definida. Esta funcionalidade não está disponível na versão 1.9 do kube-state-metrics,
188+
mas é esperado num próximo _release_. Os utilizadores necessitarão entretanto de construir kube-state-metrics a partir da fonte.
189+
190+
{{% /capture %}}
191+
192+
{{% capture whatsnext %}}
193+
194+
* [RuntimeClass](/docs/concepts/containers/runtime-class/)
195+
* [PodOverhead Design](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190226-pod-overhead.md)
196+
197+
{{% /capture %}}

0 commit comments

Comments
 (0)