🔥 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 연결
✅ 흐름 상세
- Kubelet → API 요청 받아서 Pod 생성 요청
- Container Runtime (containerd, CRI-O) → 컨테이너 생성
- 컨테이너 생성 직후 → CNI Plugin 호출
- 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) 적용 여부 |
ipam | IP Address Management 설정 |
→ type | IP 관리 방식 (host-local: 로컬 파일로 관리, dhcp: DHCP) |
→ subnet | Pod 네트워크 서브넷 |
→ 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 포함
🚀 중요한 포인트 정리
- Kubernetes는 직접 네트워크를 관리하지 않는다.
- **Container Runtime (containerd, CRI-O)**가 Pod 생성 후 CNI 플러그인을 호출한다.
- CNI 플러그인은 네트워크 Namespace, veth, IP 할당, Routing을 담당한다.
- 설정은
/etc/cni/net.d/에서 JSON 파일로 관리한다.
- 실행 파일은
/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 명령어로 진단