Fase 1: Estado atual

Abra as duas URLs do podinfo no browser ANTES de tudo e deixe abertas o tempo todo. A app fica viva e o load balancing entre os pods aparece ao recarregar (o hostname alterna entre as réplicas):

URL do ALB (entrada pela região AWS) - abrir no browser:

echo "http://$(kubectl get ingress demo-ingress -n demo-resilience -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')/"

URL do VIP on-prem (MetalLB, entrada local do DC) - abrir no browser:

echo "http://192.168.3.240/"
Recarregue cada URL algumas vezes: o campo hostname alterna entre server-hybrid-1-* (as duas réplicas) - é o LB distribuindo. Guarde estas abas - na Fase 3 a URL do ALB vai parar de responder e a do VIP vai continuar, ao vivo.

Os nodes do cluster - repare no hybrid node (hostname mi-xxxx, IP on-prem 192.168.x). A coluna LOCATION deixa claro o lado: lab2-dc1 = datacenter on-prem, sa-east-1x = região AWS. Saída enxuta para caber em terminal com split:

kubectl get nodes -o custom-columns='NODE:.metadata.name,STATUS:.status.conditions[?(@.type=="Ready")].status,LOCATION:.metadata.labels.topology\.kubernetes\.io/zone,IP:.status.addresses[?(@.type=="InternalIP")].address'

Para focar só nos hybrid nodes (ex: na Fase 3, acompanhando eles caírem), filtre por label - saída mínima, ideal para split de tela:

kubectl get nodes -l eks.amazonaws.com/compute-type=hybrid \
  -o custom-columns='NODE:.metadata.name,STATUS:.status.conditions[?(@.type=="Ready")].status,IP:.status.addresses[?(@.type=="InternalIP")].address'

Os pods rodando dos dois lados (verde = on-prem, azul = cloud):

kubectl get pods -n demo-resilience -o wide

As tolerations que mantêm os pods vivos na desconexão. O manifesto abaixo revela o mecanismo, não só o efeito:

tolerations:
  # Quando o node fica unreachable, o controller-manager adiciona o taint
  # node.kubernetes.io/unreachable. Sem toleration, o pod e' evictado em 300s.
  # Com toleration + tolerationSeconds, o pod sobrevive pelo tempo definido.
  - key: "node.kubernetes.io/unreachable"
    operator: "Exists"
    effect: "NoExecute"
    tolerationSeconds: 3600   # 1h no demo; produção: omitir para indefinido
  - key: "node.kubernetes.io/not-ready"
    operator: "Exists"
    effect: "NoExecute"
    tolerationSeconds: 3600
  - key: "node.cilium.io/agent-not-ready"
    operator: "Exists"
    effect: "NoSchedule"

Confirmar que os pods em execução têm essas tolerations aplicadas:

kubectl get deploy server-hybrid-1 -n demo-resilience \
  -o jsonpath='{.spec.template.spec.tolerations}' | jq '.'
Sem tolerations, o Kubernetes faz eviction dos pods em 300s (5min) quando o node fica unreachable. Com elas, os pods sobrevivem pelo tempo configurado - ou indefinidamente.
Dica k9s: deixe um k9s aberto num pane ao lado durante toda a demo. Abra com k9s, confirme o cluster com :ctx, veja :nodes e :pods (digite demo-resilience para filtrar). Nesta fase ele já dá o panorama dos dois lados.