|
| 1 | +--- |
| 2 | +title: "Solução de problemas em Clusters" |
| 3 | +description: Depurando problemas comuns em clusters. |
| 4 | +weight: 20 |
| 5 | +no_list: true |
| 6 | +--- |
| 7 | + |
| 8 | +<!-- overview --> |
| 9 | + |
| 10 | +Esta documentação é sobre solução de problemas em clusters; assumimos que você já descartou sua aplicação como a causa raiz do |
| 11 | +problema que está enfrentando. Consulte o [guia de solução de problemas em aplicações](/docs/tasks/debug/debug-application/) para |
| 12 | +dicas sobre depuração de aplicações. |
| 13 | +Você também pode visitar o [documento de visão geral de solução de problemas](/docs/tasks/debug/) para mais informações. |
| 14 | + |
| 15 | +Para solução de problemas do {{<glossary_tooltip text="kubectl" term_id="kubectl">}}, consulte |
| 16 | +[Solução de problemas do kubectl](/docs/tasks/debug/debug-cluster/troubleshoot-kubectl/). |
| 17 | + |
| 18 | +<!-- body --> |
| 19 | + |
| 20 | +## Listando seu cluster |
| 21 | + |
| 22 | +A primeira coisa a depurar no seu cluster é se todos os seus nós estão registrados corretamente. |
| 23 | + |
| 24 | +Execute o seguinte comando: |
| 25 | + |
| 26 | +```shell |
| 27 | +kubectl get nodes |
| 28 | +``` |
| 29 | + |
| 30 | +E verifique se todos os nós que você espera ver estão presentes e se todos estão no estado `Ready`. |
| 31 | + |
| 32 | +Para obter informações detalhadas sobre a integridade geral do seu cluster, você pode executar: |
| 33 | + |
| 34 | +```shell |
| 35 | +kubectl cluster-info dump |
| 36 | +``` |
| 37 | + |
| 38 | +### Exemplo: depurando um nó indisponível/inacessível |
| 39 | + |
| 40 | +Às vezes, durante a depuração, pode ser útil verificar o status de um nó -- por exemplo, porque |
| 41 | +você notou um comportamento estranho de um Pod que está executando no nó, ou para descobrir por que um Pod |
| 42 | +não será alocado no nó. Assim como com os Pods, você pode usar `kubectl describe node` e `kubectl get |
| 43 | +node -o yaml` para recuperar informações detalhadas sobre os nós. Por exemplo, aqui está o que você verá se |
| 44 | +um nó estiver indisponível (desconectado da rede, ou o kubelet morre e não reinicia, etc.). Observe |
| 45 | +os eventos que mostram que o nó está `NotReady`, e também observe que os pods não estão mais em execução |
| 46 | +(eles são removidos após cinco minutos de status `NotReady`). |
| 47 | + |
| 48 | +```shell |
| 49 | +kubectl get nodes |
| 50 | +``` |
| 51 | + |
| 52 | +```none |
| 53 | +NAME STATUS ROLES AGE VERSION |
| 54 | +kube-worker-1 NotReady <none> 1h v1.23.3 |
| 55 | +kubernetes-node-bols Ready <none> 1h v1.23.3 |
| 56 | +kubernetes-node-st6x Ready <none> 1h v1.23.3 |
| 57 | +kubernetes-node-unaj Ready <none> 1h v1.23.3 |
| 58 | +``` |
| 59 | + |
| 60 | +```shell |
| 61 | +kubectl describe node kube-worker-1 |
| 62 | +``` |
| 63 | + |
| 64 | +```none |
| 65 | +Name: kube-worker-1 |
| 66 | +Roles: <none> |
| 67 | +Labels: beta.kubernetes.io/arch=amd64 |
| 68 | + beta.kubernetes.io/os=linux |
| 69 | + kubernetes.io/arch=amd64 |
| 70 | + kubernetes.io/hostname=kube-worker-1 |
| 71 | + kubernetes.io/os=linux |
| 72 | + node.alpha.kubernetes.io/ttl: 0 |
| 73 | + volumes.kubernetes.io/controller-managed-attach-detach: true |
| 74 | +CreationTimestamp: Thu, 17 Feb 2022 16:46:30 -0500 |
| 75 | +Taints: node.kubernetes.io/unreachable:NoExecute |
| 76 | + node.kubernetes.io/unreachable:NoSchedule |
| 77 | +Unschedulable: false |
| 78 | +Lease: |
| 79 | + HolderIdentity: kube-worker-1 |
| 80 | + AcquireTime: <unset> |
| 81 | + RenewTime: Thu, 17 Feb 2022 17:13:09 -0500 |
| 82 | +Conditions: |
| 83 | + Type Status LastHeartbeatTime LastTransitionTime Reason Message |
| 84 | + ---- ------ ----------------- ------------------ ------ ------- |
| 85 | + NetworkUnavailable False Thu, 17 Feb 2022 17:09:13 -0500 Thu, 17 Feb 2022 17:09:13 -0500 WeaveIsUp Weave pod has set this |
| 86 | + MemoryPressure Unknown Thu, 17 Feb 2022 17:12:40 -0500 Thu, 17 Feb 2022 17:13:52 -0500 NodeStatusUnknown Kubelet stopped posting node status. |
| 87 | + DiskPressure Unknown Thu, 17 Feb 2022 17:12:40 -0500 Thu, 17 Feb 2022 17:13:52 -0500 NodeStatusUnknown Kubelet stopped posting node status. |
| 88 | + PIDPressure Unknown Thu, 17 Feb 2022 17:12:40 -0500 Thu, 17 Feb 2022 17:13:52 -0500 NodeStatusUnknown Kubelet stopped posting node status. |
| 89 | + Ready Unknown Thu, 17 Feb 2022 17:12:40 -0500 Thu, 17 Feb 2022 17:13:52 -0500 NodeStatusUnknown Kubelet stopped posting node status. |
| 90 | +Addresses: |
| 91 | + InternalIP: 192.168.0.113 |
| 92 | + Hostname: kube-worker-1 |
| 93 | +Capacity: |
| 94 | + cpu: 2 |
| 95 | + ephemeral-storage: 15372232Ki |
| 96 | + hugepages-2Mi: 0 |
| 97 | + memory: 2025188Ki |
| 98 | + pods: 110 |
| 99 | +Allocatable: |
| 100 | + cpu: 2 |
| 101 | + ephemeral-storage: 14167048988 |
| 102 | + hugepages-2Mi: 0 |
| 103 | + memory: 1922788Ki |
| 104 | + pods: 110 |
| 105 | +System Info: |
| 106 | + Machine ID: 9384e2927f544209b5d7b67474bbf92b |
| 107 | + System UUID: aa829ca9-73d7-064d-9019-df07404ad448 |
| 108 | + Boot ID: 5a295a03-aaca-4340-af20-1327fa5dab5c |
| 109 | + Kernel Version: 5.13.0-28-generic |
| 110 | + OS Image: Ubuntu 21.10 |
| 111 | + Operating System: linux |
| 112 | + Architecture: amd64 |
| 113 | + Container Runtime Version: containerd://1.5.9 |
| 114 | + Kubelet Version: v1.23.3 |
| 115 | + Kube-Proxy Version: v1.23.3 |
| 116 | +Non-terminated Pods: (4 in total) |
| 117 | + Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age |
| 118 | + --------- ---- ------------ ---------- --------------- ------------- --- |
| 119 | + default nginx-deployment-67d4bdd6f5-cx2nz 500m (25%) 500m (25%) 128Mi (6%) 128Mi (6%) 23m |
| 120 | + default nginx-deployment-67d4bdd6f5-w6kd7 500m (25%) 500m (25%) 128Mi (6%) 128Mi (6%) 23m |
| 121 | + kube-system kube-proxy-dnxbz 0 (0%) 0 (0%) 0 (0%) 0 (0%) 28m |
| 122 | + kube-system weave-net-gjxxp 100m (5%) 0 (0%) 200Mi (10%) 0 (0%) 28m |
| 123 | +Allocated resources: |
| 124 | + (Total limits may be over 100 percent, i.e., overcommitted.) |
| 125 | + Resource Requests Limits |
| 126 | + -------- -------- ------ |
| 127 | + cpu 1100m (55%) 1 (50%) |
| 128 | + memory 456Mi (24%) 256Mi (13%) |
| 129 | + ephemeral-storage 0 (0%) 0 (0%) |
| 130 | + hugepages-2Mi 0 (0%) 0 (0%) |
| 131 | +Events: |
| 132 | +... |
| 133 | +``` |
| 134 | + |
| 135 | +```shell |
| 136 | +kubectl get node kube-worker-1 -o yaml |
| 137 | +``` |
| 138 | + |
| 139 | +```yaml |
| 140 | +apiVersion: v1 |
| 141 | +kind: Node |
| 142 | +metadata: |
| 143 | + annotations: |
| 144 | + node.alpha.kubernetes.io/ttl: "0" |
| 145 | + volumes.kubernetes.io/controller-managed-attach-detach: "true" |
| 146 | + creationTimestamp: "2022-02-17T21:46:30Z" |
| 147 | + labels: |
| 148 | + beta.kubernetes.io/arch: amd64 |
| 149 | + beta.kubernetes.io/os: linux |
| 150 | + kubernetes.io/arch: amd64 |
| 151 | + kubernetes.io/hostname: kube-worker-1 |
| 152 | + kubernetes.io/os: linux |
| 153 | + name: kube-worker-1 |
| 154 | + resourceVersion: "4026" |
| 155 | + uid: 98efe7cb-2978-4a0b-842a-1a7bf12c05f8 |
| 156 | +spec: {} |
| 157 | +status: |
| 158 | + addresses: |
| 159 | + - address: 192.168.0.113 |
| 160 | + type: InternalIP |
| 161 | + - address: kube-worker-1 |
| 162 | + type: Hostname |
| 163 | + allocatable: |
| 164 | + cpu: "2" |
| 165 | + ephemeral-storage: "14167048988" |
| 166 | + hugepages-2Mi: "0" |
| 167 | + memory: 1922788Ki |
| 168 | + pods: "110" |
| 169 | + capacity: |
| 170 | + cpu: "2" |
| 171 | + ephemeral-storage: 15372232Ki |
| 172 | + hugepages-2Mi: "0" |
| 173 | + memory: 2025188Ki |
| 174 | + pods: "110" |
| 175 | + conditions: |
| 176 | + - lastHeartbeatTime: "2022-02-17T22:20:32Z" |
| 177 | + lastTransitionTime: "2022-02-17T22:20:32Z" |
| 178 | + message: Weave pod has set this |
| 179 | + reason: WeaveIsUp |
| 180 | + status: "False" |
| 181 | + type: NetworkUnavailable |
| 182 | + - lastHeartbeatTime: "2022-02-17T22:20:15Z" |
| 183 | + lastTransitionTime: "2022-02-17T22:13:25Z" |
| 184 | + message: kubelet has sufficient memory available |
| 185 | + reason: KubeletHasSufficientMemory |
| 186 | + status: "False" |
| 187 | + type: MemoryPressure |
| 188 | + - lastHeartbeatTime: "2022-02-17T22:20:15Z" |
| 189 | + lastTransitionTime: "2022-02-17T22:13:25Z" |
| 190 | + message: kubelet has no disk pressure |
| 191 | + reason: KubeletHasNoDiskPressure |
| 192 | + status: "False" |
| 193 | + type: DiskPressure |
| 194 | + - lastHeartbeatTime: "2022-02-17T22:20:15Z" |
| 195 | + lastTransitionTime: "2022-02-17T22:13:25Z" |
| 196 | + message: kubelet has sufficient PID available |
| 197 | + reason: KubeletHasSufficientPID |
| 198 | + status: "False" |
| 199 | + type: PIDPressure |
| 200 | + - lastHeartbeatTime: "2022-02-17T22:20:15Z" |
| 201 | + lastTransitionTime: "2022-02-17T22:15:15Z" |
| 202 | + message: kubelet is posting ready status |
| 203 | + reason: KubeletReady |
| 204 | + status: "True" |
| 205 | + type: Ready |
| 206 | + daemonEndpoints: |
| 207 | + kubeletEndpoint: |
| 208 | + Port: 10250 |
| 209 | + nodeInfo: |
| 210 | + architecture: amd64 |
| 211 | + bootID: 22333234-7a6b-44d4-9ce1-67e31dc7e369 |
| 212 | + containerRuntimeVersion: containerd://1.5.9 |
| 213 | + kernelVersion: 5.13.0-28-generic |
| 214 | + kubeProxyVersion: v1.23.3 |
| 215 | + kubeletVersion: v1.23.3 |
| 216 | + machineID: 9384e2927f544209b5d7b67474bbf92b |
| 217 | + operatingSystem: linux |
| 218 | + osImage: Ubuntu 21.10 |
| 219 | + systemUUID: aa829ca9-73d7-064d-9019-df07404ad448 |
| 220 | +``` |
| 221 | +
|
| 222 | +
|
| 223 | +## Examinando logs |
| 224 | +
|
| 225 | +Por enquanto, investigar mais profundamente o cluster requer fazer login nas máquinas relevantes. Veja abaixo as localizações |
| 226 | +dos arquivos de log relevantes. Em sistemas baseados em systemd, você pode precisar usar `journalctl` ao invés de examinar arquivos de log. |
| 227 | + |
| 228 | +### Nós da camada de gerenciamento |
| 229 | + |
| 230 | +* `/var/log/kube-apiserver.log` - Servidor de API, responsável por servir a API |
| 231 | +* `/var/log/kube-scheduler.log` - Agendador, responsável por tomar decisões de alocação |
| 232 | +* `/var/log/kube-controller-manager.log` - um componente que executa a maioria dos |
| 233 | + {{<glossary_tooltip text="controladores" term_id="controller">}} embutidos do Kubernetes, com a notável exceção da alocação |
| 234 | + (o kube-scheduler lida com a alocação). |
| 235 | + |
| 236 | +### Nós de carga de trabalho |
| 237 | + |
| 238 | +* `/var/log/kubelet.log` - logs do kubelet, responsável por executar contêineres no nó |
| 239 | +* `/var/log/kube-proxy.log` - logs do `kube-proxy`, que é responsável por direcionar tráfego para endpoints de Service |
| 240 | + |
| 241 | +## Modos de falha do cluster |
| 242 | + |
| 243 | +Esta é uma lista incompleta de coisas que podem dar errado e como ajustar a configuração do seu cluster para mitigar os problemas. |
| 244 | + |
| 245 | +### Causas contribuintes |
| 246 | + |
| 247 | +- Desligamento de VM(s) |
| 248 | +- Partição de rede dentro do cluster, ou entre cluster e usuários |
| 249 | +- Falhas no software do Kubernetes |
| 250 | +- Perda de dados ou indisponibilidade de armazenamento persistente (por exemplo, volume GCE PD ou AWS EBS) |
| 251 | +- Erro do operador, por exemplo, software do Kubernetes ou software de aplicação mal configurados |
| 252 | + |
| 253 | +### Cenários específicos |
| 254 | + |
| 255 | +- Desligamento de VM do servidor de API ou falha do servidor de API |
| 256 | + - Resultados |
| 257 | + - incapaz de parar, atualizar ou iniciar novos pods, services, replication controller |
| 258 | + - pods e services existentes devem continuar funcionando normalmente, a menos que dependam da API do Kubernetes |
| 259 | +- Armazenamento de apoio do servidor de API perdido |
| 260 | + - Resultados |
| 261 | + - o componente kube-apiserver falha ao iniciar com sucesso e se tornar íntegro |
| 262 | + - kubelets não conseguirão alcançá-lo, mas continuarão a executar os mesmos pods e fornecer o mesmo proxy de serviço |
| 263 | + - recuperação manual ou recriação do estado do servidor de API necessária antes que o servidor de API seja reiniciado |
| 264 | +- Desligamento ou falha de VM dos serviços de apoio (controlador de nó, gerenciador de replication controller, agendador, etc) |
| 265 | + - atualmente eles estão localizados junto com o servidor de API, e sua indisponibilidade tem consequências similares ao servidor de API |
| 266 | + - no futuro, estes serão replicados também e podem não estar localizados juntos |
| 267 | + - eles não têm seu próprio estado persistente |
| 268 | +- Nó individual (VM ou máquina física) desliga |
| 269 | + - Resultados |
| 270 | + - pods nesse nó param de executar |
| 271 | +- Partição de rede |
| 272 | + - Resultados |
| 273 | + - partição A pensa que os nós na partição B estão inativos; partição B pensa que o servidor de API está inativo. |
| 274 | + (Assumindo que a VM principal fique na partição A.) |
| 275 | +- Falha de software do Kubelet |
| 276 | + - Resultados |
| 277 | + - kubelet com falha não consegue iniciar novos pods no nó |
| 278 | + - kubelet pode deletar os pods ou não |
| 279 | + - nó marcado como não íntegro |
| 280 | + - replication controllers iniciam novos pods em outros lugares |
| 281 | +- Erro do operador do cluster |
| 282 | + - Resultados |
| 283 | + - perda de pods, services, etc |
| 284 | + - perda do armazenamento de apoio do servidor de API |
| 285 | + - usuários incapazes de ler a API |
| 286 | + - etc. |
| 287 | + |
| 288 | +### Mitigações |
| 289 | + |
| 290 | +- Ação: Use a funcionalidade de reinicialização automática de VM do provedor IaaS para VMs IaaS |
| 291 | + - Mitiga: Desligamento de VM do servidor de API ou falha do servidor de API |
| 292 | + - Mitiga: Desligamento de VM de serviços de apoio ou falhas |
| 293 | + |
| 294 | +- Ação: Use armazenamento confiável de provedores IaaS (por exemplo, GCE PD ou volume AWS EBS) para VMs com servidor de API + etcd |
| 295 | + - Mitiga: Armazenamento de apoio do servidor de API perdido |
| 296 | + |
| 297 | +- Ação: Use configuração de [alta disponibilidade](/docs/setup/production-environment/tools/kubeadm/high-availability/) |
| 298 | + - Mitiga: Desligamento de nó da camada de gerenciamento ou falha de componentes da camada de gerenciamento (agendador, servidor de API, controller-manager) |
| 299 | + - Tolerará uma ou mais falhas simultâneas de nó ou componente |
| 300 | + - Mitiga: Armazenamento de apoio do servidor de API (ou seja, diretório de dados do etcd) perdido |
| 301 | + - Assume configuração de etcd HA (alta disponibilidade) |
| 302 | + |
| 303 | +- Ação: Fazer snapshot de PDs/volumes EBS do servidor de API periodicamente |
| 304 | + - Mitiga: Armazenamento de apoio do servidor de API perdido |
| 305 | + - Mitiga: Alguns casos de erro do operador |
| 306 | + - Mitiga: Alguns casos de falha de software do Kubernetes |
| 307 | + |
| 308 | +- Ação: usar replication controller e services na frente dos pods |
| 309 | + - Mitiga: Desligamento de nó |
| 310 | + - Mitiga: Falha de software do Kubelet |
| 311 | + |
| 312 | +- Ação: aplicações (contêineres) projetadas para tolerar reinicializações inesperadas |
| 313 | + - Mitiga: Desligamento de nó |
| 314 | + - Mitiga: Falha de software do Kubelet |
| 315 | + |
| 316 | + |
| 317 | +## {{% heading "whatsnext" %}} |
| 318 | + |
| 319 | +* Aprenda sobre as métricas disponíveis no |
| 320 | + [Pipeline de Métricas de Recursos](/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/) |
| 321 | +* Descubra ferramentas adicionais para |
| 322 | + [monitoramento de uso de recursos](/docs/tasks/debug/debug-cluster/resource-usage-monitoring/) |
| 323 | +* Use o Node Problem Detector para |
| 324 | + [monitorar a integridade do nó](/docs/tasks/debug/debug-cluster/monitor-node-health/) |
| 325 | +* Use `kubectl debug node` para [depurar nós do Kubernetes](/docs/tasks/debug/debug-cluster/kubectl-node-debug) |
| 326 | +* Use `crictl` para [depurar nós do Kubernetes](/docs/tasks/debug/debug-cluster/crictl/) |
| 327 | +* Obtenha mais informações sobre [auditoria do Kubernetes](/docs/tasks/debug/debug-cluster/audit/) |
| 328 | +* Use `telepresence` para [desenvolver e depurar serviços localmente](/docs/tasks/debug/debug-cluster/local-debugging/) |
0 commit comments