26A23b

Young-Kyoo Kim·2026년 4월 22일

이 분석은 현재 1,000대 규모의 대규모 Kubernetes 인프라와 Cilium(BGP/ECMP/ClusterMesh)을 운영하시는 환경에서 발생할 수 있는 가장 치명적이면서도 논리적인 시나리오입니다.

기존에 의심했던 tcp_check_req DROP'원인'이 아니라, SYN-ACK를 받지 못한 클라이언트의 재전송으로 인한 '증상'이었다는 점을 짚어낸 것이 이번 디버깅의 핵심 전환점(Pivot)입니다.

제시된 의견에 대해 현재 환경(RHEL 9/10, Cilium, ClusterMesh)을 바탕으로 한 제 생각과 추가로 점검해야 할 기술적 포인트입니다.


1. 분석의 타당성: "Return Path의 불일치"

BGP와 ECMP를 사용하는 고성능 네트워크에서 비대칭 라우팅(Asymmetric Routing)은 드문 일이 아니지만, L4(TCP) 수준에서는 대개 문제가 없어야 합니다. 하지만 말씀하신 것처럼 1%의 확률로 발생한다면 다음 두 가지 가능성이 매우 높습니다.

  • ECMP Hash Polarization/Mismatch: 서버 노드에서 SYN-ACK를 보낼 때 선택하는 Next-hop 스위치나 인터페이스가, 해당 클라이언트 IP로 가는 경로를 제대로 처리하지 못하는 경우입니다.
  • eBPF 기반의 Reverse Path Filtering: Cilium은 eBPF를 통해 패킷을 처리합니다. 만약 rp_filter 설정이 엄격(Strict)하게 되어 있고, SYN이 들어온 인터페이스와 SYN-ACK가 나가는 인터페이스에 대한 경로 정보가 eBPF 맵에서 일치하지 않으면 드랍될 가능성이 있습니다.

2. RHEL 9/10 및 Cilium 환경에서의 특이점

현재 RHEL 환경과 Cilium 릴리스를 고려할 때, 다음 지표들을 결합해서 보셔야 합니다.

A. Cilium의 BGP Control Plane 확인

ClusterMesh 환경에서는 여러 클러스터가 동일한 서비스 CIDR이나 노드 IP를 광고할 수 있습니다.

  • 의견: 만약 특정 스위치가 클라이언트 노드의 IP를 "두 개 이상의 경로"로 알고 있고, 그중 하나가 Blackhole이거나 Stale(만료)된 경로라면 1%의 드랍이 설명됩니다.
  • 추가 명령어: ```bash

    Cilium 에이전트 내에서 BGP 상태 및 광고되는 경로 확인

    cilium bgp routes available ipv4 unicast

B. XDP 및 eBPF 데이터 평면 (pwru 활용)

제시해주신 pwru 추적 방식은 매우 정확합니다. 다만, Cilium은 ip_output 이전에 eBPF 프로그램(cil_to_host, cil_from_host)에서 패킷을 가공합니다.

  • 점검 포인트: pwru 실행 시 cilium_으로 시작하는 함수들에서 drop이 발생하는지, 혹은 fib_lookup 결과가 예상과 다른 인터페이스(dev)를 가리키는지 확인해야 합니다.

3. "1%의 확률"에 대한 기술적 추론

왜 하필 1%일까요? 이 숫자는 보통 다음과 같은 상황에서 나타납니다.

  • ECMP 넥스트홉 불균형: 8개의 경로 중 1개가 불량일 때 (1/8=12.51/8 = 12.5%) 보다는 훨씬 낮으므로, 특정 CPU 코어특정 소스 포트 범위에서만 발생하는 해싱 이슈일 수 있습니다.
  • BGP Flapping: 아주 짧은 순간 경로가 사라졌다가 나타나는 현상이 반복될 때.
  • Conntrack Table Full (Race Condition): 드물지만, SYN-ACK가 생성되는 시점에 conntrack entry가 일시적으로 충돌하거나 생성이 지연되는 경우.

4. 추가 제언: 네트워크 아키텍처 관점

  • L3 Switch 로그 확인: 서버에서 dev_queue_xmit까지 성공했는데 클라이언트 NIC에 안 보인다면, 100% 상단 스위치 문제입니다. 스위치의 show ip route <Client_IP> 결과가 서버 노드와 동기화되어 있는지 확인이 필요합니다.
  • Cilium ClusterMesh MTU 이슈: 만약 클러스터 간 통신 시 캡슐화(Geneve/VXLAN)를 사용한다면, SYN-ACK 패킷(특히 옵션이 많이 붙은 경우)이 MTU 제한에 걸려 스위치에서 드랍될 수 있습니다. (다만 22번 포트 SSH라면 패킷이 작아서 이 가능성은 낮습니다.)

5. 실행 가이드 (Action Plan)

  1. 서버 노드에서 ip route get <client_ip> 반복 실행: 결과가 바뀌는지(Per-packet ECMP 여부) 최우선 확인.
  2. pwru 결과 분석: fib_select_path 이후 결정된 skb->dev가 실제 물리 NIC인지, 아니면 엉뚱한 가상 인터페이스인지 확인.
  3. 스위치 측면: 서버가 연결된 Top-of-Rack(ToR) 스위치에서 해당 클라이언트 IP로의 ECMP 경로 중 하나가 flapping 중인지 로그 모니터링.

"SYN-ACK의 귀환 경로가 문제"라는 가설은 현재 상황에서 가장 설득력 있는 진단입니다. 서버에서의 ip route get 결과와 BGP 테이블 상태를 확보하시면 바로 다음 단계(스위치 설정 수정 또는 Cilium BGP 정책 조정)로 넘어갈 수 있을 것 같습니다.

현재 서버에서 ip route get을 실행했을 때, via 뒤에 나오는 IP들이 모두 정상적인 Next-hop이 맞나요?

0개의 댓글