이번 글에서는 쿠버네티스를 설치하기 전에 간략하게 CNI(Container Network Interface)에 대하여 알아보겠습니다.
무작정 문서대로 설치만 하기 보다는 내가 설치하는 애가 무엇인지 알고 가는게 좋을거 같아 글을 쓰게 됐습니다.
CNI 란?
CNCF(Cloud Native Computing Foundation)의 프로젝트 중 하나인 CNI는 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준입니다. 다양한 형태의 컨테이너 런타임과 오케스트레이터 사이의 네트워크 계층을 구현하는 방식이 다양하게 분리되어 각자만의 방식으로 발전하게 되는 것을 방지하고 공통된 인터페이스를 제공하기 만들어 졌습니다. 쿠버네티스에서는 Pod 간의 통신을 위해서 CNI 를 사용합니다.
쿠버네티스 뿐만 아니라 Amazon ECS, Cloud Foundry 등 컨테이너 런타임을 포함하고 있는 다양한 플랫폼들은 CNI를 사용하고 있습니다. 쿠버네티스는 기본적으로 'kubenet' 이라는 자체적인 CNI 플러그인을 제공하지만 네트워크 기능이 매우 제한적인 단점이 있습니다.
그 단점을 보완하기 위해, 3rd-party 플러그인을 사용하는데 그 종류에는 Flannel, Calico, Weavenet, NSX 등 다양한 종류의 3rd-party CNI 플러그인들이 존재합니다.
CNI의 필요성
예를들어, 위 그림과 같이 컨테이너 기반으로 동작하는 애플리케이션에 Web UI 컨테이너, Login 컨테이너, 장바구니 Cart 컨테이너 이렇게 멀티 호스트로 구성되어 있습니다. 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 등 매우 다양한 종류가 있습니다.
위 그림에서는 weave net이라고 하는 CNI가 브릿지 인터페이스를 만들고 컨테이너 네트워크 대역대를 나눠주며 라우팅 테이블까지 생성하여 UI 컨테이너가 Login, Cart 컨테이너로 통신하는데 전혀 문제 없도록 지원합니다.
CNI에서 사용되는 네트워크 모델
CNI Provider는 VXLAN(Virtual Extensible Lan), IP-in-IP 과 같은 캡슐화된 네트워크 모델 또는 BGP (Border Gateway Protocol)와 같은 캡슐화 되지 않은 네트워크 모델을 사용하여 네트워크 패브릭을 구현합니다.
CNI 3rd-Party 플러그인 종류 및 지원하는 기능
Provider | Network Model |
Route Distribution |
Network Policy |
Mesh | External Datastore |
Encryption | Ingress/Egress Policies | Commercial Support |
Calico | Layer 3 | Yes | Yes | Yes | Etcd | Yes | Yes | Yes |
Canal | Layer 2 vxlan |
N/A | Yes | No | Etcd | No | Yes | No |
Flannel | vxlan | No | No | No | None | No | No | No |
kopeio- networking |
Layer 2 vxlan |
N/A | No | No | None | Yes | No | No |
kube- router |
Layer 3 | BGP | Yes | No | No | No | No | No |
romana | Layer 3 | OSPF | Yes | No | Etcd | No | Yes | Yes |
Weave Net | Layer 2 vxlan |
N/A | Yes | Yes | No | Yes | Yes | Yes |
네트워크 엔지니어가 아닌 저에게 이해하기 쉽지 않았습니다. 추후에는 쿠버네티스에서 사용하는 Overlay Network에 대해서 알아보겠습니다. 현재 kubeadm을 사용하여 kubernetes를 설치하는 글을 작성 중이었는데 급하게 EKS를 원하는 고객사의 프로젝트가 생겨서 EKS를 이용한 kubernetes 글을 먼저 작성하도록 하겠습니다. 감사합니다.
<참고 자료>
https://ykarma1996.tistory.com/179
https://kubernetes.io/ko/docs/concepts/cluster-administration/networking/
https://rancher.com/docs/rancher/v2.5/en/faq/networking/cni-providers/
출처 : https://captcha.tistory.com/78
'Dev Tools, WEB & WAS > Kubernates' 카테고리의 다른 글
[Kubernetes] 2. 쿠버네티스 설치 유형 (0) | 2023.02.09 |
---|---|
[Kubernetes] 1. 쿠버네티스란? (0) | 2023.02.06 |