feat: adicionar aula-16 (Flagger), remover Jaeger da aula-14 e integrar tracing Istio na aula-15

- aula-16: nova aula de canary deployment automatizado com Flagger
- aula-14: removido Jaeger (tracing movido para aula-15), corrigido
  nome do serviço Victoria Metrics, adicionado rate limiting no Kiali
- aula-15: adicionado receiver Zipkin no OTel Collector para receber
  traces do Istio, corrigida porta do Tempo (3100→3200), integração
  automática com Istio quando detectado
- aula-03: corrigido MAX_REQUESTS de 10 para 3 (valor padrão)
- CLAUDE.md: adicionada aula-16 na documentação
This commit is contained in:
ArgoCD Setup
2026-04-10 08:43:01 -03:00
parent 6ae82ed183
commit 60e69c9ff6
15 changed files with 1397 additions and 129 deletions
+17 -17
View File
@@ -1,6 +1,6 @@
# Aula 14 - Istio Traffic Splitting
Demonstração de **app-backend deployment** usando Istio para dividir tráfego entre duas versões da aplicação.
Demonstração de **canary deployment manual** usando Istio para dividir tráfego entre duas versões da aplicação.
## Motivação
@@ -29,9 +29,9 @@ Em produção, lançar uma nova versão diretamente para 100% dos usuários é a
│ │ bug │ │ ok │ │
│ └──────┘ └──────┘ │
│ │
│ ┌─────────┐ ┌────────┐ ┌─────────────────┐│
│ │ Kiali │ │ Jaeger │ │ Victoria Metrics
│ └─────────┘ └────────┘ └─────────────────┘│
│ ┌─────────┐ ┌─────────────────┐
│ │ Kiali │ │ Victoria Metrics
│ └─────────┘ └─────────────────┘
└─────────────────────────────────────────────┘
```
@@ -72,11 +72,10 @@ aula-14/
│ ├── deployment-v2.yaml
│ ├── service.yaml
│ ├── destination-rule.yaml # Define subsets v1, v2
── virtual-service.yaml # Traffic splitting (90/10)
── virtual-service.yaml # Traffic splitting (90/10)
│ └── ingress-kiali.yaml
└── istio/
── kiali-values.yaml
├── jaeger-values.yaml
└── gateway.yaml
── kiali-values.yaml
```
## Instalação
@@ -89,9 +88,9 @@ cd aula-14
O script irá:
1. Verificar pré-requisitos (incluindo Victoria Metrics da aula-12)
2. Coletar configuração (domínio, registry, TLS)
3. Instalar Istio (istio-base + istiod)
4. Instalar Kiali e Jaeger (métricas via Victoria Metrics)
5. Configurar Ingress para dashboards
3. Instalar Istio (istio-base + istiod + ingressgateway)
4. Instalar Kiali (dashboard do service mesh, métricas via Victoria Metrics)
5. Configurar Ingress com Basic Auth e rate limiting
6. Build e push das imagens v1 e v2
7. Deploy da aplicação com traffic splitting 90/10
@@ -152,9 +151,9 @@ kubectl patch virtualservice app-backend -n istio --type='json' \
{"op":"replace","path":"/spec/http/0/route/1/weight","value":50}]'
```
### 4. Verificar traces no Jaeger
### 4. Observar no Kiali
Abra o Jaeger e observe os traces das requisições passando pelo mesh.
Volte ao Kiali e veja o tráfego redistribuído igualmente entre v1 e v2.
### 5. Rollout completo para v2
@@ -185,9 +184,6 @@ kubectl logs -n istio -l app=app-backend,version=v2 -f
# Port-forward para Kiali (alternativa ao Ingress)
kubectl port-forward svc/kiali -n istio-system 20001:20001
# Port-forward para Jaeger
kubectl port-forward svc/tracing -n istio-system 16686:80
```
## Cleanup
@@ -196,7 +192,7 @@ kubectl port-forward svc/tracing -n istio-system 16686:80
./cleanup.sh
```
Remove Istio, addons e namespace da aplicação.
Remove Istio, Kiali e namespace da aplicação.
## Troubleshooting
@@ -228,3 +224,7 @@ Verificar se DestinationRule existe:
```bash
kubectl get destinationrule app-backend -n istio -o yaml
```
### E o tracing?
O tracing distribuído (ver o caminho de um request individual) é configurado na **aula-15** com Grafana Tempo + OpenTelemetry. O Istio envia traces automaticamente para o Tempo após a aula-15 ser instalada.
+6 -8
View File
@@ -4,7 +4,7 @@
# ============================================================================
# Remove todos os componentes instalados pelo setup.sh:
# - Namespace istio (aplicação)
# - Kiali, Jaeger (addons)
# - Kiali (addon)
# - Istio (istiod + base)
# - Ingress resources
#
@@ -37,9 +37,9 @@ echo -e "${CYAN}╚════════════════════
echo ""
echo -e "${YELLOW}Este script irá remover:${NC}"
echo " - Namespace 'istio' com aplicação"
echo " - Addons: Kiali, Jaeger"
echo " - Addon: Kiali"
echo " - Istio: istiod e istio-base"
echo " - Ingress do Kiali e Jaeger"
echo " - Ingress do Kiali"
echo ""
read -p "Continuar? (digite 'sim' para confirmar): " confirm
if [[ "$confirm" != "sim" ]]; then
@@ -64,16 +64,14 @@ fi
# Remover Ingress
log_info "Removendo Ingress..."
kubectl delete ingress kiali jaeger -n istio-system --ignore-not-found=true 2>/dev/null || true
kubectl delete ingress kiali -n istio-system --ignore-not-found=true 2>/dev/null || true
log_success "Ingress removidos"
# Remover addons (Kiali, Jaeger)
# Remover addon (Kiali)
log_info "Removendo Kiali..."
kubectl delete -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/kiali.yaml 2>/dev/null || true
log_info "Removendo Jaeger..."
kubectl delete -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/jaeger.yaml 2>/dev/null || true
log_success "Addons removidos"
log_success "Addon removido"
# Remover istiod
if helm status istiod -n istio-system &> /dev/null; then
-29
View File
@@ -1,29 +0,0 @@
# Jaeger - Distributed Tracing
# Tracing para visualizar requisições através do mesh
provisionDataStore:
cassandra: false
allInOne:
enabled: true
image: jaegertracing/all-in-one
tag: "1.62"
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
storage:
type: memory
collector:
enabled: false
query:
enabled: false
agent:
enabled: false
+2 -4
View File
@@ -15,10 +15,8 @@ deployment:
external_services:
prometheus:
url: http://vmsingle-victoria-metrics-k8s-stack.monitoring:8429
url: http://vmsingle-monitoring-victoria-metrics-k8s-stack.monitoring:8429
tracing:
enabled: true
in_cluster_url: http://tracing.istio-system:16685/jaeger
use_grpc: true
enabled: false
grafana:
enabled: false
-25
View File
@@ -1,25 +0,0 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jaeger
namespace: istio-system
annotations:
nginx.ingress.kubernetes.io/backend-protocol: HTTP
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
${TLS_ANNOTATION}
spec:
ingressClassName: nginx
${TLS_CONFIG}
rules:
- host: ${JAEGER_HOST}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tracing
port:
number: 80
+3
View File
@@ -8,6 +8,9 @@ metadata:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
nginx.ingress.kubernetes.io/limit-rps: "20"
nginx.ingress.kubernetes.io/limit-connections: "10"
nginx.ingress.kubernetes.io/limit-burst-multiplier: "3"
${TLS_ANNOTATION}
spec:
ingressClassName: nginx
+13 -42
View File
@@ -2,18 +2,16 @@
# ============================================================================
# Aula 14 - Istio Traffic Splitting
# ============================================================================
# Instala Istio com Kiali e Jaeger para demonstrar canary deployment
# Instala Istio com Kiali para demonstrar canary deployment
# usando traffic splitting entre duas versões da aplicação.
#
# Componentes:
# - Istio (istio-base + istiod)
# - Kiali (visualização do service mesh)
# - Jaeger (tracing distribuído)
# - Aplicação app-backend v1 e v2
#
# Observabilidade:
# - Usa Victoria Metrics da aula-12 para métricas
# - Jaeger para tracing distribuído
#
# Pré-requisitos:
# - Cluster Kubernetes da aula-08
@@ -61,7 +59,6 @@ REGISTRY_HOST=${REGISTRY_HOST}
REGISTRY_PROJECT=${REGISTRY_PROJECT}
APP_HOST=${APP_HOST}
KIALI_HOST=${KIALI_HOST}
JAEGER_HOST=${JAEGER_HOST}
USE_LETSENCRYPT=${USE_LETSENCRYPT}
LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
BASIC_AUTH_USER=${BASIC_AUTH_USER}
@@ -96,7 +93,6 @@ collect_user_input() {
echo -e " Registry: ${GREEN}${REGISTRY_HOST}${NC}"
echo -e " App: ${GREEN}${APP_HOST}${NC}"
echo -e " Kiali: ${GREEN}${KIALI_HOST}${NC}"
echo -e " Jaeger: ${GREEN}${JAEGER_HOST}${NC}"
echo ""
echo -e "[1] Usar configuração existente"
echo -e "[2] Inserir nova configuração"
@@ -119,7 +115,6 @@ collect_user_input() {
echo ""
APP_HOST=$(ask_hostname "App" "$APP_HOST" "app.${INHERITED_DOMAIN}")
KIALI_HOST=$(ask_hostname "Kiali" "$KIALI_HOST" "kiali.${INHERITED_DOMAIN}")
JAEGER_HOST=$(ask_hostname "Jaeger" "$JAEGER_HOST" "jaeger.${INHERITED_DOMAIN}")
# Owner/repo no Gitea para o registry (ex: root, demo, factory)
if [[ -z "$REGISTRY_PROJECT" ]]; then
@@ -149,9 +144,9 @@ collect_user_input() {
USE_LETSENCRYPT=false
fi
# Basic Auth para Kiali e Jaeger
# Basic Auth para Kiali
echo ""
echo -e "${CYAN}Autenticação para Kiali e Jaeger:${NC}"
echo -e "${CYAN}Autenticação para Kiali:${NC}"
if [[ -z "$BASIC_AUTH_USER" ]]; then
BASIC_AUTH_USER="admin"
fi
@@ -204,9 +199,9 @@ check_prerequisites() {
log_success "Cluster Kubernetes acessível"
# Verificar Victoria Metrics (aula-12)
if kubectl get svc -n monitoring vmsingle-victoria-metrics-k8s-stack &> /dev/null; then
if kubectl get svc -n monitoring vmsingle-monitoring-victoria-metrics-k8s-stack &> /dev/null; then
log_success "Victoria Metrics encontrado (aula-12)"
VICTORIA_METRICS_URL="http://vmsingle-victoria-metrics-k8s-stack.monitoring:8429"
VICTORIA_METRICS_URL="http://vmsingle-monitoring-victoria-metrics-k8s-stack.monitoring:8429"
else
log_warn "Victoria Metrics não encontrado. Instale a aula-12 primeiro."
log_warn "Kiali funcionará sem métricas até Victoria Metrics estar disponível."
@@ -274,14 +269,9 @@ install_istio() {
install_observability() {
echo ""
echo -e "${CYAN}═══════════════════════════════════════════════════════════${NC}"
echo -e "${CYAN} Instalando Kiali e Jaeger${NC}"
echo -e "${CYAN} Instalando Kiali${NC}"
echo -e "${CYAN}═══════════════════════════════════════════════════════════${NC}"
log_info "Instalando Jaeger..."
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/jaeger.yaml 2>/dev/null || true
log_success "Jaeger instalado"
# Instalar Kiali com configuração para Victoria Metrics
log_info "Instalando Kiali..."
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/kiali.yaml 2>/dev/null || true
@@ -290,18 +280,16 @@ install_observability() {
log_info "Configurando Kiali para usar Victoria Metrics..."
kubectl patch configmap kiali -n istio-system --type merge -p "{
\"data\": {
\"config.yaml\": \"external_services:\\n prometheus:\\n url: ${VICTORIA_METRICS_URL}\\n tracing:\\n enabled: true\\n in_cluster_url: http://tracing.istio-system:16685/jaeger\\n use_grpc: true\\n\"
\"config.yaml\": \"auth:\\n strategy: anonymous\\nlogin_token:\\n signing_key: kiali-signing-key-1234\\nserver:\\n web_root: /kiali\\nexternalservices:\\n prometheus:\\n url: ${VICTORIA_METRICS_URL}\\n tracing:\\n enabled: false\\n grafana:\\n enabled: false\\n\"
}
}" 2>/dev/null || true
# Reiniciar Kiali para aplicar configuração
kubectl rollout restart deployment/kiali -n istio-system 2>/dev/null || true
fi
log_success "Kiali instalado"
log_info "Aguardando pods de observabilidade..."
log_info "Aguardando Kiali..."
kubectl wait --for=condition=available deployment/kiali -n istio-system --timeout=300s 2>/dev/null || true
kubectl wait --for=condition=available deployment/jaeger -n istio-system --timeout=300s 2>/dev/null || true
log_success "Observabilidade pronta"
log_success "Kiali pronto"
}
# ============================================================================
@@ -311,7 +299,7 @@ install_observability() {
setup_basic_auth() {
echo ""
echo -e "${CYAN}═══════════════════════════════════════════════════════════${NC}"
echo -e "${CYAN} Configurando Basic Auth para Kiali e Jaeger${NC}"
echo -e "${CYAN} Configurando Basic Auth para Kiali${NC}"
echo -e "${CYAN}═══════════════════════════════════════════════════════════${NC}"
log_info "Criando secret basic-auth..."
@@ -340,7 +328,7 @@ setup_basic_auth() {
setup_ingress() {
echo ""
echo -e "${CYAN}═══════════════════════════════════════════════════════════${NC}"
echo -e "${CYAN} Configurando Ingress para Kiali e Jaeger${NC}"
echo -e "${CYAN} Configurando Ingress para Kiali${NC}"
echo -e "${CYAN}═══════════════════════════════════════════════════════════${NC}"
local TLS_ANNOTATION=""
@@ -360,19 +348,6 @@ setup_ingress() {
export KIALI_HOST TLS_ANNOTATION TLS_CONFIG
envsubst '${KIALI_HOST} ${TLS_ANNOTATION} ${TLS_CONFIG}' < "${SCRIPT_DIR}/k8s/ingress-kiali.yaml" | kubectl apply -f -
log_success "Ingress do Kiali criado"
log_info "Criando Ingress para Jaeger..."
if [[ "$USE_LETSENCRYPT" == "true" ]]; then
TLS_CONFIG="tls:
- hosts:
- ${JAEGER_HOST}
secretName: jaeger-tls"
else
TLS_CONFIG=""
fi
export JAEGER_HOST TLS_ANNOTATION TLS_CONFIG
envsubst '${JAEGER_HOST} ${TLS_ANNOTATION} ${TLS_CONFIG}' < "${SCRIPT_DIR}/k8s/ingress-jaeger.yaml" | kubectl apply -f -
log_success "Ingress do Jaeger criado"
}
setup_app_ingress() {
@@ -521,7 +496,6 @@ show_summary() {
echo -e "${GREEN}Componentes instalados:${NC}"
echo " - Istio (istiod + base)"
echo " - Kiali (dashboard do service mesh)"
echo " - Jaeger (tracing distribuído)"
echo " - app-backend v1 e v2"
echo ""
if [[ -n "$VICTORIA_METRICS_URL" ]]; then
@@ -532,10 +506,9 @@ show_summary() {
echo ""
echo -e "${GREEN}URLs:${NC}"
echo -e " App: ${CYAN}${protocol}://${APP_HOST}${NC}"
echo -e " Kiali: ${CYAN}${protocol}://${KIALI_HOST}${NC}"
echo -e " Jaeger: ${CYAN}${protocol}://${JAEGER_HOST}${NC}"
echo -e " Kiali: ${CYAN}${protocol}://${KIALI_HOST}/kiali/${NC}"
echo ""
echo -e "${GREEN}Credenciais (Basic Auth para Kiali/Jaeger):${NC}"
echo -e "${GREEN}Credenciais (Basic Auth para Kiali):${NC}"
echo -e " Usuário: ${CYAN}${BASIC_AUTH_USER}${NC}"
echo -e " Senha: ${CYAN}${BASIC_AUTH_PASS}${NC}"
echo ""
@@ -562,7 +535,6 @@ show_summary() {
echo -e "${YELLOW}Configure DNS para:${NC}"
echo " ${APP_HOST} -> IP do Ingress"
echo " ${KIALI_HOST} -> IP do Ingress"
echo " ${JAEGER_HOST} -> IP do Ingress"
echo ""
}
@@ -596,7 +568,6 @@ main() {
echo ""
echo -e " ${YELLOW}${APP_HOST}${NC}"
echo -e " ${YELLOW}${KIALI_HOST}${NC}"
echo -e " ${YELLOW}${JAEGER_HOST}${NC}"
echo ""
if [[ "$USE_LETSENCRYPT" == "true" ]]; then
echo -e "${YELLOW}⚠ O Let's Encrypt precisa do DNS configurado para emitir o certificado.${NC}"