CNCF(Cloud Native Computing Foundation)의 프로젝트 중 하나인 CNI는 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준입니다.
다양한 형태의 컨테이너 런타임과 오케스트레이터 사이의 네트워크 계층을 구현하는 방식이 다양하게 분리되어 각자만의 방식으로 발전하게 되는 것을 방지하고 공통된 인터페이스를 제공하기 만들어 졌습니다.
쿠버네티스에서는 Pod 간의 통신을 위해서 CNI 를 사용합니다.
쿠버네티스는 기본적으로 'kubenet' 이라는 자체적인 CNI 플러그인을 제공하지만 네트워크 기능이 매우 제한적인 단점이 있습니다.
예를들어, 위 그림과 같이 컨테이너 기반으로 동작하는 애플리케이션에 Web UI 컨테이너, Login 컨테이너, 장바구니 Cart 컨테이너 이렇게 멀티 호스트로 구성되어 있습니다.
UI 컨테이너(172.17.0.2
) 에서 Login 컨테이너(172.17.0.2
) 로 통신을 하기 위해 트래픽을 보낸다고 가정합니다.
정상적인 통신 패턴이라면 UI 컨테이너는 veth0 인터페이스를 통해 docker0 라는 브릿지 인터페이스를 타고 NAT처리 되어 worker node #1의 물리 인터페이스인 ens160의 IP(10.200.155.22
) 로 나갑니다.
그 후, worker node #2 의 물리 인터페이스인 ens160 (10.200.155.23
) 으로 들어와 docker0 브릿지 인터페이스를 통해 Login 컨테이너의 veth0으로 들어옵니다.
그러나 위 그림에서 보듯이, 두 컨테이너의 IP는 동일하기 때문에 UI 컨테이너에서 Login 컨테이너로 통신을 시도하면 자기 자신인 UI 컨테이너 로컬로 통신을 시도 할 것입니다.
위와 같은 멀티 호스트로 구성되어 있는 컨테이너 끼리 통신을 하기 위해서는 CNI가 반드시 설치되어 있어야 합니다.
CNI는 Calico, Weavenet, AWS CNI 등 매우 다양한 종류가 있습니다.
https://skstp35.tistory.com/227
https://ssup2.github.io/theory_analysis/IPIP_GRE_Tunneling/