CNI in kubernetes

Yu Sang Min·2025년 6월 26일

CKA

목록 보기
78/110

🔥 Kubernetes에서 CNI가 동작하는 구조


🧠 복습: CNI의 개념

  • CNI (Container Network Interface)는 컨테이너 네트워크 설정을 위한 표준 인터페이스
  • Kubernetes는 직접 네트워크를 설정하지 않는다.
  • 대신, Container Runtime (예: containerd, CRI-O)가 Pod 생성 시 CNI 플러그인을 호출하여 네트워크를 구성한다.

🏗️ Kubernetes Pod Networking 구성 흐름

Kubernetes → Container Runtime → CNI Plugin → Pod Network 연결

✅ 흐름 상세

  1. Kubelet → API 요청 받아서 Pod 생성 요청
  2. Container Runtime (containerd, CRI-O) → 컨테이너 생성
  3. 컨테이너 생성 직후 → CNI Plugin 호출
  4. CNI Plugin → Namespace 생성, veth pair 연결, Bridge 연결, IP 할당, Routing 설정

📦 CNI Plugin 위치 및 구성 파일 경로

목적경로설명
CNI 실행 파일/opt/cni/bin/플러그인 바이너리 (ex: bridge, flannel, calico)
CNI 설정 파일/etc/cni/net.d/어떤 플러그인 사용할지 지정

→ 플러그인은 실행 파일 + JSON 설정 파일 쌍으로 존재


🗂️ CNI 설정 파일 구조 예시 (bridge)

{
  "cniVersion": "0.4.0",
  "name": "mynet",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/16",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}

주요 항목 해설:

항목설명
name네트워크 이름 (ex: mynet)
type플러그인 종류 (bridge, flannel, calico 등)
bridge브릿지 이름 (보통 cni0)
isGateway브릿지가 게이트웨이 역할을 수행
ipMasq외부로 나갈 때 IP Masquerade (SNAT) 적용 여부
ipamIP Address Management 설정
typeIP 관리 방식 (host-local: 로컬 파일로 관리, dhcp: DHCP)
subnetPod 네트워크 서브넷
routes기본 라우팅 테이블 설정

🔧 플러그인 선택 방식

  • /etc/cni/net.d/ 폴더 안의 가장 첫 번째 (알파벳 순) JSON 파일이 선택됨
  • 여러 네트워크 설정이 가능하지만, 기본 네트워크는 하나만 선택됨

🔍 Pod 생성 시 네트워크 동작 과정

1. containerd가 Pod 컨테이너 생성
2. /etc/cni/net.d/에서 설정 파일 읽음
3. /opt/cni/bin/에 있는 플러그인 실행
4. 플러그인은
   → veth pair 생성
   → 하나는 컨테이너 namespace 연결
   → 다른 하나는 bridge(cni0) 연결
5. IP 할당 (host-local 또는 DHCP)
6. routing table과 NAT 설정

⚙️ IPAM (IP Address Management) 방식

  • host-local: 각 노드 로컬에서 관리 → 보통 /var/lib/cni/networks/에 할당 기록 저장
  • dhcp: 외부 DHCP 서버에서 할당
  • Calico, Cilium 같은 고급 CNI는 자체 IPAM 포함

🚀 중요한 포인트 정리

  1. Kubernetes는 직접 네트워크를 관리하지 않는다.
  2. **Container Runtime (containerd, CRI-O)**가 Pod 생성 후 CNI 플러그인을 호출한다.
  3. CNI 플러그인은 네트워크 Namespace, veth, IP 할당, Routing을 담당한다.
  4. 설정은 /etc/cni/net.d/에서 JSON 파일로 관리한다.
  5. 실행 파일은 /opt/cni/bin/에 있다.

🔥 실무적 응용

  • CNI 설정이 잘못되면 Pod는 ContainerCreating 상태에서 멈춘다.
  • /var/log의 kubelet, containerd 로그에서 CNI 호출 오류 확인
  • 플러그인 설치 상태 확인:
ls /opt/cni/bin/
ls /etc/cni/net.d/
  • 네트워크 문제 발생 시 iptables, ip link, ip addr, ip route 명령어로 진단
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글