- Extrair função ask_hostname para simplificar coleta de inputs
- Remover variável DOMAIN do .env (usar hosts individuais)
- Herdar domínio da aula-10 como default para hostnames
- Adicionar label PodSecurity privileged no namespace istio-system
- Usar ClusterIP no istio-ingressgateway e timeout de 10m no Helm
- Permitir edição do email Let's Encrypt quando já configurado
Benchmarks antigos eram falhos: node hardcoded, imagens diferentes,
sem verificação de snapshotter, sem controle de cache, 1 iteração.
Novos scripts:
- prepare-images.sh: constrói mesma imagem em gzip e estargz
- benchmark.sh: múltiplas iterações, detecção de cache hits,
verificação de snapshotter, 3 tipos de imagem (nginx/node/postgres)
Requer worker node sem cache (node fresh via cluster autoscaler).
O values.yaml estava aninhado sob 'victoria-metrics-k8s-stack:' mas
o chart é instalado diretamente, então grafana e outros subcharts
precisam estar no nível raiz. Isso impedia a criação do Ingress do
Grafana.
- aula-08: adicionar key cluster-config no secret do autoscaler
- aula-09,10,11,12,14,15: adicionar pausa DNS antes do helm install
(Let's Encrypt precisa do DNS configurado para emitir certificado)
- aula-09,10,11: corrigir anotação cert-manager.io/cluster-issuer
(--set do Helm interpreta pontos como separadores de nested keys)
- aula-10: corrigir load_config com set -e (exit silencioso)
- aula-10: adicionar teste rápido do registry no README
Nova aula cobrindo Application Performance Monitoring:
- Grafana Tempo como backend de traces (single binary, sem DB)
- OpenTelemetry auto-instrumentação (zero code changes)
- Demo app com N+1 intencional pra demonstração
- Conceito: limiar de Doherty (400ms) e perda silenciosa de UX
- RED method (Rate, Errors, Duration) por rota
- Correlação métrica→trace nativa no Grafana
- Alertas: p95 > 400ms dispara aviso
Filosofia: métricas dizem O QUE está errado, traces dizem POR QUE.
Remove indireção GitOps (factory/monitoring repo) que adicionava
complexidade sem valor pedagógico. O foco da aula é observabilidade,
não pipeline de deploy.
Antes: setup.sh → cria repo → push manifests → ArgoCD app → sync → instala
Agora: setup.sh → helm install → pronto
README reescrito com foco em "o que monitorar" (PVC cheio, CrashLoop,
CPU saturada) em vez de "como instalar via GitOps".
- Atualizar diagrama de jornada com seção de Observabilidade
- Adicionar aulas 12 e 14 na tabela de conteúdo
- Incluir comandos no Quick Start
- Atualizar estrutura do repositório
- Expandir diagrama de arquitetura com monitoramento e service mesh
Adiciona configuração explícita para usar o mesmo bucket S3 para uploads,
artifacts, LFS, packages, externalDiffs, terraformState, ciSecureFiles e
dependencyProxy. O GitLab organiza internamente por pastas/prefixos.
- Instala Istio (base + istiod + ingressgateway)
- Configura Kiali e Jaeger para observabilidade
- Deploy de app-backend v1 e v2 com traffic splitting 90/10
- Integra com Victoria Metrics da aula-12
- Inclui teste-stress.sh para validar distribuição de tráfego
- Tráfego externo passa pelo Istio Gateway via NGINX Ingress
- Mesclar seções global duplicadas no gitlab-values.yaml
(a segunda sobrescrevia ingress.class: nginx, causando 404)
- Adicionar etapa de DNS antes da instalação no setup.sh
(HTTP-01 challenge requer DNS configurado previamente)
load_config retorna 1 quando .env não existe, causando saída
imediata devido ao set -e. Adiciona || true para continuar
a execução e coletar input do usuário.
Adiciona comandos didáticos:
- helm list, history, get values, status
- helm rollback (não precisa de variáveis)
- helm upgrade com source .env (mostra os --set)
- Dica para usar setup.sh em produção
- Adicionar hcloud-csi-values.yaml com tolerations para node failures
- Configurar 2 replicas do CSI controller para HA
- Criar statefulset-pdb.yaml para proteger StatefulSets durante drain
- Documentar troubleshooting de volumes stuck no README
O n8n webhook precisa de mais memória para iniciar corretamente.
Com 256Mi, a liveness probe mata o container antes dele subir.
- Aumentar memory limit de 256Mi para 512Mi
- Aumentar cpu limit de 250m para 500m
- Aumentar requests proporcionalmente
- Documentar trigger único (unavailable) em vez de restarts
- Explicar fórmula intuitiva: 5 + (unavailable * 2)
- Adicionar seção sobre scrape interval de 5s
- Documentar fluxo de detecção (~6-7s)
- Explicar por que não usar restarts (CrashLoopBackOff)
- Atualizar lições e trade-offs
- Simplificar ScaledObject: usar apenas trigger de pods unavailable
(instantâneo) em vez de restarts (requeria janela de tempo)
- Adicionar VMServiceScrape com scrape interval de 5s para detecção
rápida pelo Victoria Metrics (default era 30s)
- Acelerar scale down: stabilizationWindow=0, remove 10 pods/s
- Query intuitiva: 5 + (unavailable * 2) = réplicas desejadas
- Usar metricType AverageValue para cálculo correto de réplicas
- Limpar mensagem desnecessária do teste de stress
- URL padrão agora é http://localhost (porta 80)
- Verificação do Ingress executa sempre, não apenas quando porta 80
- Remove opção de fallback para porta 3000
- Atualiza README com exemplos corretos
- Adicionar flag --no-annotation-check para auto-resize sem annotations
- Documentar comportamento automático para PVCs futuros
- Mover seção de annotations para "Override (Opcional)"
- Atualizar limite padrão para 10Ti (máximo Hetzner)
- ArgoCD via Helm com recursos mínimos (~1Gi)
- GitLab Runner com executor Kubernetes
- Exemplo node-bugado com Dockerfile e .gitlab-ci.yml
- Manifests K8s para repositório GitOps
- README.md da aula-03 (liveness + readiness probes)