Egress Gateway 고급 트러블슈팅
Egress Gateway 고급 트러블슈팅 (Advanced Troubleshooting)
이 문서는 egress-gateway를 사용하면서 사용자가 겪을 수 있는 다양한 문제를 설명해요. 특히 SNAT 연결 한도와 관련된 증상과 해결 방법을 다뤄요.
본문
이 문서는 egress-gateway를 사용하면서 사용자가 겪을 수 있는 다양한 문제를 설명해요.
SNAT 연결 한도 (SNAT Connection Limits)
egress-gateway가 소수의 원격 엔드포인트 집합으로 가는 트래픽을 마스커레이드하는 사용 사례에서는, Cilium의 NAT 매핑이 원격 엔드포인트당 할당할 수 있는 최대 소스 IP 수를 초과해 문제가 생길 수 있어요. 이는 기존 연결에 문제를 일으킬 수 있는데, 새 연결을 수용하기 위해 기존 연결이 자동으로 퇴거(evict)되기 때문이에요.
예제 시나리오 (Example Scenario)
Cilium의 egress-gateway를 사용하는 Kubernetes 클러스터가 있고, 방화벽 뒤에 있는 주소 10.2.0.0:8080의 서버로 가는 외부 연결을 마스커레이드하는 데 egress-IP 10.1.0.0이 사용되도록 정책이 구성되어 있다고 상상해 보세요.
방화벽은 소스 IP 10.1.0.0과 일치하는 연결만 통과시켜요. 클러스터의 많은 클라이언트가 {egress-IP, remote endpoint IP, remote endpoint Port} => {10.1.0.0, 10.2.0.0, 8080} 같은 튜플로 백엔드 서버에 연결할 거예요. 이 연결들은 같은 소스 IP와 목적지 IP·포트를 갖게 돼요. Cilium의 데이터 경로에서 이 목적지로 가는 각 연결은 고유한 소스 포트를 사용해 매핑돼요.
egress-gateway 노드를 통해 너무 많은 연결이 이루어지면 Cilium의 SNAT 맵이 용량에 도달할 수 있고, 그 결과 기존 연결이 추적되지 않아 연결성 문제가 발생해요.
한도는 최대 NAT 노드 포트 값(65535)과 --node-port-range의 상한(기본값: 32767)의 차이와 같아요. 기본적으로 egress-gateway 노드는 같은 egress IP를 사용해 공통 원격 엔드포인트 주소로 65535 - 32767 = 32768개의 가능한 연결을 처리할 수 있어요.
SNAT 포트 매핑 사용률이 높아지면 Cilium의 SNAT 매핑이 마스커레이드 SNAT에 사용할 소스 포트를 찾지 못해 egress-gateway 연결 실패로 이어질 수도 있어요.
Cilium agent는 상위 30개의 연결 튜플에 대한 통계를 저장하는데, 이는 cilium agent 컨테이너 안에서 cilium-dbg 유틸리티로 접근할 수 있어요.
$ kubectl -n kube-system exec ds/cilium -- cilium-dbg shell -- db/show nat-stats
# IPFamily Proto EgressIP RemoteAddr Count
ipv4 TCP 10.244.1.160 10.244.3.174:4240 1
ipv4 ICMP 172.18.0.2 172.18.0.3 1
ipv4 TCP 172.18.0.2 172.18.0.3:4240 1
ipv4 TCP 172.18.0.2 172.18.0.4:6443 50
ipv4 TCP 172.18.0.2 104.198.14.52:443 294
ipv6 ICMPv6 [fc00:c111::2] [fc00:c111::3] 1
ipv6 TCP [fd00:10:244:1::ec5d] [fd00:10:244:3::730c]:4240 1
ipv6 TCP [fd00:10:244:1::ec5d] [fd00:10:244::915]:4240 1
Note: 이 통계는 기본적으로 30초마다 다시 계산돼요. 따라서 새 연결이 발생한 시점과 통계가 갱신되는 시점 사이에는 지연이 있어요.
하나 이상의 행에서 아주 큰 연결 수(즉, 기본 연결 한도 32768에 근접)를 관찰한다면, SNAT 연결 오버플로 문제를 나타낼 수 있어요.
이 문제는 Cilium의 Egress Gateway 기능의 하드 한도에 도달한 결과이므로, 유일한 해결책은 egress-gateway를 통해 SNAT되는 연결 수를 줄이는 것이에요. 클라이언트가 새 연결을 너무 많이 만들지 않도록 하거나, 서로 다른 egress IP 및/또는 원격 엔드포인트 주소로 트래픽을 분산해서 같은 원격 주소(공통 egress IP)로 가는 연결 수를 줄이면 돼요.
SNAT 소스 포트 사용률에 대한 경고와 관찰 가능성은 Cilium Agent의 최고 포화도(사용 가능한 최대값의 백분율)를 추적하는 NAT endpoint max connection 메트릭을 참고하세요.