Pod 간 노드 통신 패킷 흐름
k8s 에서는 Pod to Pod cross-node 통신은 결국 cni가 만든 가상 네트워크 + 커널 라우팅 + cni가 심어둔 iptables/ipvs 규칙을 따라간다.
Flannel/VXLAN, Calico, Cilium 모두 공통적으로 적용되는 베이스 흐름을 알아보자.
패킷 흐름 전체 요약은
pod A -> veth -> Node1 커널 -> CNI 라우팅 -> Node2 NodeIP -> Node2 커널 -> veth -> Pod B
Pod eth0(veth pair한쪽)에서 패킷이 나오게 된다 목적지는 같은 상대 pod ip(ex. 10.244.2.15)
pod vetth -> node veth로의 전달은 veth pair 이고 pod쪽은 eth0, node는 vethXXXX.
Pod에서 나오는 패킷은 그대로 노드의 네임스페이스의 vethXXX로 전달된다. 이건 리눅스 커널 수준에서 자동
Node 커널에서 라우팅 테이블을 확인해 노드에 cni 플러그인 정보를 쓴다.
# ex flannel
10.244.1.0/24 via 192.168.1.12 dev flannel.1
10.244.2.0/24 via 192.168.1.13 dev flannel.1
# ex Calico, BGP
10.244.2.0/24 via 192.168.1.13 dev enp1s0
Node 커널은 목적지 pod ip가 로컬 노드 소유인지 다른 노드 소유인지 경로에서 확인한다.
목적지가 다른 노드면 CNI Overlay or Routing 동작을 한다. 기술별로 여기서 갈리는데
Flannel VXLAN: Node1에서 Node2로 패킷을 VXLAN encapsulation(UDP 8472) 하고 보낸다
Pod → veth → Node1 → flannel0 → VXLAN encapsulate → Node2.IP 로 UDP 패킷 전송
Calico(BGP/no-overlay): Node의 루팅 테이블에서 10.244.2.0/24 -> Node2.IP 이렇게 바로 잡혀있다.
VXLAN없이 바로 L3 라우팅을 하는것
Pod → veth → Node1 → enp1s0 → Node2.IP 목적지로 전송
Cilium(eBPF): iptables를 거의 쓰지않고 eBPF XDP/TC Hook에서 바로 라우팅 규칙 적용한다.
VXLAN, Geneve, or direct routing 등 구성에 따라 다르다.
Node2에 도착하게 되면 커널이 패킷을 처리하게 된다 Node2는 자신의 pod cidr을 알고있고 패킷을 노드2가 받아 목적지 파드를 찾는다.
Node2의 veth로 전달 -> PodB 도착
목적지 10.244.2.15 → vethABCD → Pod B
그림으로 모든 과정을 단순화하면
[Pod A]
↓ (veth)
[Node1 커널]
↓ (CNI 라우트)
[Node1 → Node2 전송] ← VXLAN or BGP or Geneve
↓
[Node2 커널]
↓ (veth)
[Pod B]
iptables/ipvs/eBPF 관여 지점 #
pod to pod 직접 통신은 service를 거치지 않으면 거의 iptables/ipvs를 타지 않는다.
하지만 만약 clusterip로 접근할 경우
iptables(kube proxy) service -> endponits -> pod로 DNAT을 수행한다. 연결 추적(conntrack) 사용
ipvs모드면 l4로드밸런서처럼 동작하며 conntrack 최소화 DR TUN NAT 모드가 존재한다.
eBPF 모드 (Cilium): iptables도 안 쓰고 conntrack도 자체 BPF conntrack을 사용한다.
커널 단에서 바로 Service LB 수행한다.
| CNI | cross-node 방식 | 특징 |
|---|---|---|
| Flannel | VXLAN | 가장 단순한 overlay |
| Calico | BGP 라우팅 (no-overlay) or VXLAN | L3 루팅 깔끔 |
| Cilium | eBPF + VXLAN/Geneve/direct-routing | 가장 빠름, iptables 없음 |
| Weave | overlay mesh | 성능 낮음, 요즘 거의 안 씀 |
Node 간 통신이 가능한 이유 #
각 Node는 자신이 가진 pod cidr를 가지고 있고 cni가 노드간 긴 라우팅 테이블을 자동으로 맞춘다.
커널이 목적지 파드 아이피를 보면 어느 node인지 알아내고 overlay또는 l3라우팅을 통해 크로스 노드 전송한다.
즉 pod to pod 통신은
- cni가 veth, cidr을 준비하고
- node가 커널 라우팅이 cross-node path를 알고
- overlay or direct routing 으로 전송함.
위 3가지로 이루어져있다