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:
+17
-17
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -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}"
|
||||
|
||||
Reference in New Issue
Block a user