Centralize rotas HTTP com Ingress, entenda o registro automático no CoreDNS, provisione discos dinâmicos via CSI e StorageClass, separe código de dados com ConfigMaps/Secrets e domine StatefulSets.
Com StorageClass + volumeClaimTemplates, cada Pod de um StatefulSet mantém seu próprio volume persistente e identidade DNS fixa.
OFICINA 01 · CAPÍTULO 8
Ingress: Roteamento HTTP/HTTPS por Host e Path
Criar um Service LoadBalancer para cada microsserviço web sairia caro e desperdiçaria IPs públicos. O Ingress resolve isso expondo múltiplos Services internos através de um único Load Balancer na borda do cluster.
O modelo funciona em duas peças: um Ingress Controller (como o NGINX Ingress Controller instalado no cluster) e objetos Ingress (apiVersion: networking.k8s.io/v1) contendo as regras de roteamento por host e path.
Manifesto YAML · Exemplo de Ingress com roteamento por path
Lembrete de laboratório: como vimos no Capítulo 3, clusters locais em Docker Desktop não provisionam Load Balancers de nuvem nativamente; para testar Ingress com IP público real, o livro recomenda um cluster gerenciado como o Linode Kubernetes Engine (LKE).
OFICINA 02 · CAPÍTULO 10
Service Discovery & CoreDNS Interno
Para que o serviço checkout converse com o serviço pagamentos, ele não pode depender de IPs fixos. Todo cluster Kubernetes executa um serviço de DNS interno (kube-dns / CoreDNS no Namespace kube-system) que atua como registro central.
Registro automático: ao criar um Service, seu nome e ClusterIP são gravados no DNS do cluster automaticamente.
/etc/resolv.conf pré-configurado: todo contêiner nasce apontando para o IP do kube-dns com domínios de busca do próprio Namespace.
Mesmo Namespace vs. Cross-Namespace: dentro do mesmo Namespace, basta chamar pelo nome curto (ex.: pagamentos). Entre Namespaces diferentes, use o FQDN completo: <service>.<namespace>.svc.cluster.local (ex.: ent.prod.svc.cluster.local).
Terminal · Inspecionar o DNS interno do cluster
kubectl get svc kube-dns -n kube-system
kubectl get pods -n kube-system -l k8s-app=kube-dns
Contêineres são efêmeros: se reiniciam, arquivos gravados na camada local se perdem. O Kubernetes resolve a persistência por meio da CSI (Container Storage Interface) e de uma tríade de objetos:
Arquitetura de armazenamento persistente no Kubernetes
Objeto
Função
Detalhe de Operação
StorageClass (SC)
Define perfis de disco (ex.: SSD rápido, bloco padrão) e o provisionador CSI
Permite provisionamento dinâmico automático e define reclaimPolicy (Delete ou Retain).
PersistentVolume (PV)
Representa o volume real no provedor de storage
Tem ciclo de vida independente do Pod; sobrevive a reinicializações.
PersistentVolumeClaim (PVC)
O "ticket de pedido" de espaço e modo de acesso feito pelo app
O Pod monta o PVC, que é vinculado (Bound) a um PV compatível.
OFICINA 04 · CAPÍTULO 12
ConfigMaps: Desacoplando Código de Configuração
Empacotar configurações dentro da imagem Docker obriga você a reconstruir a imagem a cada troca de URL ou porta. Os ConfigMaps armazenam pares chave-valor não sensíveis fora do contêiner e podem ser injetados de três maneiras:
Variáveis de ambiente (env / envFrom): simples, porém o Pod não enxerga atualizações sem reiniciar.
Comandos de inicialização (args / command): injeta valores na linha de partida do contêiner.
Volumes montados (volumes + volumeMounts): monta chaves como arquivos (ex.: /etc/config/app.conf) e propaga atualizações em tempo real para contêineres em execução.
Terminal · Criar e inspecionar um ConfigMap
kubectl create configmap testmap1 --from-literal=env=prod --from-literal=port=8080
kubectl get cm testmap1 -o yaml
OFICINA 05 · CAPÍTULO 12
Secrets: Credenciais, Base64 e Cuidados Reais
Nunca guarde senhas, tokens ou certificados TLS em um ConfigMap. Para dados sensíveis, use Secrets.
Mito perigoso sobre Secrets: os valores em um Secret YAML aparecem em Base64, que é apenas codificação (fácil de decodificar com base64 -d), não criptografia. Segurança real exige: criptografia em repouso no etcd, TLS em trânsito, montagem em memória (tmpfs) e controle de acesso estrito via RBAC (tema da Etapa 4).
Terminal · Criar um Secret genérico e listar chaves montadas
StatefulSets: Identidade Fixa, Headless Service & Storage
Deployments tratam Pods como gado intercambiável (web-7f8b-x9k). Já bancos de dados e sistemas distribuídos (como MongoDB ou Kafka) exigem identidades previsíveis e storage individual persistente. É para isso que existe o StatefulSet:
Nomes ordenados e estáveis:tkb-sts-0, tkb-sts-1, tkb-sts-2. Se tkb-sts-1 cair, o novo Pod nasce exatamente como tkb-sts-1.
Criação e encerramento sequenciais: sobe um Pod por vez e espera ficar Ready antes do próximo; na remoção, encerra na ordem inversa respeitando terminationGracePeriodSeconds.
Headless Service (clusterIP: None): chamado de governing service, não tem IP virtual de balanceamento ("sem cabeça"); o DNS retorna o endereço individual de cada Pod (ex.: tkb-sts-0.mongo-prod.default.svc.cluster.local).
volumeClaimTemplates: cria automaticamente um PVC exclusivo e "grudento" para cada réplica.
LABORATÓRIO INTERATIVO · CAPÍTULOS 10, 11 E 13
Simulador de Service Discovery (DNS) & Storage
Combine o tipo de Workload, Namespaces e reclaimPolicy para gerar o endereço CoreDNS exato e prever o comportamento do volume.
Nome DNS Recomendado
mongo-0.mongo-svc.prod.svc.cluster.local
Identidade do Pod
Fixa (mongo-0, mongo-1…)
Ao Deletar o PVC
PV e Disco Preservados
Como cliente (dev) e serviço (prod) estão em Namespaces diferentes, use o FQDN completo no CoreDNS. Com Retain, o disco na nuvem não é apagado automaticamente ao remover o PVC.
VERIFICAÇÃO DE DOMÍNIO · 4 QUESTÕES
Teste Rápido da Etapa 3
Valide os conceitos dos Capítulos 8, 10, 11, 12 e 13 antes de avançar para Segurança e Recursos Avançados.
1. Qual a principal vantagem de usar um objeto Ingress em vez de vários Services do tipo LoadBalancer?
2. Um Pod no Namespace dev precisa acessar o Service api no Namespace prod. Qual FQDN completo garante a resolução no CoreDNS?
3. Por que não devemos considerar um Secret padrão seguro apenas por estar em Base64?
4. Qual característica define um Headless Service usado como governing service de um StatefulSet?
CONCLUSÃO DA ETAPA 3
Checklist de Prontidão & Exportação
Marque cada marco concluído; seu progresso fica salvo no navegador.
ÚLTIMA PARADA · ETAPA 4 DE 4
Recursos Avançados e Segurança
Conclua a jornada nos Capítulos 9, 14, 15, 16 e 17: WebAssembly (Wasm) no Kubernetes, RBAC e segurança da API, modelagem de ameaças STRIDE e defesa em produção.