이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Kubernetes/네트워크

CNI 리서치 : CNI 개념

이쿠우우 2024. 8. 6. 21:17
반응형

CNI 개념 정리

 
 

목표

flannel, calico를 통해 container에 IP가 할당되는 과정을 알아보기 위해
CNI 동작원리를 파악해봄
 
 

 

CNI 란?

CNI : Container Network Interface
Linux Container의 network namespace에 network interface를 설정할 수 있도록 도와주는 라이브러리로 구성되어 있음.
CNI는 오직 "컨테이너의 네트워크 연결성"과  "컨테이너 삭제시 관련된 네트워크 리소스 해제" 에 대해서만 관여함.
그 외의 구체적인 사안에 대해서는 특별히 제한을 두지 않아서 다양한 CNI 구현체가 존재함.
 
Kubernetes, Openshift와 같은 많은 Container Orchestration Platform 또는 Container Runtime들은
CNI를 준수하는 Conf (Configuration) 파일을 통해 CNI Plugin을 실행하여 Container의 Network Interface를 설정하고 있음.
여기서 Conf File은 Container의 network namespace에 설정될 Network Interface와 정보를 담고 있는 설정 파일을 의미하며,
Plugin은 Shell에서 실행 가능한 Binary를 의미함.
 
 

CNI 특징

 
CNI 구현체들은 실행가능한 파일로 존재함.
 
구현체로 들어가는 실행 옵션들은 환경변수로 관리됨.
 
CNI가 구현하는 network interface 구조는 설정파일을 통해 관리됨
 
 
이러한 CNI 개념은 읽어서는 이해가 안되서
직접 실습을 통해 파악해보기함.
 
 

 

CNI 사용 예제

 
container를 생성하지 않고 linux kernel network namespace 를 생성한 후
CNI를 사용하여 network interface를 할당해봄.
 
 

CNI 구성 파일 생성

 
파일경로  : /root/cni/1-iksoontest.conf
cat > /root/cni/1-iksoontest.conf <<"EOF"
{
  "cniVersion": "0.4.0",
  "name": "iksoonnet",
  "type": "bridge",
  "bridge": "iksoon0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "172.19.0.0/24",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}
EOF
  • cniVersion : CNI 명세의 버전을 정의
  • name : 네트워크 이름
  • type : 사용할 CNI plugin 종류를 지정.
  • bridge : 사용/생성할 브리지의 이름. (default : cni0)
  • isGateway : 브리지에 IP 주소를 할당. (default : false)
  • ipMasq: 아웃바운드 masquerade 설정(NAT 설정) (default : false)
  • ipam: 네트워크에 사용할 IPAM 구성
 
[flannel의 CNI 설정 파일]

 

[calico의 CNI 설정 파일]

[cni plugin 항목]

 

[bridge plugin 설정 참고]
 
[host-local IPAM 설정 참고]
 
 
 

network namespace 생성

명령어
contid=iksoon-space-1
ip netns add $contid
netnspath=/var/run/netns/$contid
ip netns add 명령으로 network namespace를 생성하면
default로 /var/run/netns 경로에 network  namespace 파일이 생성됨

network namespace 목록은 아래 명령어로도 확인할 수 있음
 ip netns list​

해당 network namespace 정보를 확인
ip netns exec $co

network namespace만 생성하면 위와같이 loopback 정보만 생성되어있음.

 

CNI 환경변수 설정
export CNI_PATH=/opt/cni/bin
export CNI_CONTAINERID=$contid
export CNI_NETNS=$netnspath
export CNI_IFNAME=iksoonifname0
  • CNI_CONTAINERID: container runtime에 의해 할당된 container의 유니크한 ID.
  • CNI_NETNS : network namespace의 경로
  • CNI_IFNAME : Container 내부에 생성할 network interface 이름입니다.
  • CNI_PATH: CNI Plugin을 찾기 위한 경로 설정
 

생성 했던 network namespace에 CNI를 사용하여 network interface 추가

 
CNI_COMMAND 환경변수 설정
export CNI_COMMAND=ADD
ADD : network interface 추가
DEL : network interface 제거
CHECK : network interface 상태 확인
VERSION : CNI plugin version 확인
 
CNI를 통해 network interface 추가
cd /opt/cni/bin
./bridge < /root/cni/1-iksoontest.conf
결과
CNI를 통해 추가된 network interface 정보를 확인할 수 있음

[결과 리턴 값 확인]
CNI로 network interface 할당 성공 시 JSON 객체가 반환 됨.
 
 

network namespace의 interface 확인

/root/cni/1-iksoontest.conf 에 정의했던 설정으로 network interface가 추가된 것을 확인할 수 있음
 
host에 bridge network interface가 추가된 것을 확인 할 수 있음
ifconfig

생성했던 network namespace에는 CNI를 통해 추가한 interface를 확인할 수 있음.
ip netns exec $contid ip addr show
host-ipam으로 ip가 할당됨.

결론

linux kernel의 network namespace를 생성하면 기본적으로 loop back network interface만 존재함.
이런 network namespace를 실제 서비스에 이용할 수는 없으니 CNI를 통해 network interface를 추가해서
사용할 수 있음.
 
 
network interface 제거
 
[명령어]
export CNI_COMMAND=DEL
cd /opt/cni/bin
./bridge < /root/cni/1-iksoontest.conf
echo $?
아래 결과 처럼  명령이 정상적으로 성공하면 표준 출력에 아무 것도 표시되지 않으며
반환된 상태 코드에서 성공 여부를 확인할 수 있음.

 
삭제가 되었는지 결과 확인
ip netns exec $contid ip addr show
network namespace에 CNI를 통해 추가되었던 iksoonifname0 interface가 제거된 것을 확인할 수 있음

 

 

network namespace 제거
 
명령어
ip netns delete $contid
아래와 같이 생성했던 network namespace 정보가 제거됨.

 
host에 생성된 bridge network interface 제거
ip link delete iksoon0

 


 

CNI 개념 참고
 
반응형