지난 주차에 이어서 대부분의 Flannel 코드를 돌아보게 되면서 스터디도 마무리 단계에 들어갔다.
이번에 맡은 부분은 Flannel CNI 플러그인이다!
CNI 플러그인이 왜 필요한지를 먼저 보기위해 다른 호스트에서 실행중인 두 개의 컨테이너가 통신할 때, 패킷의 경로를 복습해보자
1. 컨테이너 내부 (출발점)
컨테이너 A의 eth0 (예: 10.1.15.2)
↓
컨테이너 veth 인터페이스
---
2. 호스트 A 내부
veth 쌍의 다른 끝 (호스트 측)
↓
cni0 브릿지 (예: 10.1.15.1)
↓
flannel (VXLAN 인터페이스)
↓
호스트의 물리 네트워크 인터페이스 eth0
---
3. 네트워크 전송
호스트 A의 eth0 (예: 192.168.1.10)
↓
물리 네트워크 (VXLAN으로 캡슐화된 패킷)
↓
호스트 B의 eth0 (예: 192.168.1.11)
---
4. 호스트 B 내부
호스트 B의 eth0
↓
flannel (VXLAN 인터페이스에서 디캡슐화)
↓
cni0 브릿지 (예: 10.1.16.1)
↓
veth 쌍 (호스트 측)
---
5. 목적지 컨테이너
veth 쌍 (컨테이너 측)
↓
컨테이너 B의 eth0 (예: 10.1.16.3)
대강 이런 작업들을 직접! 해줘야하는데...
컨테이너가 호스트를 연결하기 위한 veth쌍 생성
호스트 내부에서 cni 브릿지 생성후 veth쌍들을 모두 연결
컨테이너 포트를 호스트 포트로 매핑
...
CNI 플러그인은 이런 작업들을 쉽게 할 수 있게 도와주는 라이브러리이다.
리드미를 읽어보면 Flannel은 호스트 내부의 네트워크 설정(컨테이너-호스트 간 연결)은 직접 하지 않는다. VXLAN을 통해 서로 다른 호스트간 통신할 수 있게 만들어주는게 핵심 역할이기 때문이다!
이는 아래 과정에서 VXLAN 인터페이스 구축에 해당한다.
2. 호스트 A 내부
veth 쌍의 다른 끝 (호스트 측)
↓
cni0 브릿지 (예: 10.1.15.1)
↓
flannel (VXLAN 인터페이스)
↓
호스트의 물리 네트워크 인터페이스 eth0
VXLAN 관련 코드에서 containernetworking/plugins을 활용하는 것을 볼 수 있는데 (vxlan/device.go)
containernetworking/plugins의 sysctl 유틸리티를 사용하여 커널 파라미터를 안전하게 수정하는 코드라고 한다.
마지막으로 claude를 통해서 해당 코드 이해를 도울 수 있도록 주석을 작성해보았다.
FYI: IPv6 라우터 광고(Router Advertisement, RA)란??
portmap 이란 CNI 플러그인을 기본으로 사용한다고 한다.