|
| 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