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/"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'Os pods rodando dos dois lados (verde = on-prem, azul = cloud):
kubectl get pods -n demo-resilience -o wideAs 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 '.'