Kubernetes para Entrevistas: Guia Completo de Pods, Services e Deployments

Domine os conceitos essenciais de Kubernetes para entrevistas de emprego. Aprenda sobre Pods, Services, Deployments e HPA com exemplos de código YAML.

Kubernetes Pods Services e Deployments

Entrevistas para posições de DevOps e engenharia de plataforma frequentemente abordam Kubernetes de maneira aprofundada. Recrutadores esperam que candidatos compreendam não apenas os comandos básicos do kubectl, mas também a arquitetura interna do orquestrador e como os recursos se relacionam entre si. Pods, Services e Deployments representam a tríade fundamental que sustenta praticamente todas as aplicações em produção no Kubernetes. Dominar esses conceitos abre portas para discussões mais avançadas sobre escalabilidade, resiliência e padrões de deployment.

Referência Rápida para a Entrevista

O Kubernetes organiza containers em Pods (unidade mínima de deployment), gerencia réplicas através de Deployments e expõe aplicações via Services. Essa hierarquia aparece em praticamente todas as perguntas técnicas sobre K8s.

Entendendo Pods: A Unidade Atômica do Kubernetes

O Pod constitui a menor unidade deployável no Kubernetes. Diferente de containers isolados, um Pod pode encapsular um ou mais containers que compartilham o mesmo namespace de rede e volumes de armazenamento. Essa característica permite que containers dentro do mesmo Pod se comuniquem via localhost, simplificando arquiteturas de sidecar e init containers.

Entrevistadores costumam perguntar por que o Kubernetes não gerencia containers diretamente. A resposta reside no modelo de coesão: containers em um Pod representam processos que devem ser escalados e deployados juntos. Um exemplo clássico envolve uma aplicação principal acompanhada de um container de logging ou proxy.

A especificação de um Pod inclui elementos críticos que aparecem frequentemente em entrevistas:

yaml
# api-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: api-server
  labels:
    app: api
    version: v2
spec:
  containers:
    - name: api
      image: registry.example.com/api:3.1.0
      ports:
        - containerPort: 8080
      resources:
        requests:
          cpu: "250m"        # 0.25 CPU core reserved
          memory: "256Mi"    # 256 MB reserved
        limits:
          cpu: "500m"        # hard cap at 0.5 core
          memory: "512Mi"    # OOMKilled beyond this
      readinessProbe:
        httpGet:
          path: /healthz
          port: 8080
        initialDelaySeconds: 5
        periodSeconds: 10
      livenessProbe:
        httpGet:
          path: /healthz
          port: 8080
        initialDelaySeconds: 15
        periodSeconds: 20

Observe os campos resources, readinessProbe e livenessProbe. Requests garantem recursos mínimos reservados pelo scheduler, enquanto limits estabelecem o teto máximo de consumo. Quando um container ultrapassa o limite de memória, o kubelet o encerra com status OOMKilled. Probes de readiness determinam quando o Pod pode receber tráfego, enquanto probes de liveness indicam se o container deve ser reiniciado.

Armadilha Comum em Entrevistas

Confundir readinessProbe com livenessProbe pode custar pontos valiosos. A readiness afeta apenas o roteamento de tráfego (Service endpoints), enquanto a liveness controla restarts do container. Aplicar incorretamente pode causar restarts desnecessários ou roteamento para Pods não prontos.

Ciclo de Vida do Pod e Políticas de Restart

Pods atravessam fases bem definidas durante sua existência. Entender esse ciclo ajuda a diagnosticar problemas e responder perguntas sobre comportamento em cenários de falha.

| Fase | Descrição | |------|----------| | Pending | Pod aceito pelo cluster, aguardando scheduling ou download de imagem | | Running | Pod vinculado a um node, pelo menos um container em execução | | Succeeded | Todos os containers terminaram com sucesso (exit code 0) | | Failed | Pelo menos um container terminou com falha | | Unknown | Estado do Pod não pode ser obtido (geralmente falha de comunicação com o node) |

A política de restart determina o comportamento após o término de containers:

  • Always (padrão): Reinicia containers independentemente do exit code. Ideal para serviços de longa duração.
  • OnFailure: Reinicia apenas quando o container falha (exit code diferente de zero). Apropriado para jobs que devem ser retentados em caso de erro.
  • Never: Nunca reinicia containers. Utilizado para tarefas pontuais onde falhas devem ser tratadas externamente.
yaml
# batch-job-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: data-migration
spec:
  restartPolicy: OnFailure   # restart only on crash
  containers:
    - name: migrate
      image: registry.example.com/migrate:1.0.0
      command: ["python", "migrate.py"]
      env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: connection-string

Note que o Pod de migração utiliza OnFailure para retentar em caso de erro de conexão com o banco de dados, mas não reiniciar se a migração completar com sucesso.

Deployments: Gerenciando Estado Desejado

Enquanto Pods representam instâncias individuais, Deployments gerenciam o ciclo de vida de múltiplas réplicas. O Deployment abstrai a complexidade de manter o número desejado de Pods em execução, realizar atualizações graduais e permitir rollbacks.

O controller do Deployment cria e gerencia ReplicaSets, que por sua vez garantem que o número especificado de Pods esteja sempre disponível. Essa cadeia de responsabilidades aparece frequentemente em perguntas sobre a arquitetura do Kubernetes:

Deployment -> ReplicaSet -> Pods

yaml
# api-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
  labels:
    app: api
spec:
  replicas: 3                    # run 3 identical Pods
  revisionHistoryLimit: 5        # keep 5 old ReplicaSets for rollback
  selector:
    matchLabels:
      app: api                   # must match Pod template labels
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1          # at most 1 Pod down during update
      maxSurge: 1                # at most 1 extra Pod during update
  template:
    metadata:
      labels:
        app: api
        version: v2
    spec:
      containers:
        - name: api
          image: registry.example.com/api:3.1.0
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          readinessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10

O campo strategy define como atualizações ocorrem. RollingUpdate substitui Pods gradualmente, garantindo disponibilidade durante o processo. Os parâmetros maxUnavailable e maxSurge controlam a velocidade versus a capacidade extra durante a transição.

Executando Rollbacks

Rollbacks permitem reverter para versões anteriores quando problemas são detectados em produção. O Kubernetes mantém histórico de revisões baseado no valor de revisionHistoryLimit:

bash
# Check rollout status
kubectl rollout status deployment/api-server

# View revision history
kubectl rollout history deployment/api-server

# Roll back to previous version
kubectl rollout undo deployment/api-server

# Roll back to specific revision
kubectl rollout undo deployment/api-server --to-revision=3

Candidatos que demonstram conhecimento sobre rollbacks e histórico de revisões destacam-se em entrevistas, pois isso indica experiência com operações em produção.

Pronto para mandar bem nas entrevistas de DevOps?

Pratique com nossos simuladores interativos, flashcards e testes tecnicos.

Services: Expondo Aplicações de Forma Estável

Pods possuem endereços IP efêmeros que mudam a cada recriação. Services resolvem esse problema fornecendo um endpoint estável (ClusterIP ou DNS) que roteia tráfego para Pods saudáveis através de selectors baseados em labels.

O kube-proxy implementa o roteamento de Services em cada node, utilizando iptables ou IPVS dependendo da configuração do cluster. Entender essa mecânica ajuda a responder perguntas sobre latência e comportamento de rede.

yaml
# api-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: api-service
spec:
  type: ClusterIP               # internal-only by default
  selector:
    app: api                     # routes to Pods with this label
  ports:
    - name: http
      port: 80                   # Service port (what clients use)
      targetPort: 8080           # Pod port (where container listens)
      protocol: TCP

O Service acima expõe Pods com label app: api na porta 80 do cluster. Clientes internos acessam o serviço via api-service.namespace.svc.cluster.local ou simplesmente api-service dentro do mesmo namespace.

Tipos de Service e Casos de Uso

Kubernetes oferece diferentes tipos de Service para cenários específicos:

| Tipo | Descrição | Caso de Uso | |------|-----------|-------------| | ClusterIP | IP interno acessível apenas dentro do cluster | Comunicação entre microsserviços | | NodePort | Expõe o serviço em uma porta fixa em cada node (30000-32767) | Acesso externo simples, testes | | LoadBalancer | Provisiona load balancer externo via cloud provider | Produção com tráfego externo | | ExternalName | Mapeia serviço para um DNS externo | Integração com serviços fora do cluster |

Para expor aplicações em produção com tráfego externo, LoadBalancer representa a escolha mais comum:

yaml
# api-loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
  name: api-public
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"  # AWS NLB
spec:
  type: LoadBalancer
  selector:
    app: api
  ports:
    - name: https
      port: 443
      targetPort: 8080
      protocol: TCP

Anotações específicas do cloud provider permitem customizar o comportamento do load balancer, como escolher entre Application Load Balancer (ALB) ou Network Load Balancer (NLB) na AWS.

Gateway API: O Futuro do Ingress

A Gateway API representa a evolução do Ingress, oferecendo maior expressividade e separação de responsabilidades. Clusters modernos adotam progressivamente esse modelo, embora Ingress ainda predomine em ambientes existentes. Candidatos familiarizados com ambos demonstram conhecimento atualizado.

Conectando Deployments a Services

A conexão entre Deployments e Services ocorre exclusivamente através de labels. O selector do Service deve corresponder aos labels definidos no template do Pod dentro do Deployment.

Essa arquitetura desacoplada permite padrões avançados como canary deployments, onde uma versão experimental recebe uma fração do tráfego:

yaml
# canary-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server-canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api                   # same label as main Deployment
  template:
    metadata:
      labels:
        app: api                 # Service picks this up automatically
        version: v3-canary
    spec:
      containers:
        - name: api
          image: registry.example.com/api:3.2.0-rc1
          ports:
            - containerPort: 8080

Com 3 réplicas do Deployment principal e 1 réplica canary, o Service distribui aproximadamente 25% do tráfego para a nova versão. Esse padrão permite validar mudanças em produção com impacto limitado.

Horizontal Pod Autoscaler: Escalabilidade Automática

O HPA ajusta automaticamente o número de réplicas com base em métricas como CPU e memória. Essa capacidade aparece frequentemente em perguntas sobre arquitetura de sistemas resilientes e custos de infraestrutura.

yaml
# api-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: api-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-server
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70   # scale up above 70% CPU
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300  # wait 5 min before scaling down

O campo behavior controla a velocidade de scale down, evitando oscilações rápidas em cargas variáveis. O stabilizationWindowSeconds garante que o sistema aguarde um período antes de reduzir réplicas, prevenindo thrashing.

Para que o HPA funcione corretamente, o Metrics Server deve estar instalado no cluster. Candidatos que mencionam essa dependência demonstram experiência prática com autoscaling.

Perguntas Frequentes em Entrevistas

Qual a diferença entre Deployment e StatefulSet? Deployments gerenciam aplicações stateless onde Pods são intercambiáveis. StatefulSets garantem identidades estáveis (nomes e volumes persistentes) para aplicações stateful como bancos de dados.

Como o Kubernetes descobre quais Pods pertencem a um Service? O controller de endpoints monitora Pods que correspondem ao selector do Service e atualiza a lista de endpoints automaticamente. Apenas Pods com readinessProbe bem-sucedida recebem tráfego.

O que acontece se um Pod exceder seus limites de recursos? Exceder o limite de CPU resulta em throttling (redução de ciclos de CPU). Exceder o limite de memória causa OOMKilled, e o container é reiniciado conforme a política de restart.

Como realizar zero-downtime deployments? Configurar readinessProbe adequadamente, utilizar RollingUpdate strategy com maxUnavailable e maxSurge apropriados, e garantir que a aplicação trate graceful shutdown via SIGTERM.

Qual a função do selector em um Deployment? O selector identifica quais Pods o Deployment gerencia. Labels no selector devem corresponder exatamente aos labels no template do Pod, caso contrário o Deployment falha na validação.

Como debugar um Pod que não inicia? Verificar eventos com kubectl describe pod, logs com kubectl logs, e status das probes. Problemas comuns incluem imagem não encontrada, recursos insuficientes no cluster, ou falha em probes de liveness.

Para mais perguntas de entrevista sobre Kubernetes e DevOps, acesse perguntas de entrevista DevOps.

Comece a praticar!

Teste seus conhecimentos com nossos simuladores de entrevista e testes tecnicos.

Conclusão

Dominar Pods, Services e Deployments fornece a base necessária para discutir tópicos avançados de Kubernetes em entrevistas. Recapitulando os pontos principais:

  • Pods encapsulam containers que compartilham rede e armazenamento, representando a unidade atômica de deployment
  • Probes de readiness e liveness controlam roteamento de tráfego e restarts, respectivamente
  • Deployments gerenciam ReplicaSets e habilitam rolling updates com possibilidade de rollback
  • Services fornecem endpoints estáveis para descoberta de serviços através de selectors baseados em labels
  • HPA automatiza escalabilidade horizontal baseada em métricas de recursos
  • Labels e selectors conectam todos os recursos, permitindo padrões como canary deployments

Preparar-se com exemplos práticos de YAML e entender o funcionamento interno de cada recurso diferencia candidatos em processos seletivos para posições de DevOps, SRE e engenharia de plataforma.

Tags

#kubernetes
#devops
#pods
#services
#deployments
#entrevista

Compartilhar