이 분석은 현재 1,000대 규모의 대규모 Kubernetes 인프라와 Cilium(BGP/ECMP/ClusterMesh)을 운영하시는 환경에서 발생할 수 있는 가장 치명적이면서도 논리적인 시나리오입니다.
기존에 의심했던 tcp_check_req DROP이 '원인'이 아니라, SYN-ACK를 받지 못한 클라이언트의 재전송으로 인한 '증상'이었다는 점을 짚어낸 것이 이번 디버깅의 핵심 전환점(Pivot)입니다.
제시된 의견에 대해 현재 환경(RHEL 9/10, Cilium, ClusterMesh)을 바탕으로 한 제 생각과 추가로 점검해야 할 기술적 포인트입니다.
BGP와 ECMP를 사용하는 고성능 네트워크에서 비대칭 라우팅(Asymmetric Routing)은 드문 일이 아니지만, L4(TCP) 수준에서는 대개 문제가 없어야 합니다. 하지만 말씀하신 것처럼 1%의 확률로 발생한다면 다음 두 가지 가능성이 매우 높습니다.
rp_filter 설정이 엄격(Strict)하게 되어 있고, SYN이 들어온 인터페이스와 SYN-ACK가 나가는 인터페이스에 대한 경로 정보가 eBPF 맵에서 일치하지 않으면 드랍될 가능성이 있습니다.현재 RHEL 환경과 Cilium 릴리스를 고려할 때, 다음 지표들을 결합해서 보셔야 합니다.
ClusterMesh 환경에서는 여러 클러스터가 동일한 서비스 CIDR이나 노드 IP를 광고할 수 있습니다.
Blackhole이거나 Stale(만료)된 경로라면 1%의 드랍이 설명됩니다.제시해주신 pwru 추적 방식은 매우 정확합니다. 다만, Cilium은 ip_output 이전에 eBPF 프로그램(cil_to_host, cil_from_host)에서 패킷을 가공합니다.
pwru 실행 시 cilium_으로 시작하는 함수들에서 drop이 발생하는지, 혹은 fib_lookup 결과가 예상과 다른 인터페이스(dev)를 가리키는지 확인해야 합니다.왜 하필 1%일까요? 이 숫자는 보통 다음과 같은 상황에서 나타납니다.
dev_queue_xmit까지 성공했는데 클라이언트 NIC에 안 보인다면, 100% 상단 스위치 문제입니다. 스위치의 show ip route <Client_IP> 결과가 서버 노드와 동기화되어 있는지 확인이 필요합니다.ip route get <client_ip> 반복 실행: 결과가 바뀌는지(Per-packet ECMP 여부) 최우선 확인.pwru 결과 분석: fib_select_path 이후 결정된 skb->dev가 실제 물리 NIC인지, 아니면 엉뚱한 가상 인터페이스인지 확인."SYN-ACK의 귀환 경로가 문제"라는 가설은 현재 상황에서 가장 설득력 있는 진단입니다. 서버에서의 ip route get 결과와 BGP 테이블 상태를 확보하시면 바로 다음 단계(스위치 설정 수정 또는 Cilium BGP 정책 조정)로 넘어갈 수 있을 것 같습니다.
현재 서버에서 ip route get을 실행했을 때, via 뒤에 나오는 IP들이 모두 정상적인 Next-hop이 맞나요?