Docker CNI
- Docker에서 사용하는 CNI(Container Network Interface)는 컨테이너의 네트워크 설정과 관리를 담당하는 중요한 컴포넌트입니다.
- 이를 통해 컨테이너가 네트워크 상에서 서로 통신하고 외부 네트워크와 상호작용할 수 있게 됩니다. CNI는 특히 Kubernetes나 Docker Swarm과 같은 컨테이너 오케스트레이션 툴에서 중요한 역할을 합니다.
Docker CNI의 주요 개념
- CNI 플러그인
- CNI는 플러그인 구조로 되어 있어 다양한 네트워크 백엔드를 지원할 수 있습니다. CNI 플러그인은 컨테이너가 생성되거나 삭제될 때 호출되어 네트워크 설정을 수행합니다.
- 네트워크 플러그인은 네트워크 인터페이스를 추가하거나 삭제하고, IP 주소 할당, 라우팅 테이블 구성, 네트워크 정책 적용 등의 작업을 처리합니다.
- CNI 구성 파일
/etc/cni/net.d/
디렉토리에 CNI 설정 파일이 존재합니다. 이 설정 파일에는 사용하고자 하는 네트워크 플러그인과 관련된 설정이 포함되어 있습니다. 예를 들어, IPAM(IP Address Management) 설정이나 브리지 네트워크에 대한 구성 정보 등이 있습니다.
- IPAM (IP Address Management)
- CNI는 IP 주소 할당을 관리하는 IPAM 모듈을 사용합니다. 이 모듈은 각 컨테이너에 고유한 IP 주소를 할당하고, IP 주소 풀을 관리합니다.
- 여러 플러그인에서 IPAM을 구현할 수 있으며, 네트워크의 요구에 따라 동적 또는 정적으로 IP를 할당할 수 있습니다.
- 브리지 네트워크
- Docker에서 기본적으로 사용되는 네트워크 모드 중 하나는 브리지 모드입니다. 브리지 네트워크는 물리적인 네트워크와는 독립적인 가상 네트워크로, 컨테이너들이 서로 통신할 수 있게 해줍니다.
- CNI 플러그인을 통해 브리지 네트워크를 구성할 수 있으며, 이를 통해 여러 호스트에 분산된 컨테이너들이 네트워크 상에서 서로 연결될 수 있습니다.
- CNI 플러그인 예시
- bridge: 가장 기본적인 CNI 플러그인으로, 가상 브리지를 생성하고 해당 브리지를 통해 컨테이너들이 통신할 수 있게 합니다.
- host-local: 로컬 시스템에서 IP 주소를 관리하고, 각 컨테이너에 IP를 할당합니다.
- flannel, calico, weave: 복잡한 네트워크 요구 사항을 처리하는 데 사용되는 네트워크 플러그인으로, 특히 Kubernetes에서 자주 사용됩니다. 이 플러그인들은 컨테이너들이 클러스터 내에서 효율적으로 통신할 수 있도록 돕습니다.
- CNI와 Kubernetes
- Kubernetes는 컨테이너 네트워킹을 위해 CNI를 채택하고 있습니다. 각 노드에서 실행되는 컨테이너에 네트워크를 설정하기 위해 CNI 플러그인을 사용하며, 컨테이너 생성 시마다 CNI 플러그인이 호출되어 해당 네트워크 인터페이스를 설정합니다.
- 여러 네트워크 플러그인을 사용하여 Pod 간의 통신, 클러스터 외부와의 통신, 네트워크 정책을 제어할 수 있습니다.
CNI의 동작 과정
- 컨테이너 생성 요청 시 CNI 플러그인이 호출됩니다.
- 네트워크 플러그인은 새로운 네트워크 인터페이스(예: veth pair)를 컨테이너에 추가합니다.
- IPAM 모듈이 IP 주소를 할당하고, 네트워크 인터페이스에 해당 IP 주소가 설정됩니다.
- 라우팅 테이블 및 방화벽 규칙이 설정되어 컨테이너가 네트워크 상에서 통신할 수 있게 됩니다.
- 컨테이너가 삭제되면 CNI 플러그인이 다시 호출되어 네트워크 인터페이스가 제거되고 IP 주소가 반환됩니다.
Flannel vs Calico
- Flannel과 Calico는 Kubernetes 및 Docker 환경에서 자주 사용되는 CNI 플러그인으로, 컨테이너 간의 네트워크 연결을 관리하는 데 중요한 역할을 합니다. 두 플러그인은 네트워크 트래픽을 처리하는 방식에서 큰 차이가 있으며, 각각 고유한 장단점을 가지고 있습니다.
1. Flannel
Flannel은 Red Hat이 개발한 간단한 네트워크 플러그인으로, 주로 Overlay 네트워킹 방식을 사용하여 Kubernetes 클러스터 내의 Pod 간 통신을 지원합니다. Flannel은 비교적 설정이 간단하고, Kubernetes에서 기본적으로 많이 사용되는 네트워크 옵션 중 하나입니다.
1.1 동작 방식
- Flannel은 각 Kubernetes 노드에 가상 네트워크(Overlay Network)를 생성합니다. 노드 간 트래픽은 UDP, VXLAN, 혹은 AWS VPC 백엔드를 통해 캡슐화됩니다.
- 기본적으로 VXLAN을 사용하여 패킷을 캡슐화하고, 다른 노드에 있는 Pod와 통신할 때도 해당 캡슐화된 패킷을 통해 데이터를 전송합니다.
- 노드마다 고유한 서브넷을 할당받아 각 노드의 Pod들이 고유한 IP 주소 공간에서 운영됩니다.
1.2 장점
- 간단한 설정: Flannel은 설치 및 설정이 매우 간단하여, 네트워크 요구 사항이 복잡하지 않은 환경에서 적합합니다.
- 적은 리소스 사용: Flannel은 기본적으로 Overlay 네트워크만 관리하므로 시스템 리소스를 많이 소모하지 않습니다.
- 간단한 구조: 캡슐화를 사용하여 노드 간 트래픽을 처리하기 때문에, 복잡한 네트워크 설정 없이 쉽게 여러 노드 간의 통신을 가능하게 합니다.
1.3 단점
- 성능 저하: Flannel은 트래픽을 캡슐화(VXLAN, UDP 등)하기 때문에 네트워크 성능이 저하될 수 있습니다. 특히 고성능이 요구되는 환경에서는 이로 인해 성능 병목이 발생할 수 있습니다.
- 네트워크 정책 지원 부족: Flannel 자체는 네트워크 정책(Network Policy)을 지원하지 않습니다. 네트워크 보안 규칙이나 정책을 세부적으로 제어하기 위해서는 다른 도구와의 통합이 필요합니다.
2. Calico
- Calico는 네트워킹뿐만 아니라 네트워크 보안과 정책 관리를 중점적으로 제공하는 CNI 플러그인입니다. Calico는 기본적으로 라우팅 방식을 사용하여 Pod 간 트래픽을 관리하며, Overlay 네트워크가 아닌 L3 네트워크로 Pod 간 통신을 처리합니다. 또한, Calico는 네트워크 정책을 지원하여 세밀한 보안 제어를 할 수 있습니다.
2.1 동작 방식
- Calico는 기본적으로 BGP(Border Gateway Protocol)를 사용하여 노드 간의 경로를 설정하고, L3 라우팅을 통해 Pod 간의 트래픽을 관리합니다.
- Overlay 네트워크 방식이 아닌 순수한 라우팅 방식을 사용하므로 트래픽 캡슐화가 필요 없고, 트래픽이 네이티브 IP 패킷으로 전송됩니다.
- Calico는 네트워크 정책을 통해 Pod 간의 통신을 허용하거나 차단할 수 있는 세밀한 보안 정책을 설정할 수 있습니다. 이로 인해 네트워크 보안 관리가 강화됩니다.
2.2 장점
- 성능 우수: Calico는 캡슐화를 사용하지 않기 때문에 Flannel보다 더 높은 네트워크 성능을 제공합니다. 특히 고성능이 필요한 클러스터에서 성능 저하 없이 동작할 수 있습니다.
- 네트워크 정책 지원: Calico는 Kubernetes 네트워크 정책을 지원하며, 이를 통해 Pod 간의 통신을 세밀하게 제어하고 보안을 강화할 수 있습니다.
- 확장성: Calico는 클라우드 환경과 온프레미스 환경 모두에서 잘 동작하며, 확장성 측면에서 유리합니다. 또한, 큰 규모의 클러스터에서도 잘 운영됩니다.
- L3 네트워킹: Calico는 BGP를 통해 라우팅 테이블을 구성하여, 각 노드가 직접 트래픽을 라우팅하는 구조로 네트워크 효율성이 높습니다.
2.3 단점
- 복잡한 설정: Calico는 Flannel에 비해 설정이 다소 복잡할 수 있으며, 특히 네트워크 정책이나 BGP 설정을 처음 접하는 사용자에게는 다소 어려울 수 있습니다.
- 리소스 소모: Calico는 복잡한 네트워크 정책 관리 및 BGP 라우팅 기능을 제공하므로, Flannel에 비해 약간의 리소스 소모가 발생할 수 있습니다.
3. Flannel vs Calico 비교
항목 | Flannel | Calico |
---|---|---|
네트워킹 방식 | VXLAN, Overlay 네트워크 | L3 라우팅, BGP |
네트워크 성능 | 트래픽 캡슐화로 인해 성능 저하 | 높은 성능 (캡슐화 없음) |
네트워크 정책 | 기본적으로 지원하지 않음 | 세밀한 네트워크 정책 지원 |
설정 복잡도 | 간단함 | 상대적으로 복잡함 |
리소스 사용량 | 적음 | 네트워크 정책 및 라우팅 관리로 인해 조금 더 많음 |
확장성 | 중소형 클러스터에 적합 | 대형 클러스터에서도 유연하게 확장 가능 |
보안 | 기본 보안 지원 부족 | 강력한 보안 및 정책 설정 가능 |
요약
- Flannel은 간단하고 빠르게 클러스터 네트워킹을 구성할 수 있는 옵션으로, 성능 요구가 크지 않거나 네트워크 정책이 불필요한 작은 규모의 클러스터에 적합합니다.
- Calico는 고성능과 세밀한 네트워크 정책 관리가 필요한 대규모 클러스터에 적합합니다. 특히 보안이 중요한 환경에서는 Calico의 네트워크 정책 기능이 큰 장점입니다.
결론
Docker CNI는 컨테이너 네트워킹의 핵심 요소로서, 컨테이너가 외부 네트워크와 통신하거나 다른 컨테이너들과 상호작용할 수 있도록 돕습니다. CNI 플러그인을 통해 네트워크의 유연한 설정이 가능하며, 이를 통해 다양한 네트워크 요구 사항을 충족시킬 수 있습니다. Kubernetes 같은 오케스트레이션 툴에서 특히 중요한 역할을 하며, 플러그인 기반 구조로 다양한 네트워크 백엔드와 통합될 수 있습니다.
'Docker' 카테고리의 다른 글
macOS M1 Apple Chip Docker (0) | 2022.06.02 |
---|---|
Portainer.io (0) | 2020.02.24 |
Docker network 네트워크 (2) | 2019.07.26 |
Docker run 명령어 in AWS EC2 (0) | 2018.11.21 |
Docker AWS EC2 설치 (3) | 2018.11.20 |