IL-0186 Hans H. Kim · 2023-04-13 (게시일)kubernetesnetworking
쿠버네티스 클러스터의 특정 워커 노드에서 파드가 80 포트와 443 포트로 외부와 통신하지 못했다. 인프라 담당자와 팀원이 함께 디버깅한 결과, 스토리지 작업용 구성 요소를 설치한 서버가 그 노드에 iptables 설정을 자동으로 추가해 둔 것이 원인이었다. nat 테이블의 PREROUTING 체인에 목적지 포트가 http 면 47080 으로, https 면 47443 으로 리다이렉트하는 규칙이 들어가 있었다.
파드가 내보내는 요청은 PREROUTING 체인을 지난다. 그래서 파드에서 나가는 HTTP 와 HTTPS 요청은 각각 localhost:47080 과 localhost:47443 으로 리다이렉트돼 외부에 닿지 못했다. 반면 이미지 풀은 파드 안의 통신이 아니라 호스트 통신이라 OUTPUT 체인을 탔고, OUTPUT 의 규칙은 lo 로 나가는 요청에만 걸려 영향이 없었다. 스토리지 담당자에게 요청해 이 규칙을 지워 해결했다.
쿠버네티스 클러스터의 특정 워커 노드에서 80 포트와 443 포트로 가는 통신이 되지 않았다. 그 노드의 파드는 외부와 HTTP, HTTPS 로 통신할 수 없었다.
노드에서 iptables -L -t nat -v 로 nat 테이블을 보니 PREROUTING 체인에 KUBE-SERVICES 규칙 다음으로 REDIRECT tcp -- any any anywhere anywhere tcp dpt:http redir ports 47080 과 REDIRECT tcp -- any any anywhere anywhere tcp dpt:https redir ports 47443 규칙이 들어 있었다. https 규칙에는 패킷 234개가 걸려 있었다.
이미지 풀은 영향을 받지 않았다. OUTPUT 체인에도 같은 REDIRECT 규칙이 있었지만 나가는 인터페이스가 lo 인 요청에만 걸렸기 때문이다.
증상 ? 요청 오라우팅
원인 ? 설정 변경
–
–
쿠버네티스에서는 kube-proxy 가 iptables 를 직접 다루므로 이 부분을 깊이 이해해야 한다. 네트워크 시험 중 패킷이 사라지면 어느 단계에서 문제가 생겼는지 하나씩 따져 봐야 하고, 그러려면 네트워킹이 어떤 단계를 거쳐 이루어지는지 확실히 알고 있어야 한다.
–