OVN-Kubernetes EgressIP가 보조 NIC로 나가지 않을 때 보는 라우팅 기준

RHOCP/OVN-Kubernetes에서 EgressIP는 잡혔지만 실제 송신이 기본망으로 나가는 상황을 source policy routing과 tcpdump로 확인하는 절차입니다.

OVN-Kubernetes EgressIP를 보조 NIC 대역으로 쓰려면 "EgressIP가 생성됐다"와 "패킷이 그 NIC로 나간다"를 구분해야 합니다. EgressIP 리소스가 정상이어도 source 기반 라우팅이 없으면 패킷이 기존 default route로 나갈 수 있습니다.

1. NIC와 route를 먼저 확인한다

ip addr show br-ex
ip addr show bond-egress
ip route

2. EgressIP 대상 노드와 namespace를 라벨로 묶는다

oc label node <worker-node> k8s.ovn.org/egress-assignable=
oc get nodes --show-labels | grep egress-assignable

oc label ns <namespace> egress=secondary
oc get ns --show-labels | grep egress=secondary

3. EgressIP는 /32 VIP로 보이는 것이 정상이다

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: egress-secondary
spec:
  egressIPs:
    - 10.108.0.50
  namespaceSelector:
    matchLabels:
      egress: secondary
oc apply -f egress-secondary.yaml
oc get egressip -o wide
ip addr show br-ex | grep 10.108.0.50

4. source policy routing으로 송신 NIC를 고정한다

echo "108 egress108" >> /etc/iproute2/rt_tables
ip rule del from 10.108.0.50/32 table egress108 2>/dev/null || true
ip route flush table egress108 2>/dev/null || true
ip rule add from 10.108.0.50/32 table egress108 priority 1080
ip route add 10.108.0.0/24 dev bond-egress src 10.108.0.50 table egress108
ip route add default via 10.108.0.1 dev bond-egress table egress108
ip route get 8.8.8.8 from 10.108.0.50

5. tcpdump와 Pod 테스트로 증명한다

tcpdump -ni bond-egress host 8.8.8.8
tcpdump -ni bond-egress arp
conntrack -L | grep 10.108.0.50

oc run egress-test \
  --image=registry.access.redhat.com/ubi9/ubi \
  -n <namespace> \
  -it --rm -- bash

curl -s https://ifconfig.me

정리

OVN-Kubernetes EgressIP 장애는 리소스 생성 여부만 보면 안 됩니다. 노드 라벨, namespaceSelector, /32 VIP 표시, source policy routing, 보조 NIC tcpdump, Pod 외부 IP 확인을 한 줄로 연결해야 합니다.

BGM EVER