트러블슈팅: localhost가 응답하지 않던 이유

노드 안에서는 200이 나오는데 밖에서는 응답이 없었습니다. 원인은 externalTrafficPolicy 기본값이었습니다.

증상

클러스터를 처음 올린 뒤 http://localhost/가 응답하지 않았습니다. 그런데 노드 컨테이너 안에서 curl 127.0.0.1:30080을 치면 200이 나왔습니다.

원인

  • 호스트 :80은 kind의 extraPortMappings로 control-plane 노드의 30080에만 연결돼 있습니다.
  • 그런데 Envoy Pod는 worker 노드에 떠 있었습니다.
  • Envoy Gateway가 만드는 Service의 기본값은 externalTrafficPolicy: Local입니다. "이 노드에 Pod가 있을 때만 받는다"는 뜻이라, control-plane으로 들어온 트래픽은 그냥 버려졌습니다.

해결

EnvoyProxy 설정에서 Service를 NodePort 30080 + externalTrafficPolicy: Cluster로 바꿨습니다. 이제 kube-proxy가 다른 노드의 Pod로 트래픽을 전달합니다.

대가: Cluster 정책에서는 SNAT 때문에 클라이언트 원본 IP가 가려집니다. 지금은 터널을 쓰기 때문에 영향이 적습니다.

배운 점

kind에는 LoadBalancer가 없어서 NodePort로 대신하게 됩니다. 이때 "포트가 연결된 노드"와 "Pod가 뜬 노드"가 같은지 꼭 확인해야 합니다.

← 기술블로그 목록