[Flannel 오픈소스 파헤치기 #06 ] - CNI plugin

Jisu·2024년 12월 20일
0

Network

목록 보기
7/7
post-thumbnail

배경

지난 주차에 이어서 대부분의 Flannel 코드를 돌아보게 되면서 스터디도 마무리 단계에 들어갔다.

이번에 맡은 부분은 Flannel CNI 플러그인이다!

CNI plugin

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)

대강 이런 작업들을 직접! 해줘야하는데...

  1. 컨테이너가 호스트를 연결하기 위한 veth쌍 생성

  2. 호스트 내부에서 cni 브릿지 생성후 veth쌍들을 모두 연결

  3. 컨테이너 포트를 호스트 포트로 매핑

...

CNI 플러그인은 이런 작업들을 쉽게 할 수 있게 도와주는 라이브러리이다.


Flannel에서 사용하는 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)란??

  • 라우터가 자신의 존재와 네트워크 정보를 알리는 메시지
    새로운 기기가 네트워크에 연결되면, 라우터가 주기적으로 이 정보를 알리는 것을 광고라고 한다. (마케팅 용어가 아니다!!! )

See Also

portmap 이란 CNI 플러그인을 기본으로 사용한다고 한다.


Appendix

containernetworking/plugins
flannel-io/plugins

profile
비즈니스에 관심많은 DevOps Engineer 장지수입니다.

0개의 댓글

관련 채용 정보