본문 바로가기

쿠버네티스

[쿠버네티스] "도커 네트워크가 어렵나요?" Docker0와 CNI로 풀어보는 컨테이너 통신 원리

CNI ( Container Network Interface)

쿠버네티스 환경에 실무에 접하게 됐을 때 의외로 네트워킹 부분이 상당히 어렵고 학습하기 까다롭습니다. 대부분의 실무자들을 보면 Container의 Networking 자체를 이해하지 못해 어려움을 겪는 모습들을 많이 보았습니다.

해당 토픽에서는 컨테이너는 어떻게 네트워크 통신을 할까?라는 주제로 Docker 네트워크 구조를 바탕으로 쉽게 풀어보겠습니다.

 

Docker 플랫폼을 설치하게 되면 네트워크 인터페이스에 Docker0가 추가되며 가상의 NAT 네트워크를 생성하게 됩니다. 이때 모든 격리 수준의 어플리케이션들은 Docker0 네트워크에 배포되며 서로 네트워크 통신을 하게 됩니다.


도커가 실행될 때 리눅스 커널의 netfilter(iptables)에는 크게 두 가지 핵심 작업(Masquerading, DNAT)을 위한 규칙이 등록됩니다.

 

 

docker0로 들어가는 패킷은 Docker 체인 규칙 적용

컨테이너가 먼저 요청해서 돌아오는 응답 패킷(RELATED,ESTABLISHED)은 무조건 통과
docker0에서 나와서 외부로 가는 패킷(! -o docker0)은 통과-> 인터넷 접속 허용
docker0 안에서끼리 통신하는 패킷(-i docker0 -o docker0)도 통과 ->컨테이너 간 통신 허용

 


실제 NAT룰 셋을 보면 도커 데몬이 netfilter 제어 하여 라우팅 체인을 제어하였고, 등록되었습니다.

 

 

 

애플리케이션을 배포 하였고, Docker 대역대에 2번 IP와 3번 IP를 할당 받았습니다.

 

도커는 내부에 IPAM (IP Address Management) Driver를 내장하고 있습니다. 해당 드라이버를 사용해 미리 정의된 서브넷대역 내에서 사용 가능한 IP를 순차적으로 계산(Bitmap/List)하여 컨테이너 생성 시점에 즉시 주입해 Start 시 IP Range중 빈 IP 할당 종료 시 IP회수 작업을 반복하게 됩니다.

 

해당 CNI에 대한 개념은 이후 쿠버네티스의 Service ingress 등 네트워킹 개념을 이해할 때 선행되지 않으면 절대로

이해가 불가능합니다. 꼭 학습 후 넘어가시는 것을 추천드립니다.