Docker

Docker CNI

김 정출 2024. 10. 18. 23:16

Docker CNI

  • Docker에서 사용하는 CNI(Container Network Interface)는 컨테이너의 네트워크 설정과 관리를 담당하는 중요한 컴포넌트입니다.
  • 이를 통해 컨테이너가 네트워크 상에서 서로 통신하고 외부 네트워크와 상호작용할 수 있게 됩니다. CNI는 특히 Kubernetes나 Docker Swarm과 같은 컨테이너 오케스트레이션 툴에서 중요한 역할을 합니다.

Docker CNI의 주요 개념

  1. CNI 플러그인
    • CNI는 플러그인 구조로 되어 있어 다양한 네트워크 백엔드를 지원할 수 있습니다. CNI 플러그인은 컨테이너가 생성되거나 삭제될 때 호출되어 네트워크 설정을 수행합니다.
    • 네트워크 플러그인은 네트워크 인터페이스를 추가하거나 삭제하고, IP 주소 할당, 라우팅 테이블 구성, 네트워크 정책 적용 등의 작업을 처리합니다.
  2. CNI 구성 파일
    • /etc/cni/net.d/ 디렉토리에 CNI 설정 파일이 존재합니다. 이 설정 파일에는 사용하고자 하는 네트워크 플러그인과 관련된 설정이 포함되어 있습니다. 예를 들어, IPAM(IP Address Management) 설정이나 브리지 네트워크에 대한 구성 정보 등이 있습니다.
  3. IPAM (IP Address Management)
    • CNI는 IP 주소 할당을 관리하는 IPAM 모듈을 사용합니다. 이 모듈은 각 컨테이너에 고유한 IP 주소를 할당하고, IP 주소 풀을 관리합니다.
    • 여러 플러그인에서 IPAM을 구현할 수 있으며, 네트워크의 요구에 따라 동적 또는 정적으로 IP를 할당할 수 있습니다.
  4. 브리지 네트워크
    • Docker에서 기본적으로 사용되는 네트워크 모드 중 하나는 브리지 모드입니다. 브리지 네트워크는 물리적인 네트워크와는 독립적인 가상 네트워크로, 컨테이너들이 서로 통신할 수 있게 해줍니다.
    • CNI 플러그인을 통해 브리지 네트워크를 구성할 수 있으며, 이를 통해 여러 호스트에 분산된 컨테이너들이 네트워크 상에서 서로 연결될 수 있습니다.
  5. CNI 플러그인 예시
    • bridge: 가장 기본적인 CNI 플러그인으로, 가상 브리지를 생성하고 해당 브리지를 통해 컨테이너들이 통신할 수 있게 합니다.
    • host-local: 로컬 시스템에서 IP 주소를 관리하고, 각 컨테이너에 IP를 할당합니다.
    • flannel, calico, weave: 복잡한 네트워크 요구 사항을 처리하는 데 사용되는 네트워크 플러그인으로, 특히 Kubernetes에서 자주 사용됩니다. 이 플러그인들은 컨테이너들이 클러스터 내에서 효율적으로 통신할 수 있도록 돕습니다.
  6. CNI와 Kubernetes
    • Kubernetes는 컨테이너 네트워킹을 위해 CNI를 채택하고 있습니다. 각 노드에서 실행되는 컨테이너에 네트워크를 설정하기 위해 CNI 플러그인을 사용하며, 컨테이너 생성 시마다 CNI 플러그인이 호출되어 해당 네트워크 인터페이스를 설정합니다.
    • 여러 네트워크 플러그인을 사용하여 Pod 간의 통신, 클러스터 외부와의 통신, 네트워크 정책을 제어할 수 있습니다.

CNI의 동작 과정

  1. 컨테이너 생성 요청 시 CNI 플러그인이 호출됩니다.
  2. 네트워크 플러그인은 새로운 네트워크 인터페이스(예: veth pair)를 컨테이너에 추가합니다.
  3. IPAM 모듈이 IP 주소를 할당하고, 네트워크 인터페이스에 해당 IP 주소가 설정됩니다.
  4. 라우팅 테이블 및 방화벽 규칙이 설정되어 컨테이너가 네트워크 상에서 통신할 수 있게 됩니다.
  5. 컨테이너가 삭제되면 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 같은 오케스트레이션 툴에서 특히 중요한 역할을 하며, 플러그인 기반 구조로 다양한 네트워크 백엔드와 통합될 수 있습니다.