
본 문서는 FlannelCNI 기반으로 구축된 온프레미스 클러스터에서
FlannelCNI가 무엇이고 어떻게 구성되며 어떤 결과를 만드는지를 다룹니다.
이미 파드 - 파드 || 서비스 || 헤드리스 서비스 간의 통신 경로를 다뤘으며,
아래 문서의 내용을 숙지한 상태임을 전제하고 설명을 진행하겠습ㄴ디ㅏ.
쿠버네티스 네트워크 흐름에 대한 이해 (1/2) (Flannel CNI) [1]
A. FlannelCNI
A.0. 사전 지식
Kubernetes Default Network 구조에서는
노드가 N개 존재할때 임의의 파드 2개가 같은 IP를 가질 수 있습니다.
이 경우에 파드 간 통신에서 예측 불가능한 문제가 생길 수 있습니다.
이 문제를 해결하기 위해서는 별도의 가상 네트워크 구현체가 필요합니다.
CNCF 재단에서는 CNI*라는 구현체를 통해서 이런 문제를 해결하고 있습니다.
A.1. CNI 개념
CNCF는 오픈소스 간 호환성 강화를 위해 표준 인터페이스를 안내하고 있습니다.
CNI*는 Container Network Interface의 약자로서 특정한 인터페이스와 필수 요구사항들을 정의하고 있습니다.
CNCF CNI 표준을 준수해서 만들어진 친구들은 높은 수준의 이식성을 보여줍니다.
(docker, containerd, rkt, mesos, kubernetes 등)
CNI는 대표적으로 8단계로 구성되어 있습니다.
단계 | 제목 | ||
---|---|---|---|
1 | Create Network Namespace | ||
2 | Create Bridge Network/Interface | ||
3 | Crete VETH Pair (Pipe, Virtual Cable) | ||
4 | Attach vEth to Namespace | ||
5 | Attach Other vEth to Bridge | ||
6 | Assign IP Addresses | ||
7 | Bring the interfaces up | ||
8 | Enable NAT - IP Masquerade |
이를 이해하기 위해서는 몇가지 네트워크 레벨의 지식이 필요합니다.
Bridge : 가상 스위치(router)를 통해서 여러 네트워크 인터페이스를 연결
VXLAN : 하나의 물리 네트워크를 논리적으로 여러개로 분할
IPVLAN : 물리 NIC의 MAC을 공유하되 IP만 다르게 사용하는 방식
MACVLAN : 각 인터페이스가 고유한 MAC 주소를 가지느 방식
WINDOWS : Windows OS 전용 네트워크 플러그인
DHCP : IP 주소를 동적으로 할당해주는 방식
host-local : 로컬 파일 기반으로 IP를 직접 관리하고 할당하는 방식
A.2. FlannelCNI
1편 [A.2-1]에서 (단일 호스트) 네트워크 흐름은 Bridge(cni0)를 지남을 알았습니다.
파드 - 파드 통신 (IP 기반)
파드 - 서비스 통신
파드 - 헤드리스 서비스 통신
하지만 (멀티 호스트) 네트워크 흐름은 VTEP(flannel.1), Ethernet Interface(eth0)+VNI, VXLAN/UDP Transport을 지나게 됩니다.
네트워크 레벨에서 조금 자세하게 살펴보면 다음과 같습니다.
VXLAN/UDP Transport
UDP Protocol의 인캡슐레이션/디캡슐레이션 과정을 따릅니다.
이 과정에서 VTEP(flannel.1)을 통과하게 되며, 목적지인 VTEP을 식별하기 위해서 VNI, VTepMAC 등을 활용하게 됩니다.
VNI, VTepMAC은 각 노드 설정에서 아래처럼 쉽게 확인이 가능합니다.
kubectl get node -o yaml | grep VtepMAC
flannel.alpha.coreos.com/backend-data: '{"VNI":1,"VtepMAC":"5a:af:f7:71:f8:e9"}'
VNI(VTepMAC)
VTEP이 포함된 노드의 물리적 서버(혹은 VM)의 MaC 주소
VTEP(flannel.1)
VTEP(VXLAN Tunenl End-Point 또는 Virtual Tunnel End-Point)원본 이더넷 통신을 캡슐화/디캡슐화 작업을 수행
VTEP은 VXLAN으로 연결된 Remote VTEP을 발견하고 연결하는 과정을 통해
IP 네트워크 전체를 하나의 거대한 Layer 2 논리적 토폴로지로 연결결과적으로 네트워크 통신 자체는 VXLAN(UDP, Layer 4)에서 진행
💡
동일한 네트워크에 멀티 호스트가 존재할 경우, 해당 네트워크의 IP 중 하나를 각 호스트의 Ethernet Interface가 할당받는다. (만약 Wi-Fi[WLAN, Wireless LAN]이라면 WiFi Private IP가 있을 것)
A.3. 정리
단일 호스트 내부 파드 간 통신에서는 Bridge(cni0) 기반의 통신을 진행한다.
복수 호스트의 파드 간 통신에서는 VXLAN 기반의 터널링 방식을 사용하며,
VTEP(VXLAN Tunnel Endpoint) 인터페이스인 flannel.1을 통해 캡슐화/디캡슐화가 이루어지며,
물리 인터페이스인 eth0을 통해서 UDP 기반의 전송이 이루어집니다.
참고 문서
T Story (네트워크&파이썬) - VXLAN (Virtual eXtention LAN) 네트워크 모델 (feat. VTEP & VNI)
Medium (Chandra Rai) - Understanding Kubernetes CNI Flannel Plugin with UDP Backend
Medium (Addo Zhang) - Learning Kubernetes VXLAN Network with Flannel
Youtube (KodeKloud) - Container Network Interface (CNI) Explained in 7 Minutes
Youtube (CNCF) - Tutorial: From CNI Zero to CNI Hero: A Kubernetes Networking Using CNI