Docker & Kubernetes

O que Todo Dev Deve Saber sobre kubectl em Profundidade: Comandos, Contexts e Kubeconfig

16 min de leitura

O que Todo Dev Deve Saber sobre kubectl em Profundidade: Comandos, Contexts e Kubeconfig

Introdução: O que é kubectl e Por Que Importa O kubectl é a ferramenta de linha de comando oficial do Kubernetes, responsável por toda interação com clusters. Ele funciona como um cliente HTTP que se comunica com a API do Kubernetes, traduzindo seus comandos em requisições REST. Diferentemente de outras ferramentas, kubectl não armazena estado — cada comando é uma operação isolada contra o cluster, o que o torna previsível e auditável. Dominar kubectl é essencial porque ele é a porta de entrada para qualquer operação em Kubernetes. Seja deployando aplicações, escalando recursos ou debugando problemas, você usará kubectl. Neste artigo, vamos além dos comandos básicos e entraremos na profundidade: entenderemos como o kubectl se conecta a clusters diferentes através de contexts, como gerenciar múltiplas configurações com kubeconfig, e dominar os comandos que realmente importam no dia a dia. Kubeconfig: Arquitetura e Gerenciamento de Credenciais Estrutura e Localização O kubeconfig é um arquivo YAML que contém toda a informação necessária

<h2>Introdução: O que é kubectl e Por Que Importa</h2>

<p>O kubectl é a ferramenta de linha de comando oficial do Kubernetes, responsável por toda interação com clusters. Ele funciona como um cliente HTTP que se comunica com a API do Kubernetes, traduzindo seus comandos em requisições REST. Diferentemente de outras ferramentas, kubectl não armazena estado — cada comando é uma operação isolada contra o cluster, o que o torna previsível e auditável.</p>

<p>Dominar kubectl é essencial porque ele é a porta de entrada para qualquer operação em Kubernetes. Seja deployando aplicações, escalando recursos ou debugando problemas, você usará kubectl. Neste artigo, vamos além dos comandos básicos e entraremos na profundidade: entenderemos como o kubectl se conecta a clusters diferentes através de contexts, como gerenciar múltiplas configurações com kubeconfig, e dominar os comandos que realmente importam no dia a dia.</p>

<h2>Kubeconfig: Arquitetura e Gerenciamento de Credenciais</h2>

<h3>Estrutura e Localização</h3>

<p>O kubeconfig é um arquivo YAML que contém toda a informação necessária para kubectl se conectar a um cluster Kubernetes. Por padrão, kubectl procura este arquivo em <code>~/.kube/config</code>. Este arquivo é dividido em três seções principais: clusters, users e contexts. Cada seção é independente, permitindo combinações flexíveis de credenciais com endpoints diferentes.</p>

<p>A estrutura básica de um kubeconfig é simples mas poderosa:</p>

<pre><code class="language-yaml">apiVersion: v1

kind: Config

clusters:

  • name: production

cluster:

server: https://api.prod.company.com:6443

certificate-authority-data: LS0tLS1CRUdJTi... # base64 encoded CA cert

  • name: staging

cluster:

server: https://api.staging.company.com:6443

certificate-authority: /path/to/ca.crt

users:

  • name: admin-prod

user:

client-certificate-data: LS0tLS1CRUdJTi... # base64 encoded client cert

client-key-data: LS0tLS1CRUdJTi... # base64 encoded client key

  • name: dev-staging

user:

token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

contexts:

  • name: prod

context:

cluster: production

user: admin-prod

namespace: default

  • name: staging

context:

cluster: staging

user: dev-staging

namespace: development

current-context: prod</code></pre>

<p>Quando você executa um comando kubectl, ele primeiro lê o kubeconfig, localiza o current-context, depois busca a combinação de cluster + user especificada naquele contexto. É por isso que você pode ter múltiplas configurações em um único arquivo sem conflitos.</p>

<h3>Gerenciando Múltiplos Kubeconfigs</h3>

<p>Na prática, você frequentemente trabalha com múltiplos arquivos kubeconfig — um para cada cliente, ambiente ou projeto. Em vez de mesclar manualmente todos em um arquivo, você pode usar a variável de ambiente <code>KUBECONFIG</code> para carregar múltiplos arquivos simultaneamente:</p>

<pre><code class="language-bash">export KUBECONFIG=~/.kube/config:~/.kube/prod-cluster:~/.kube/staging-cluster

kubectl config view</code></pre>

<p>O comando <code>kubectl config view</code> consolida todos os arquivos carregados. Observe que kubectl usa <code>:</code> no Linux/Mac e <code>;</code> no Windows para separar caminhos. Quando múltiplos arquivos definem o mesmo contexto, o primeiro na lista vence.</p>

<p>Para adicionar um novo cluster ao seu kubeconfig de forma segura:</p>

<pre><code class="language-bash">kubectl config set-cluster new-cluster \

--server=https://new-api.company.com:6443 \

--certificate-authority=/path/to/ca.crt \

--kubeconfig=~/.kube/config

kubectl config set-credentials new-user \

--client-certificate=/path/to/client.crt \

--client-key=/path/to/client.key \

--kubeconfig=~/.kube/config

kubectl config set-context new-context \

--cluster=new-cluster \

--user=new-user \

--namespace=production \

--kubeconfig=~/.kube/config</code></pre>

<p>Isso é mais seguro que editar o YAML manualmente, pois kubectl valida a sintaxe e a estrutura. Após isso, você pode visualizar sua nova configuração com <code>kubectl config view --context=new-context</code>.</p>

<h2>Contexts: Navegação Entre Clusters e Namespaces</h2>

<h3>Entendendo Contexts na Prática</h3>

<p>Um context é uma tupla (cluster, user, namespace). É o mecanismo que kubectl usa para determinar &quot;para onde vou agora e com que credenciais?&quot;. Você pode ter 10 clusters diferentes, mas trabalhar com apenas um de cada vez trocando de contexto. Isso é muito mais seguro que alternar arquivos kubeconfig inteiros.</p>

<p>Listar todos os contextos disponíveis é uma operação frequente:</p>

<pre><code class="language-bash">kubectl config get-contexts</code></pre>

<p>Saída esperada:</p>

<pre><code>CURRENT NAME CLUSTER AUTHINFO NAMESPACE

  • prod-us-east prod-us-east admin@prod default

prod-eu-west prod-eu-west admin@prod default

staging staging-cluster dev@staging development

local-minikube minikube minikube default</code></pre>

<p>O asterisco (*) indica o contexto ativo. Para trocar para outro:</p>

<pre><code class="language-bash">kubectl config use-context staging</code></pre>

<p>Agora qualquer comando kubectl será executado contra o cluster staging, com as credenciais dev@staging, no namespace development. Essa simplicidade é crucial em ambientes com múltiplos clusters.</p>

<h3>Editando e Renomeando Contexts</h3>

<p>Às vezes você precisa corrigir um contexto ou renomeá-lo. Para renomear:</p>

<pre><code class="language-bash">kubectl config rename-context old-context-name new-context-name</code></pre>

<p>Para alterar o namespace padrão de um contexto sem perder outras configurações:</p>

<pre><code class="language-bash">kubectl config set-context prod-us-east --namespace=kube-system</code></pre>

<p>Se você precisar de um novo contexto idêntico a um existente, mas com namespace diferente (cenário comum quando você trabalha com múltiplos namespaces em paralelo):</p>

<pre><code class="language-bash">kubectl config set-context staging-admin \

--cluster=staging-cluster \

--user=dev@staging \

--namespace=admin</code></pre>

<p>Agora você tem dois contextos: <code>staging</code> (namespace development) e <code>staging-admin</code> (namespace admin), ambos apontando para o mesmo cluster com o mesmo usuário. Essa flexibilidade é essencial para fluxos de trabalho complexos.</p>

<h2>Comandos kubectl em Profundidade</h2>

<h3>Padrões de Consulta e Seleção</h3>

<p>Além dos comandos básicos <code>get</code> e <code>describe</code>, kubectl oferece recursos poderosos de seleção e formatação. O padrão <code>-l</code> permite selecionar recursos por labels:</p>

<pre><code class="language-bash"># Listar todos os pods com label app=nginx

kubectl get pods -l app=nginx

Listar services que NÃO possuem um label específico

kubectl get svc -l &#039;!managed-by&#039;

Combinações complexas

kubectl get pods -l &#039;tier=frontend,app!=web-old&#039;</code></pre>

<p>Labels são metadados estruturados que você adiciona aos recursos. Ao invés de usar grep em saídas de texto, use labels para filtrar — é mais confiável e mais rápido.</p>

<p>A formatação de saída é igualmente importante. O padrão <code>-o json</code> ou <code>-o yaml</code> permite que você processe saídas com ferramentas como <code>jq</code>:</p>

<pre><code class="language-bash"># Obter o IP de todos os pods em um namespace

kubectl get pods -o jsonpath=&#039;{.items[*].status.podIP}&#039;

Listar nome e namespace de todos os recursos

kubectl get all -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace

Formatação mais legível para humans

kubectl get nodes -o wide</code></pre>

<p>O <code>jsonpath</code> é poderoso mas verboso. Para debugging rápido, use <code>wide</code>; para automação ou processamento, use <code>json</code> + <code>jq</code>. Exemplo prático:</p>

<pre><code class="language-bash"># Encontrar pods que estão em estado &quot;Pending&quot;

kubectl get pods -o json | jq &#039;.items[] | select(.status.phase==&quot;Pending&quot;) | .metadata.name&#039;</code></pre>

<h3>Exec, Logs e Port-Forward</h3>

<p>Três comandos são fundamentais para debugging em produção: <code>exec</code>, <code>logs</code> e <code>port-forward</code>. Cada um resolve um problema específico.</p>

<p><code>exec</code> permite você executar comandos dentro de um container rodando:</p>

<pre><code class="language-bash"># Abrir shell interativo em um pod

kubectl exec -it deployment/nginx -- /bin/bash

Rodar comando único e retornar

kubectl exec pod/my-app-xyz -- ps aux

Entrar em um container específico se o pod tem múltiplos

kubectl exec -it pod/multi-container -c container-name -- bash</code></pre>

<p><code>logs</code> recupera saída do processo principal do container. Por padrão mostra logs do último container que falhou:</p>

<pre><code class="language-bash"># Últimas 100 linhas de logs

kubectl logs pod/my-app --tail=100

Seguir logs em tempo real (como tail -f)

kubectl logs -f deployment/nginx --all-containers=true

Logs de pods anteriores que foram reiniciados

kubectl logs pod/my-app --previous

Logs com timestamps

kubectl logs deployment/api --timestamps=true</code></pre>

<p><code>port-forward</code> cria um túnel local para um serviço rodando no cluster, útil para acessar interfaces web ou bancos de dados:</p>

<pre><code class="language-bash"># Acessar aplicação que escuta na porta 8080 do cluster localmente na 3000

kubectl port-forward service/webapp 3000:8080

Para um pod específico

kubectl port-forward pod/postgres-0 5432:5432

Em background

kubectl port-forward svc/redis 6379:6379 &amp;</code></pre>

<h3>Aplicando e Gerenciando Recursos</h3>

<p><code>apply</code> é o comando mais usado para criar ou atualizar recursos a partir de arquivos YAML:</p>

<pre><code class="language-bash"># Aplicar um arquivo

kubectl apply -f deployment.yaml

Aplicar diretório inteiro

kubectl apply -f ./manifests/

Aplicar a partir de stdin

cat my-config.yaml | kubectl apply -f -

Dry-run para ver o que seria aplicado sem fazer

kubectl apply -f deployment.yaml --dry-run=client -o yaml

Server-side dry-run (valida contra estado real do cluster)

kubectl apply -f deployment.yaml --dry-run=server</code></pre>

<p>Ao contrário de <code>create</code>, <code>apply</code> é idempotente — executar múltiplas vezes produz o mesmo resultado. Isso torna seguro executar em pipelines CI/CD. O <code>--dry-run=server</code> é especialmente útil: ele valida seu YAML contra as regras do servidor sem realmente aplicar, evitando surpresas.</p>

<p>Para atualizar um recurso sem recriar:</p>

<pre><code class="language-bash"># Editar interativamente (abre seu editor padrão)

kubectl edit deployment nginx

Patchear um campo específico

kubectl patch deployment nginx -p &#039;{&quot;spec&quot;:{&quot;replicas&quot;:5}}&#039;

Alternar imagem de um deployment

kubectl set image deployment/nginx nginx=nginx:1.21 --record</code></pre>

<p>O <code>--record</code> adiciona uma anotação de histórico, útil para entender quem fez o quê e quando. Você pode visualizar com:</p>

<pre><code class="language-bash">kubectl rollout history deployment/nginx</code></pre>

<h3>Deleção de Recursos</h3>

<p>Deletar é tão importante quanto criar. Entender as nuances evita desastres:</p>

<pre><code class="language-bash"># Deletar um recurso

kubectl delete pod my-pod

Deletar múltiplos recursos

kubectl delete pods pod1 pod2 pod3

Deletar por label

kubectl delete pods -l app=old-version

Deletar tudo em um namespace (cuidado!)

kubectl delete all --all -n production

Deletar com atraso de graça (graceful shutdown)

kubectl delete pod my-pod --grace-period=30

Deletar imediatamente sem graça (force)

kubectl delete pod my-pod --force --grace-period=0</code></pre>

<p>O <code>--grace-period</code> permite que a aplicação se prepare para desligar. Padrão é 30 segundos. Use <code>--force</code> apenas quando estritamente necessário — não dá à aplicação chance de limpar recursos.</p>

<h2>Debugging e Monitoramento com kubectl</h2>

<h3>Investigando Estado do Cluster</h3>

<p>Quando algo quebra, você precisa entender o estado atual. <code>describe</code> é seu melhor amigo:</p>

<pre><code class="language-bash"># Descrição detalhada de um pod

kubectl describe pod my-app-xyz

Eventos recentes que afetaram o pod

kubectl get events --sort-by=&#039;.lastTimestamp&#039; -n production

Status dos nós

kubectl describe node node-01

Verificar se há problemas de recursos

kubectl top nodes

kubectl top pods --all-namespaces</code></pre>

<p><code>describe</code> mostra metadados, status atual, eventos e condições — é a visão 360 graus. <code>events</code> mostra o histórico de mudanças. Juntos, permitem diagnoscar 90% dos problemas.</p>

<p>Para problemas de rede ou DNS:</p>

<pre><code class="language-bash"># Testar DNS dentro do cluster

kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup my-service

Verificar conectividade para um serviço

kubectl run -it --rm nettest --image=nicolaka/netcat --restart=Never -- -zv service.namespace 80

Acessar logs de inicialização (muito útil para CrashLoopBackOff)

kubectl logs pod/my-app --previous --all-containers=true</code></pre>

<p>Esses comandos executam ferramentas de rede dentro de um pod no cluster, permitindo testar conectividade do mesmo &quot;lugar&quot; que sua aplicação.</p>

<h3>Monitoramento e Métricas</h3>

<p>Kubernetes coleta métricas de CPU e memória nativamente (Metrics Server). Você pode consultar sem ferramentas adicionais:</p>

<pre><code class="language-bash"># CPU e memória atual de todos os nós

kubectl top nodes

CPU e memória de pods em um namespace

kubectl top pods -n production

Pod que mais consome recursos

kubectl top pods --all-namespaces | sort -k3 -rn | head -10</code></pre>

<p>Para análise mais profunda, use <code>get</code> com campos customizados:</p>

<pre><code class="language-bash"># Ver requisições e limites de CPU/memória

kubectl get pods -o custom-columns=\

NAME:.metadata.name,\

CPU_REQ:.spec.containers[0].resources.requests.cpu,\

CPU_LIM:.spec.containers[0].resources.limits.cpu,\

MEM_REQ:.spec.containers[0].resources.requests.memory,\

MEM_LIM:.spec.containers[0].resources.limits.memory

Ver imagens rodando em todos os nós

kubectl get pods --all-namespaces \

-o custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[0].image</code></pre>

<p>Entender requisições vs limites é crítico: requisições são o que kubectl usa para scheduling; limites são o máximo que o container pode usar antes de ser morto. Mismatch nestes valores causa problemas de performance ou OOMKill inesperado.</p>

<h2>Conclusão</h2>

<p>Dominar kubectl significa três coisas concretas. Primeiro, entender profundamente como kubeconfig e contexts funcionam — isso elimina confusão sobre &quot;qual cluster estou usando?&quot; e permite trabalhar com múltiplos clusters sem medo. Segundo, conhecer os comandos core além do básico: <code>patch</code>, <code>exec</code>, <code>logs</code>, <code>port-forward</code> e as nuances de <code>apply</code> vs <code>create</code> — esses são seus ferramentas do dia a dia. Terceiro, saber debugar eficientemente com <code>describe</code>, <code>events</code> e <code>top</code> — quando algo quebra, você resolve em minutos, não horas.</p>

<p>A chave é prática. Configure múltiplos contexts hoje mesmo, teste <code>exec</code> e <code>logs</code> em um ambiente seguro, e estude os eventos quando deployments falharem. kubectl é uma ferramenta com grande profundidade — cada comando tem flags e comportamentos que você descobrirá ao usá-lo. Comece pelos comandos aqui apresentados, consulte <code>kubectl --help</code> frequentemente, e você rapidamente se tornará proficiente.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://kubernetes.io/docs/reference/kubectl/" target="_blank" rel="noopener noreferrer">Documentação Oficial do kubectl - Kubernetes</a></li>

<li><a href="https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/" target="_blank" rel="noopener noreferrer">Kubeconfig File Documentation - Kubernetes</a></li>

<li><a href="https://kubernetes.io/docs/reference/kubectl/cheatsheet/" target="_blank" rel="noopener noreferrer">kubectl Cheat Sheet - Kubernetes</a></li>

<li><a href="https://kubernetes.io/docs/reference/jsonpath/" target="_blank" rel="noopener noreferrer">JSONPath Support in Kubernetes - Kubernetes</a></li>

<li><a href="https://www.manning.com/books/kubernetes-in-action-second-edition" target="_blank" rel="noopener noreferrer">Kubernetes in Action - Marko Lukša (Livro - Segunda Edição)</a></li>

</ul>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em Docker & Kubernetes

Como Usar Helm Fundamentos: Charts, Values, Templates e Releases em Produção
Como Usar Helm Fundamentos: Charts, Values, Templates e Releases em Produção

Helm Fundamentos: Charts, Values, Templates e Releases Helm é o gerenciador d...

Guia Completo de Probes em Kubernetes: Liveness, Readiness e Startup na Prática
Guia Completo de Probes em Kubernetes: Liveness, Readiness e Startup na Prática

Introdução aos Probes no Kubernetes Quando você deploya uma aplicação no Kube...

Boas Práticas de Flux CD: GitOps Alternativo com Kustomize e Helm Controller para Times Ágeis
Boas Práticas de Flux CD: GitOps Alternativo com Kustomize e Helm Controller para Times Ágeis

O que é Flux CD e por que GitOps? Flux CD é um operador Kubernetes que implem...