Overlay Network
Encapsulation VXLAN 모드로 Pod 간 통신 문제 해결 실습
VXLAN 설정 변경
grep -E 'CONFIG_VXLAN=y|CONFIG_VXLAN=m|CONFIG_GENEVE=y|CONFIG_GENEVE=m|CONFIG_FIB_RULES=y' /boot/config-$(uname -r)
CONFIG_FIB_RULES=y # 커널에 내장됨
CONFIG_VXLAN=m # 모듈로 컴파일됨 → 커널에 로드해서 사용
CONFIG_GENEVE=m # 모듈로 컴파일됨 → 커널에 로드해서 사용
# 커널 로드
lsmod | grep -E 'vxlan|geneve'
modprobe vxlan # modprobe geneve
lsmod | grep -E 'vxlan|geneve'
for i in w1 w0 ; do echo ">> node : k8s-$i <<"; sshpass -p 'vagrant' ssh vagrant@k8s-$i sudo modprobe vxlan ; echo; done
for i in w1 w0 ; do echo ">> node : k8s-$i <<"; sshpass -p 'vagrant' ssh vagrant@k8s-$i sudo lsmod | grep -E 'vxlan|geneve' ; echo; done
# k8s-w1 노드에 배포된 webpod 파드 IP 지정
export WEBPOD1=$(kubectl get pod -l app=webpod --field-selector spec.nodeName=k8s-w1 -o jsonpath='{.items[0].status.podIP}')
echo $WEBPOD1
# 반복 ping 실행해두기
kubectl exec -it curl-pod -- ping $WEBPOD1
# 업그레이드
helm upgrade cilium cilium/cilium --namespace kube-system --version 1.18.0 --reuse-values \
--set routingMode=tunnel --set tunnelProtocol=vxlan \
--set autoDirectNodeRoutes=false --set installNoConntrackIptablesRules=false
kubectl rollout restart -n kube-system ds/cilium
설정 변경 확인
cilium features status | grep datapath_network
kubectl exec -it -n kube-system ds/cilium -- cilium status | grep ^Routing
cilium config view | grep tunnel

설정을 완료하고 나면 못 보던 인터페이스가 생성된다.
ip -c addr show dev cilium_vxlan

이 인터페이스를 통해서 Outer Header를 감싸는 역할 (Encapsulation)을 수행한다.
k8s-ctr 노드에서 라우팅 테이블을 확인해보면
ip -c route


기존 Native Routing 모드와 비교해보면,
우선 172.20.1.0/24 대역이 기존에는 router 노드를 통했는데, 지금은 172.20.0.121 dev cilium_host를 통하도록 변경됐다.
172.20.2.0/24 대역에 대한 라우팅 정보는 없었는데 VXLAN 모드에서는 추가가 됐다.
ip route get 172.20.1.10
ip route get 172.20.2.10

실제로 어디를 타고 나가는지 확인해보면 위 스크린샷 처럼 나온다.
그러면 실제로 타고 나가는 172.20.0.121 은 무슨 IP 인가?
export CILIUMPOD0=$(kubectl get -l k8s-app=cilium pods -n kube-system --field-selector spec.nodeName=k8s-ctr -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it $CILIUMPOD0 -n kube-system -c cilium-agent -- cilium status --all-addresses | grep router
cilium pod 이름을 지정하고 router pod를 출력하면 k8s-ctr 노드에 있는 router pod의 IP를 출력한다.

Pod간 통신확인
kubectl exec -it curl-pod -- sh -c 'while true; do curl -s --connect-timeout 1 webpod | grep Hostname; echo "---" ; sleep 1; done'

서로 다른 3개의 pod Name이 출력된다. 즉 3개의 노드에 있는 모든 webpod와 통신이 된 것이다.
'DevOps > cilium' 카테고리의 다른 글
| [Cilium Study] BGP Control Plane (2) | 2025.08.16 |
|---|---|
| [Cilium Study] Pod간 통신 & k8s 외부 노출 4 (4) | 2025.08.10 |
| [Cilium Study] Pod간 통신 & k8s 외부 노출 2 (0) | 2025.08.09 |
| [Cilium Study] Pod간 통신 & k8s 외부 노출 1 (1) | 2025.08.09 |
| [Cilium Study] CoreDNS, LocalNodeDNS (3) | 2025.08.03 |