# Kubernetes (K8s) — Resumo Completo para Concursos
---
## 1. O que é Kubernetes
**Kubernetes** (K8s) é uma plataforma de **orquestração de contêineres** open-source, originalmente desenvolvida pelo Google e atualmente mantida pela **CNCF (Cloud Native Computing Foundation)**. Seu objetivo é automatizar o **deploy, escalonamento e gerenciamento** de aplicações em contêineres.
> **"K8s"** = abreviação de Kubernetes (8 letras entre K e s).
### Por que Kubernetes existe?
O Docker resolve o problema de empacotar e rodar contêineres individualmente. Kubernetes resolve o problema de gerenciar **centenas ou milhares de contêineres** em múltiplos servidores (hosts), garantindo:
- Alta disponibilidade (HA)
- Escalonamento automático
- Autorrecuperação (self-healing)
- Balanceamento de carga
- Rollouts e rollbacks controlados
---
## 2. Arquitetura do Kubernetes
O Kubernetes segue o modelo **Control Plane + Worker Nodes**.
```
┌─────────────────────────────────────────────────────┐
│ CONTROL PLANE │
│ ┌──────────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ API Server │ │ etcd │ │ Scheduler │ │
│ └──────────────┘ └──────────┘ └───────────────┘ │
│ ┌──────────────────────────────────────────────┐ │
│ │ Controller Manager │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
│ │
┌────────▼──────┐ ┌────────▼──────┐
│ WORKER NODE │ │ WORKER NODE │
│ ┌──────────┐ │ │ ┌──────────┐ │
│ │ kubelet │ │ │ │ kubelet │ │
│ ├──────────┤ │ │ ├──────────┤ │
│ │kube-proxy│ │ │ │kube-proxy│ │
│ ├──────────┤ │ │ ├──────────┤ │
│ │ Pod │ │ │ │ Pod │ │
│ │ Pod │ │ │ │ Pod │ │
│ └──────────┘ │ │ └──────────┘ │
└───────────────┘ └───────────────┘
```
---
## 3. Componentes do Control Plane
| Componente | Função |
|---|---|
| **kube-apiserver** | Ponto central de comunicação. Toda interação com o cluster passa por ele (REST API). É o único componente que se comunica com o etcd. |
| **etcd** | Banco de dados chave-valor distribuído. Armazena **todo o estado do cluster** (configurações, pods, secrets, etc.). Componente crítico — sua perda significa perda do cluster. |
| **kube-scheduler** | Decide em qual Node um Pod será executado, com base em recursos disponíveis, afinidades e restrições. |
| **kube-controller-manager** | Executa os controladores que monitoram o estado do cluster e tomam ações corretivas (ex.: recriar pods que falharam). |
| **cloud-controller-manager** | Integra o cluster com APIs de provedores de nuvem (AWS, GCP, Azure). Gerencia load balancers, volumes e nós na nuvem. |
---
## 4. Componentes dos Worker Nodes
| Componente | Função |
|---|---|
| **kubelet** | Agente que roda em cada Node. Garante que os contêineres definidos nos Pods estejam em execução e saudáveis. Comunica-se com o API Server. |
| **kube-proxy** | Mantém as regras de rede no Node. Permite a comunicação de rede para os Pods (implementa o conceito de Service). |
| **Container Runtime** | Software que executa os contêineres (ex.: containerd, CRI-O, Docker). O K8s usa a interface **CRI (Container Runtime Interface)**. |
---
## 5. Objetos Fundamentais do Kubernetes
### 5.1 Pod
- **Menor unidade do Kubernetes.**
- Agrupa um ou mais contêineres que compartilham rede e armazenamento.
- Cada Pod tem um **IP único** dentro do cluster.
- Pods são **efêmeros** — quando morrem, não ressuscitam sozinhos (para isso existem os controllers).
- Contêineres dentro de um mesmo Pod se comunicam via `localhost`.
```yaml
apiVersion: v1
kind: Pod
metadata:
name: meu-pod
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
```
### 5.2 ReplicaSet
- Garante que um número específico de réplicas de um Pod esteja sempre em execução.
- Se um Pod falha, o ReplicaSet cria um novo automaticamente (**self-healing**).
- Raramente usado diretamente — geralmente gerenciado pelo Deployment.
### 5.3 Deployment
- **Objeto mais usado no dia a dia.**
- Gerencia ReplicaSets e permite **atualizações declarativas** de aplicações.
- Suporta **rolling update** (atualização gradual) e **rollback**.
- Estratégias de deploy: `RollingUpdate` (padrão) e `Recreate`.
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: meu-deploy
spec:
replicas: 3
selector:
matchLabels:
app: minha-app
template:
metadata:
labels:
app: minha-app
spec:
containers:
- name: nginx
image: nginx:1.25
```
### 5.4 Service
- Expõe um conjunto de Pods como um **endpoint de rede estável**.
- Os Pods têm IPs dinâmicos; o Service fornece um IP/DNS fixo.
- Usa **seletores de labels** para encontrar os Pods.
**Tipos de Service:**
| Tipo | Descrição |
|---|---|
| **ClusterIP** (padrão) | Expõe o serviço apenas **dentro do cluster**. IP interno. |
| **NodePort** | Expõe o serviço em uma porta estática em **cada Node** (30000–32767). Acesso externo possível. |
| **LoadBalancer** | Cria um load balancer externo (em ambientes de nuvem). Acesso externo com IP público. |
| **ExternalName** | Mapeia o Service para um nome DNS externo (CNAME). |
### 5.5 Namespace
- Mecanismo de **isolamento lógico** dentro do cluster.
- Permite dividir um cluster entre múltiplas equipes/projetos.
- Namespaces padrão: `default`, `kube-system`, `kube-public`, `kube-node-lease`.
- Recursos como Nodes e PersistentVolumes são **globais** (não pertencem a um namespace).
### 5.6 ConfigMap
- Armazena dados de configuração **não sensíveis** em pares chave-valor.
- Desacopla configuração da imagem do contêiner.
- Pode ser montado como variável de ambiente ou arquivo.
### 5.7 Secret
- Armazena dados **sensíveis** (senhas, tokens, chaves) codificados em **Base64**.
- Atenção: Base64 **não é criptografia** — Secrets precisam de criptografia adicional em repouso para segurança real.
- Tipos comuns: `Opaque`, `kubernetes.io/tls`, `kubernetes.io/dockerconfigjson`.
### 5.8 PersistentVolume (PV) e PersistentVolumeClaim (PVC)
- **PV:** recurso de armazenamento provisionado no cluster (NFS, EBS, disco local, etc.).
- **PVC:** solicitação de armazenamento feita por um Pod. O K8s faz o binding entre PVC e PV.
- **StorageClass:** permite provisionamento dinâmico de volumes.
---
## 6. Objetos Avançados
### 6.1 StatefulSet
- Para aplicações com **estado** (bancos de dados, filas, Kafka, etc.).
- Garante **identidade estável** para cada Pod (nome fixo: `pod-0`, `pod-1`, ...).
- Volumes persistentes por Pod, que não são deletados quando o Pod é removido.
- Pods são criados e deletados em **ordem**.
### 6.2 DaemonSet
- Garante que **todos os Nodes** (ou um subconjunto) executem uma cópia de um Pod.
- Usado para agentes de monitoramento, coletores de logs, proxies de rede.
- Exemplos: Fluentd, Prometheus Node Exporter, kube-proxy.
### 6.3 Job e CronJob
- **Job:** executa uma tarefa até a conclusão (não fica em loop). Útil para processamento em batch.
- **CronJob:** agenda Jobs para execução periódica (sintaxe cron). Ex.: `"0 3 * * *"` = todo dia às 3h.
### 6.4 Ingress
- Gerencia o **acesso HTTP/HTTPS externo** aos Services dentro do cluster.
- Funciona como um roteador de camada 7 (baseado em host ou caminho URL).
- Requer um **Ingress Controller** instalado (ex.: NGINX Ingress Controller, Traefik).
```
Usuário → Ingress → /api → Service A
→ /web → Service B
→ /admin → Service C
```
### 6.5 HorizontalPodAutoscaler (HPA)
- Escala automaticamente o número de réplicas de um Deployment/ReplicaSet com base em métricas (CPU, memória, métricas customizadas).
### 6.6 ResourceQuota e LimitRange
- **ResourceQuota:** limita o total de recursos consumidos por um namespace.
- **LimitRange:** define limites padrão e máximos por container/Pod dentro de um namespace.
---
## 7. Rede no Kubernetes
- Cada Pod recebe um **IP único e roteável** dentro do cluster.
- Contêineres no mesmo Pod se comunicam via `localhost`.
- Pods de Nodes diferentes se comunicam diretamente (sem NAT) — modelo **flat network**.
- A rede é implementada por **plugins CNI** (Container Network Interface): Calico, Flannel, Cilium, Weave.
### NetworkPolicy
- Define regras de firewall para o tráfego entre Pods.
- Por padrão, todos os Pods podem se comunicar livremente.
- Com NetworkPolicy, é possível restringir tráfego de entrada (ingress) e saída (egress).
---
## 8. Agendamento (Scheduling)
O Scheduler decide onde cada Pod vai rodar com base em:
| Mecanismo | Descrição |
|---|---|
| **nodeSelector** | Seleciona Nodes por label. Forma mais simples. |
| **Node Affinity** | Versão avançada do nodeSelector, com operadores (`In`, `NotIn`, etc.). |
| **Pod Affinity / Anti-Affinity** | Coloca Pods próximos ou separados de outros Pods. |
| **Taints e Tolerations** | Nodes "repelem" Pods por padrão (taint); Pods com toleration passam pelo filtro. |
| **Resource Requests/Limits** | `requests` = mínimo garantido; `limits` = máximo permitido. Influencia o scheduling. |
---
## 9. Comandos kubectl Essenciais
```bash
# Contexto e cluster
kubectl config get-contexts # Lista contextos
kubectl config use-context <nome> # Troca de contexto
# Pods
kubectl get pods # Lista pods no namespace default
kubectl get pods -n kube-system # Lista pods em namespace específico
kubectl get pods -o wide # Mostra IPs e Nodes
kubectl describe pod <nome> # Detalhes do pod
kubectl logs <pod> # Logs do pod
kubectl exec -it <pod> -- bash # Acessa terminal do pod
kubectl delete pod <nome> # Deleta pod
# Deployments
kubectl get deployments
kubectl apply -f deployment.yaml # Aplica manifesto (cria ou atualiza)
kubectl rollout status deployment/<nome>
kubectl rollout undo deployment/<nome> # Rollback
kubectl scale deployment/<nome> --replicas=5
# Services
kubectl get services
kubectl expose deployment/<nome> --port=80 --type=ClusterIP
# Geral
kubectl get all # Lista todos os recursos principais
kubectl get nodes # Lista nodes do cluster
kubectl top pods # Uso de CPU/memória (requer metrics-server)
kubectl top nodes
kubectl delete -f arquivo.yaml # Remove recursos pelo manifesto
```
---
## 10. Labels, Selectors e Annotations
- **Labels:** pares chave-valor anexados a objetos. Usados para seleção e organização. Ex.: `app: frontend`, `env: prod`.
- **Selectors:** filtram objetos por labels. Usados por Services, Deployments, etc.
- **Annotations:** metadados adicionais **não usados para seleção**. Usados para informações descritivas (ex.: versão de build, contato do time).
---
## 11. Ciclo de Vida de um Pod
| Fase | Descrição |
|---|---|
| `Pending` | Pod aceito pelo cluster, aguardando ser agendado ou baixar imagens. |
| `Running` | Pod agendado em um Node, pelo menos um contêiner em execução. |
| `Succeeded` | Todos os contêineres terminaram com sucesso (código 0). |
| `Failed` | Pelo menos um contêiner terminou com falha. |
| `Unknown` | Estado do Pod não pode ser determinado (geralmente problema de rede com o Node). |
### Probes (verificações de saúde)
| Probe | Função |
|---|---|
| **livenessProbe** | Verifica se o contêiner está vivo. Se falhar, reinicia o contêiner. |
| **readinessProbe** | Verifica se o contêiner está pronto para receber tráfego. Se falhar, remove o Pod do Service. |
| **startupProbe** | Verifica se a aplicação iniciou. Útil para apps lentas na inicialização. |
---
## 12. RBAC — Controle de Acesso
**RBAC (Role-Based Access Control)** controla quem pode fazer o quê no cluster.
| Objeto | Descrição |
|---|---|
| **Role** | Define permissões dentro de um **namespace**. |
| **ClusterRole** | Define permissões em **todo o cluster** (ou recursos globais). |
| **RoleBinding** | Vincula um Role a um usuário/grupo/ServiceAccount em um namespace. |
| **ClusterRoleBinding** | Vincula um ClusterRole a um usuário/grupo no cluster inteiro. |
| **ServiceAccount** | Identidade para **processos** dentro de Pods (não para usuários humanos). |
---
## 13. Helm — Gerenciador de Pacotes do Kubernetes
- **Helm** é o gerenciador de pacotes do K8s (análogo ao apt/yum).
- Pacotes são chamados de **Charts**.
- Um Chart é um conjunto de templates YAML que geram manifestos do K8s.
- **Helm Hub / Artifact Hub:** repositório público de charts.
```bash
helm install minha-release bitnami/nginx # Instala um chart
helm upgrade minha-release bitnami/nginx # Atualiza
helm rollback minha-release 1 # Rollback para revisão 1
helm uninstall minha-release # Remove
helm list # Lista releases instaladas
```
---
## 14. Estratégias de Deploy
| Estratégia | Descrição |
|---|---|
| **RollingUpdate** (padrão) | Substitui Pods gradualmente. Zero downtime. Controla `maxSurge` e `maxUnavailable`. |
| **Recreate** | Mata todos os Pods antes de criar os novos. Causa downtime. |
| **Blue/Green** | Mantém duas versões simultaneamente; troca o tráfego de uma vez (via Service). |
| **Canary** | Envia uma fração do tráfego para a nova versão antes do rollout completo. |
---
## 15. Ferramentas do Ecossistema
| Ferramenta | Função |
|---|---|
| **Minikube** | Cluster K8s local para desenvolvimento/testes (single node). |
| **kind** | Kubernetes in Docker — clusters locais com múltiplos nodes via Docker. |
| **k3s** | Distribuição leve do K8s para edge computing e IoT (Rancher/SUSE). |
| **Lens / OpenLens** | IDE visual para gerenciar clusters Kubernetes. |
| **Prometheus + Grafana** | Stack padrão de monitoramento para K8s. |
| **Istio / Linkerd** | Service Mesh — gerencia comunicação, segurança e observabilidade entre serviços. |
| **ArgoCD / Flux** | GitOps — sincroniza o estado do cluster com um repositório Git. |
---
## 16. Comparação: Docker vs Kubernetes
| Aspecto | Docker (isolado) | Kubernetes |
|---|---|---|
| Escopo | Único host | Multi-host (cluster) |
| Orquestração | Docker Compose (básico) | Nativa e avançada |
| Self-healing | Não | Sim |
| Escalonamento automático | Não | Sim (HPA/VPA) |
| Balanceamento de carga | Manual | Automático (Services) |
| Complexidade | Baixa | Alta |
| Uso típico | Dev/teste local | Produção em escala |
---
## 17. Pontos que Mais Caem em Concursos
- Kubernetes é um **orquestrador de contêineres**, não um runtime de contêineres.
- **etcd** armazena o estado do cluster — é o componente mais crítico para backup.
- **kube-apiserver** é o único componente que acessa o etcd diretamente.
- **kubelet** roda em cada Node e é responsável por manter os Pods rodando.
- **Pod** é a menor unidade implantável do K8s (não o contêiner).
- **Service do tipo ClusterIP** só é acessível dentro do cluster.
- **NodePort** expõe o serviço em uma porta entre 30000 e 32767.
- **LoadBalancer** requer suporte de um provedor de nuvem.
- **Ingress** requer um **Ingress Controller** instalado — não funciona sozinho.
- **StatefulSet** para apps com estado; **Deployment** para apps sem estado (stateless).
- **DaemonSet** garante um Pod em cada Node do cluster.
- **ConfigMap** para configurações; **Secret** para dados sensíveis (em Base64).
- **Secret não é criptografado por padrão** — apenas codificado em Base64.
- **RBAC**: Role e RoleBinding são namespaced; ClusterRole e ClusterRoleBinding são globais.
- **livenessProbe** reinicia o contêiner; **readinessProbe** controla o tráfego do Service.
- Kubernetes foi originalmente criado pelo **Google** e doado à **CNCF** em 2016.
- A sigla K8s vem das 8 letras entre o **K** e o **s** de Kubernetes.
## Extra
Requests (Solicitações): É a garantia mínima. O Scheduler (escalonador) do Kubernetes usa esse valor para decidir em qual Nó (Node) o Pod vai rodar. Se um Pod "solicita" 2GB de RAM, o Kubernetes só o colocará em um servidor que tenha, no mínimo, 2GB livres.
Limits (Limites): É o teto máximo. Uma vez rodando, se o contêiner tentar usar mais CPU do que o limite, ele será estrangulado (throttled). Se tentar usar mais Memória do que o limite, ele será morto pelo sistema.