CNI(Container Network Interface)

1,093 단어·3 분·원문(.md)

CNI는 컨테이너 런타임이 pod에 네트워크 인터페이스를 붙이고 ip를 부여하는 표준 규약이다.

k8s는 네트워크 자체를 직접 구현하지 않는다.

pod created -> cni plugin call -> pod network settings 이 구조로 동작한다.

즉, 아래 두 가지를 정의하게 된다.

  1. 컨테이너 네트워크 인터페이스 생성/삭제 표준
  2. ip 관려 IPAM 표준

k8s는 다음 네 가지의 네트워크 규칙을 만족해야 한다.

  1. 모든 pod는 서로 직접 ip 통신이 가능해야함
  2. 모든 node는 모든 pod와 통신할 수 있어야함
  3. NAT 없이 직접 통신 (Pod IP는 가상 IP가 아님)
  4. Pod가 외부로 나갈 때 정상 라우팅 되어야함.

이를 위해 파드마다 각각 고유의 ip가 필요하고 각 pod가 다른 노드에 있어도 통신이 가능해야한다.

이 작업들을 k8s에서 모두 구현하면 너무 복잡하므로 이걸 cni만 제공하고 네트워크 구현은 플러그인에게 맡긴것

CNI 전체 아키텍처 #

구성은 크게 세가지다

  1. container runtime (ex. containerd, CRI-O): pod 생성시 cni를 호출
  2. CNI Plugin(Calico, Flannelm Clium, Weave Net): 실제 네트워크 인터페이스 생성, 라우팅, 오버레이, ecmp등 수행
  3. IPAM Plugin: IP 주소 할당 정책 담당

ECMP(Equal-Cost Multi Path)는 네트워크에서 동일한 비용(=동일한metric)의 여러 경로가 존재할 때 트래픽을 여러 경로로 분산해서 보내는 라우팅 방식

kubelet이 runtime(container)에게 pod를 생성하라 요청하면 containerd가 CNI에게 ADD요청(json payload) 실행 후 cni가 veth 생성, 한쪽은 파드 네임스페이스 연결, 다른쪽은 host, overlay 엔드포인트 연결작업을 진행한다. 이후에 IPAM이 파드에 ip를 부여하고 라우팅 테이블, iptables, BPF 등 설정한다.

pod가 삭제되면 DEL 요청이 들어가고 삭제됨

CNI Plugin #

  • Flannel
    • 가장 단순하고 VXLAN 기반 오버레이
    • 보안기능은 없고 작은 클러스터에 적합함
  • Calico
    • 가장 많이 씀 기업에서
    • BGP 기반 라우팅에 NetworkPolicy도 강력하다
    • 오버레이 없이도 동작 가능하다.
  • Cilium
    • eBPF 기반 고성능
    • L3/L4/L7 정책까지 가능
    • sidecar 없이 서비스 메시 지원
    • 차세대 표준이다.
  • Weave Net
    • 작은 환경에서 쉬운 설치
    • 성능은 Calico, Clium 보다 낮음

CNI Directory Structure #

k8s의 기본 위치는 다음과 같다.

# 설정 파일 위치(예: 10-calico.conflist)
/etc/cni/net.d/

# cni 플러그인 바이너리 위치(calico, flannel 등)
/opt/cni/bin/

# kubelet config
--cni-conf-dir=/etc/cni/net.d
--cni-bin-dir=/opt/cni/bin

Pod Node간 통신 과정 #

Calico 기준으로 설명하겠다.

  1. pod는 veth로 host 네임스페이스와 연결한다
  2. host에 해당 Pod IP에 대한 라우팅을 등록한다
  3. 다른 Node에 있는 Pod와 통신시 BGP로 서로 라우팅 정보 교환후 바로 L3 level 커넥션을 전달한다.

즉 overlay 없이 실제 L3 네트워크 수준에서 통신됨.

CNI가 잘못되면 pod가 running인데 ready가 되지 않거나 핑이 먹통이거나 CoreDNS CrashLoop, Node NotReady, cni0 vxlan,calico 인터페이스 장애, ip -d link로 veth가 dangling 상태가 될수 있다.

이런 원인들중 보편적인건

  • IPAM 풀 부족
  • CNI Config 충돌
  • 호스티 라우팅 테이블 꼬임
  • aws/vpc, cni 라우팅 충돌
  • MTU Mismatch(Overlay(VXLAN) 사용 시 실제 MTU가 1500보다 작아져 IP fragmentation 발생 가능)

등이 있음.

SRE/question/q_4.md