---
# System prepended metadata

title: Kubernetes (K8s) — Resumo Completo para Concursos

---

# 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.