Inspecione recursos do Kubernetes com kubectl

KubernetesBeginner
Pratique Agora

Introdução

Em Kubernetes para iniciantes, você usou kubectl get, describe e rótulos para verificar se uma aplicação estava funcionando. Clusters reais contêm muitos objetos, portanto a próxima habilidade é fazer perguntas mais específicas e extrair apenas as evidências necessárias.

Neste laboratório, você implantará uma pequena carga de trabalho de uma loja virtual e a inspecionará de vários ângulos: namespace, rótulos, campos estruturados, propriedade do controlador e eventos. Ao final, você terá um comando compacto que relaciona um Deployment aos Pods que ele gerencia.

Não é necessário memorizar todos os formatos de saída. Em vez disso, pratique transformar uma pergunta em uma consulta específica: “Quais objetos existem?”, “Quais Pods correspondem a este Service?”, “Quem é o proprietário deste Pod?” ou “O que aconteceu mais recentemente?”. Cada etapa adiciona uma ferramenta a esse fluxo de inspeção.

Crie um espaço de trabalho dedicado

Nesta etapa, você criará um namespace e implantará nele os recursos preparados. Um namespace restringe o escopo das consultas posteriores e evita confundir objetos com nomes semelhantes.

Acesse o diretório de trabalho do laboratório e inspecione o contexto atual antes de alterar o estado do cluster. cd altera o diretório de trabalho do shell, portanto nomes de arquivos relativos posteriores, como storefront.yaml, apontarão para o espaço de trabalho preparado.

cd /home/labex/project/resource-inspection
kubectl config current-context

A saída deve ser labex-v135. Crie o namespace e aplique o manifesto preparado com vários documentos:

kubectl create namespace practice-observe
kubectl apply -f storefront.yaml
kubectl rollout status deployment/storefront -n practice-observe --timeout=60s

As linhas finais devem ser semelhantes às seguintes. Enquanto os dois Pods são iniciados, podem aparecer mensagens intermediárias do processo de implantação:

namespace/practice-observe created
deployment.apps/storefront created
service/storefront created
deployment "storefront" successfully rolled out

-n practice-observe restringe o comando a esse namespace. O comando de rollout aguarda até que as duas réplicas do Deployment estejam disponíveis, em vez de depender de uma espera arbitrária.

Você usará -n practice-observe repetidamente. Caso contrário, os comandos do Kubernetes usarão o namespace configurado no contexto atual — normalmente default — e um objeto saudável poderá parecer “ausente” simplesmente porque a consulta foi feita no escopo errado.

Descubra os recursos e seus escopos

Nesta etapa, você usará a descoberta da API antes de consultar objetos. kubectl api-resources lista os nomes de recursos que o servidor de API atual conhece, juntamente com os nomes abreviados e a indicação de que cada recurso pertence ou não a um namespace. O pipe para head limita a listagem inicial aos dez primeiros itens, evitando inundar o terminal.

kubectl api-resources | head
kubectl api-resources --namespaced=true | grep -E 'pods|deployments|services'

O pipe encaminha a lista de recursos para grep. -E habilita a alternância com |, permitindo que um único comando corresponda a vários nomes de recursos. Observe que Pods, Deployments e Services pertencem a namespaces.

Liste os objetos da aplicação usando os nomes completos e repita a consulta com os nomes abreviados comuns:

kubectl get pods,deployments,services -n practice-observe
kubectl get po,deploy,svc -n practice-observe

Os dois comandos consultam os mesmos recursos da API. Os nomes abreviados economizam digitação, mas os nomes completos são mais claros em scripts e na documentação.

Procure um Deployment, dois Pods gerados e um Service. A lista de recursos separada por vírgulas é apenas uma conveniência de consulta; esses objetos continuam tendo funções e esquemas de API diferentes.

Os prefixos dos tipos facilitam a interpretação da saída combinada. Sufixos gerados, endereços e idades variarão:

NAME                              READY   STATUS    RESTARTS   AGE
pod/storefront-...                1/1     Running   0          ...
pod/storefront-...                1/1     Running   0          ...

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/storefront   2/2     2            2           ...

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/storefront   ClusterIP   ...          <none>        80/TCP    ...

Filtre usando rótulos e seletores

Nesta etapa, você usará rótulos como metadados pesquisáveis. --show-labels exibe todos os rótulos, enquanto -l seleciona apenas os objetos cujos rótulos correspondem a uma expressão.

kubectl get pods -n practice-observe --show-labels
kubectl get pods -n practice-observe -l app=storefront
kubectl get pods -n practice-observe -l 'app=storefront,tier=web'

Uma vírgula entre requisitos do seletor representa uma condição lógica E. Portanto, a última consulta retorna os Pods que possuem ambos os rótulos.

Compare o seletor do Service com os rótulos dos Pods selecionados:

kubectl get service storefront -n practice-observe -o jsonpath='Service selector: {.spec.selector.app}{"\n"}'
kubectl get pods -n practice-observe -l app=storefront -o custom-columns='NAME:.metadata.name,TIER:.metadata.labels.tier,IP:.status.podIP,READY:.status.containerStatuses[0].ready'
kubectl get endpointslices -n practice-observe -l kubernetes.io/service-name=storefront

JSONPath extrai um campo do Service. -o custom-columns produz uma tabela compacta a partir de vários campos dos Pods. Isso é mais confiável do que procurar visualmente em um documento YAML extenso.

O comando final solicita os EndpointSlices cujo rótulo gerenciado automaticamente kubernetes.io/service-name pertence a storefront. Um EndpointSlice registra os endpoints de rede selecionados para um Service. Uma coluna ENDPOINTS não vazia confirma que os rótulos correspondentes produziram backends acessíveis pela rede.

O seletor do Service deve exibir storefront, e as duas linhas da tabela de Pods devem conter tier=web. Esse rótulo app correspondente é a ligação: um Service descobre Pods por meio de rótulos, não por meio da propriedade do Deployment.

Service selector: storefront
NAME             TIER   IP          READY
storefront-...   web    10.244...   true
storefront-...   web    10.244...   true

NAME             ADDRESSTYPE   PORTS   ENDPOINTS                  AGE
storefront-...   IPv4          80      10.244...,10.244...          ...

Rastreie a propriedade entre controladores

Nesta etapa, você acompanhará a cadeia de propriedade do Kubernetes do Deployment ao ReplicaSet e aos Pods. Os controladores adicionam ownerReferences para que o Kubernetes saiba qual objeto de nível superior gerencia cada objeto dependente.

kubectl get replicasets -n practice-observe -l app=storefront
kubectl get replicasets -n practice-observe -l app=storefront -o custom-columns='REPLICASET:.metadata.name,OWNER_KIND:.metadata.ownerReferences[0].kind,OWNER_NAME:.metadata.ownerReferences[0].name'
kubectl get pods -n practice-observe -l app=storefront -o custom-columns='POD:.metadata.name,OWNER_KIND:.metadata.ownerReferences[0].kind,OWNER_NAME:.metadata.ownerReferences[0].name'

O proprietário do ReplicaSet deve ser o Deployment storefront. O proprietário de cada Pod é o ReplicaSet gerado, e não o Deployment diretamente:

Deployment/storefront -> ReplicaSet/storefront-... -> Pod/storefront-...

Use kubectl describe quando precisar consultar essa relação juntamente com as condições e os eventos recentes:

kubectl describe deployment storefront -n practice-observe

Não leia a saída de describe do início ao fim todas as vezes. Para esta pergunta, concentre-se em Selector, nas contagens de réplicas, nas condições e nos eventos. O melhor comando de inspeção é aquele que responde à pergunta atual com o mínimo de ruído.

Leia os eventos como uma linha do tempo

Nesta etapa, você inspecionará os eventos como evidências ordenadas no tempo. Os eventos descrevem ações de agendamento, imagens, contêineres e controladores, mas são diagnósticos temporários, não registros permanentes de auditoria.

kubectl get events -n practice-observe --sort-by=.metadata.creationTimestamp

--sort-by ordena os objetos usando um caminho de campo. Restrinja a linha do tempo primeiro ao Deployment e depois a um Pod selecionado:

kubectl events -n practice-observe --for deployment/storefront
POD_NAME=$(kubectl get pods -n practice-observe -l app=storefront -o jsonpath='{.items[0].metadata.name}')
echo "$POD_NAME"
kubectl events -n practice-observe --for "pod/${POD_NAME}"

$(...) é uma substituição de comando: o shell executa o comando interno e armazena sua saída em POD_NAME. Agora você tem um caminho de inspeção repetível: restringir o namespace, selecionar por rótulos, extrair campos, acompanhar os proprietários e finalizar com a linha do tempo de eventos relevante.

Os nomes dos Pods gerados pelos controladores mudam quando eles são substituídos. Por isso, selecionar o nome atual por rótulo é mais seguro do que copiar um valor antigo. Esse padrão reaparecerá ao longo dos laboratórios de solução de problemas.

O ciclo de vida bem-sucedido normalmente inclui Scheduled, Pulled, Created e Started. Um cluster local iniciado recentemente também pode manter um aviso anterior, como FailedCreatePodSandBox, enquanto o Calico fica pronto. Não conclua que a aplicação continua com problemas apenas por causa de um aviso antigo: compare o carimbo de data e hora dele com os eventos normais posteriores e confirme o estado atual de READY do Pod. Os carimbos de data e hora e os nomes gerados dos Pods são omitidos intencionalmente, pois mudam a cada execução.

Resumo

Você inspecionou uma aplicação Kubernetes sem examinar objetos não relacionados. Combinou namespaces, rótulos, JSONPath, colunas personalizadas, referências de propriedade e eventos para passar de um inventário amplo a evidências operacionais precisas. No próximo laboratório, esse fluxo de inspeção será aplicado a Pods e contêineres com falhas.