Implantar a menor unidade de carga de trabalho possível, co-localizada.
→Defina um recurso `Pod`. Pods podem conter um ou mais contêineres que compartilham rede e armazenamento.
Por quê: O Pod é a unidade atômica de agendamento no Kubernetes. Contêineres são sempre implantados dentro de um Pod.
Referência↗
Garantir que o estado do cluster corresponda continuamente a um estado desejado.
→Confie no `kube-controller-manager`. Ele executa laços de controle que observam recursos (p.ex., ReplicaSets, Deployments) e reconciliam diferenças.
Por quê: Este é o principal mecanismo declarativo e de auto-recuperação. Se um Pod gerenciado por um ReplicaSet falhar, o controlador o substitui automaticamente.
Atribuir automaticamente novos Pods criados ao nó de trabalho mais adequado.
→Confie no `kube-scheduler`. Ele filtra nós com base nos requisitos do Pod (p.ex., requisições de recursos) e os pontua para escolher o melhor ajuste.
Por quê: O agendador toma decisões de alocação com base em políticas, afinidade e disponibilidade, abstraindo a seleção de nós do usuário.
Garantir que os contêineres especificados nos Pods estejam em execução e saudáveis em um determinado nó de trabalho.
→O agente `kubelet` é executado em cada nó, comunica-se com o servidor da API e gerencia o ciclo de vida do contêiner (iniciar, parar, verificações de saúde) através de um runtime de contêiner.
Por quê: O Kubelet é o elo entre o plano de controle e o nó de trabalho; ele executa as especificações do Pod.
Persistir o estado e a configuração completos do cluster Kubernetes de forma confiável.
→Use `etcd`, um armazenamento de chave-valor consistente e altamente disponível. Ele serve como a única fonte de verdade para o cluster.
Por quê: Todos os objetos do cluster (Pods, Services, etc.) são armazenados no etcd. Apenas o servidor da API se comunica diretamente com ele.
Implementar regras de rede em cada nó para permitir a comunicação via Kubernetes Services.
→O componente `kube-proxy` em cada nó mantém regras de rede (p.ex., iptables, IPVS) que encaminham o tráfego de um IP de Service para os Pods de backend corretos.
Por quê: Kube-proxy é o detalhe de implementação por trás da abstração de Service, lidando com balanceamento de carga e roteamento.
Particionar logicamente um único cluster Kubernetes para múltiplas equipes, projetos ou ambientes.
→Crie recursos `Namespace`. Namespaces fornecem um escopo para nomes e uma forma de anexar autorização e políticas (p.ex., ResourceQuotas).
Por quê: Namespaces permitem multi-locação e organização de recursos sem a sobrecarga de múltiplos clusters.
Fornecer um endpoint de rede estável (IP e DNS) para um conjunto de Pods efêmeros.
→Defina um recurso `Service` que alveja um conjunto de Pods usando um seletor de rótulos.
Por quê: Pods são efêmeros e seus IPs mudam. Um Service fornece uma abstração durável que balanceia a carga do tráfego para os Pods corretos.
Referência↗
Expor uma aplicação rodando em Pods a diferentes escopos de rede.
→Escolha um `type` de Service: `ClusterIP` (apenas interno, padrão), `NodePort` (expõe em cada nó IP:porta), ou `LoadBalancer` (provisiona um balanceador de carga da nuvem).
Por quê: O tipo de Service determina a acessibilidade da aplicação, de puramente interna a totalmente externa.
Permitir a descoberta de rede direta de Pods individuais, ignorando o proxy do Service.
→Crie um `Service` com `clusterIP: None`. Isso cria registros DNS A para cada Pod, permitindo que os clientes se conectem diretamente aos Pods.
Por quê: Essencial para aplicações stateful como bancos de dados (frequentemente com StatefulSets) onde a comunicação peer-to-peer ou identidade estável do Pod é necessária.
Organizar e selecionar um subconjunto de objetos Kubernetes.
→Anexe `labels` de chave-valor a objetos (p.ex., `app: my-api`). Use `label selectors` em outros objetos (p.ex., Services, Deployments) para selecioná-los.
Por quê: Labels são o principal mecanismo de agrupamento no Kubernetes, permitindo o acoplamento fraco entre recursos.
Desacoplar a configuração da aplicação da imagem do contêiner.
→Armazene dados de configuração não sensíveis em um `ConfigMap`. Monte-o como um volume ou injete chaves como variáveis de ambiente em Pods.
Por quê: Isso permite que a configuração seja gerenciada independentemente do código da aplicação, seguindo os princípios do 12-Factor App.
Armazenar dados sensíveis como senhas, tokens ou chaves de API para uso da aplicação.
→Use um objeto `Secret`. Monte como um volume ou injete como uma variável de ambiente.
Por quê: Secrets são especificamente para dados sensíveis e tratados de forma mais segura do que ConfigMaps (p.ex., não são exibidos em `kubectl describe` por padrão, podem ser criptografados em repouso).
Fornecer a aplicações stateful armazenamento que sobrevive a reinícios de Pods.
→Um Pod cria um `PersistentVolumeClaim` (PVC) para solicitar armazenamento. Um administrador provisiona um `PersistentVolume` (PV) que atende à solicitação.
Por quê: Isso desacopla o consumo de armazenamento (PVC) do provisionamento de armazenamento (PV), permitindo definições de carga de trabalho portáteis.
Gerenciar a alocação de CPU e memória para contêineres.
→Defina `resources.requests` para recursos garantidos (usados para agendamento) e `resources.limits` para o uso máximo permitido (imposto em tempo de execução).
Por quê: Requisições garantem que os Pods tenham recursos suficientes para rodar; Limites impedem que os Pods consumam muitos recursos e impactem outras cargas de trabalho.
Definir restrições agregadas de recursos em um namespace.
→Crie um objeto `ResourceQuota` para limitar a quantidade total de CPU, memória ou número de objetos (Pods, Services) que podem ser criados em um namespace.
Por quê: ResourceQuotas são essenciais para ambientes multi-tenant para garantir o compartilhamento justo de recursos e prevenir o consumo excessivo.
Gerenciar recursos Kubernetes usando arquivos de configuração versionados.
→Use `kubectl apply -f <filename.yaml>`. Este comando cria ou atualiza recursos com base no conteúdo do arquivo.
Por quê: `apply` é declarativo, tornando-o ideal para GitOps e CI/CD. Ele rastreia mudanças e realiza uma fusão de três vias, o que é mais seguro do que os comandos imperativos `create` ou `replace`.
Diagnosticar por que um Pod não está rodando corretamente (p.ex., preso em Pending, ContainerCreating, ou CrashLoopBackOff).
→Use `kubectl describe pod <pod-name>`. Verifique a seção `Events` na parte inferior para mensagens detalhadas do agendador, kubelet ou controladores.
Por quê: `describe` fornece um log de eventos cronológico que é a ferramenta principal para depurar problemas do ciclo de vida dos recursos.
Fornecer funcionalidade de rede para contêineres, permitindo a comunicação Pod-a-Pod através do cluster.
→Use um plugin Container Network Interface (CNI) (p.ex., Calico, Flannel, Cilium). O kubelet em cada nó usa o plugin CNI para configurar a rede para cada Pod.
Por quê: CNI fornece uma interface padrão, permitindo que o Kubernetes seja integrado com várias soluções de rede sem modificar os componentes centrais.
Controlar o acesso aos recursos da API Kubernetes para usuários e aplicações.
→Use Role-Based Access Control (RBAC). Defina um `Role` (com escopo de namespace) ou `ClusterRole` (com escopo de cluster) com permissões, e associe-o a um sujeito (User, Group, ServiceAccount) usando um `RoleBinding` ou `ClusterRoleBinding`.
Por quê: RBAC é o padrão para proteger o Kubernetes, permitindo o princípio do menor privilégio para todas as interações da API.
Referência↗