[네떡스터디🔥kans] Flannel CNI 알아보기

 

 

CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 KANS 3기 내용을 정리한 글입니다.

 

시작하기 전: 쿠버네티스 네트워킹

쿠버네티스 네트워크 모델은 4가지 요구사항과 4가지 문제를 해결해야 합니다.

 

쿠버네티스 네트워킹 통신 동작

요구사항

  1. 파드와 파드간 통신시 NAT 없이 통신이 가능합니다.
  2. 노드의 에이전트(kubelet, systemd)는 파드와 통신이 가능합니다.
  3. 호스트 네트워크를 사용하는 파드는  NAT없이 파드와 통신이 가능합니다.
  4. 서비스 클러스터 IP대역과 파드가 사용하는 IP대역은 중복되지 않아야 합니다. 

 문제 점

  1. 파드 내 컨테이너는 루프백을 통한 통신을 할 수 있습니다.
  2. 파드 간 통신을 할 수 있습니다.
  3. 클러스터 내부에서 서비스를 통한 통신을 할 수 있습니다.
  4. 클러스터 외부에서 서비스를 통한 통신을 할 수 있습니다. 

 

CNI 란

CNIContainer Network Interface의 약자로 컨테이너로 위에 설명되어있는 4개의 요구사항과 4개의 문제점을 해결하기 위한 규칙을 제공합니다. 대표적인 CNI 플러그인으로는 Calico, Cilium 등이 있습니다. 

 

CNI의 역할

  1. IP 주소 할당(IPAM): 각 컨테이너 또는 파드에 고유한 IP 주소를 할당합니다.
  2. 네트워크 설정: 컨테이너가 네트워크 상에서 통신할 수 있도록 가상 네트워크 인터페이스를 생성하고 연결합니다.
  3. 다양한 네트워크 플러그인 지원: 쿠버네티스는 다양한 CNI 플러그인을 지원하여 클러스터에서 네트워킹 정책 및 설정을 유연하게 관리할 수 있게 합니다. 예를 들어, Calico, Flannel, Weave 등 여러 CNI 플러그인을 통해 네트워크 구현을 할 수 있습니다.

 

CNI 플러그인의 동작 과정

CNI 플러그인 동작 과정

  1. 파드가 생성될 때, 쿠버네티스(kubelet)는 CNI 플러그인에게 요청하여 네트워크를 설정합니다.
  2. CNI 플러그인은 파드에 가상 네트워크 인터페이스를 생성하고, IP 주소를 할당합니다.
  3. 파드가 삭제될 때는 네트워크 자원 해제 작업을 수행합니다.

 

Flannel CNI

Flannel은 단일 바이너리 에이전트인 flanneld이 각 노드에서 동작하여, 작은 규모의 클러스터 환경에서 파드들 간 통신 환경을 구성해주는 CNI입니다. host-gw, udp, vxlan 3가지의 모드가 지원되지만 권장되는 방법은 vxlan 모드입니다. 

 

VXLAN 모드

 

직접 설치해보기

간단하게 kind를 이용하여 flannel을 설치해보려고 합니다. kind를 사용하는 경우 기본 cni가 설치되기 때문에 이 설정을 끈 뒤 클러스터를 생성해봅니다.

 

아직 노드에 CNI가 설치되지 않아서 NotReady상태인 것을 확인할 수 있습니다.

 

이제 flannel을 설치해보도록 합시다. flannel 버전은 v0.25.6입니다. 

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.25.6/Documentation/kube-flannel.yml

 

설치 후 노드정보를 살펴보면 정상인 것을 확인할 수 있습니다.

 

별도로 지정하지 않더라도 kube-flannel이라는 네임스페이스에 생성이 됩니다.

 

그리고 설치되면서 설정된 설정 파일은 다음과 같습니다.

 

 

추가적으로 생성 된 클러스터 정보를 살펴보면 다음과 같습니다.

 

 

flannel 정보도 추가로 확인해보면 다음과 같습니다. 

 

TBD; 스터디 자료와는 다른 건 내 테스트에서는 MTU사이즈가 1450으로 잡힘..!!

 

노드에 붙어있는 annotations도 살펴보았는데 VXLAN통신에 필요한 정보들이 붙어있는 것을 확인할 수 있습니다.

 

 

위의 vxlan 모드 그림에 보이는 cni0 인터페이스는 노드에서는 확인이 되지 않는 것을 알 수 있습니다.

 

 

그 외에도 정보를 확인해보면 다른 파드 대역에 대한 라우팅 테이블이 업데이트 되어있는 것을 확인할 수 있습니다. 

 

 

arp 테이블을 확인해보면 이렇게 설정이 되어있는데 각 mac주소가 node의 맥주소인것을 확인할 수 있습니다.  (노드에 붙어있는 annotations 정보확인!)

 

 

통신흐름 이해해보기

TBD

동일 노드간 파드 통신

 

다른 노드간 파드 통신

 

외부로 나가는 통신 흐름

 

패킷 캡처 해서 확인하기