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)
Aula 08 - Cluster Kubernetes HA:
- Setup interativo com OpenTofu para Talos na Hetzner
- CCM, CSI Driver, Cluster Autoscaler, Metrics Server
- NGINX Ingress com LoadBalancer (HTTP/HTTPS/SSH)
Aula 09 - n8n na Hetzner:
- Deploy via Helm com PostgreSQL e Redis
- Suporte multi-tenant com add-client.sh
- Integração com Hetzner CSI para volumes persistentes
Aula 10 - GitLab na Hetzner:
- Setup agnóstico: CloudFlare (trusted proxies) ou Let's Encrypt
- Anti-affinity para distribuir webservice/sidekiq em nós diferentes
- Container Registry e SSH via TCP passthrough
- Documentação do erro 422 e solução com trustedCIDRsForXForwardedFor
Melhorias gerais:
- READMEs atualizados com arquitetura e troubleshooting
- Scripts cleanup.sh para todas as aulas
- CLAUDE.md atualizado com contexto do projeto