이쿠의 슬기로운 개발생활

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

Kubernetes/네트워크

CNI 리서치 : Flannel CNI 배포 후 Cluster의 Pod IP 할당과정

이쿠우우 2024. 8. 8. 20:48
반응형

Flannel CNI 배포 후 Cluster의 Pod IP 할당과정

 
 

Flannel initcontainer 역할

flannel daemonset이 node에 배포되면 먼저 initcontainer에 의해 환경이 구성됨
 

Flannel CNI plugin 배포

Flannel CNI plugin은 default 로 /opt/cni/bin directory에 배포 되어있음.
default CNI plugin들은 kubelet이 배포되면서 함께 배포됨.
실제로 CNI를 배포하지 않고 kubelet만 배포해보면 하면 아래와 같이 기본 CNI Plugin만 배포되어있음.

이후 cluster에서 flannel CNI를 배포하면 flannel daemonset의 initcontainer에 의해
아래와 같이/opt/cni/bin directory에 flannel이 배포됨.

 

CNI 설정 파일 배포

/etc/cni/net.d directory를 확인해보면 아래와 같은 CNI 설정 파일을 확인할 수 있음.
{
  "name": "cbr0",
  "cniVersion": "0.2.0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

 

plugins 항목을 확인해보면
type에 flannel이 명시되어있는 것을 확인할 수 있음.
이전 글에서 CNI test 진행할 때는 기본 CNI plugin인 bridge와 같은 것을 사용했는데
flannel이 배포된 뒤로는 flannel plugin을 호출함.
 
 

Flannel container 역할

flannel daemonset의 initcontainer로 환경이 구성이 완료된 이후 배포됨.
node에서 flanneld 프로세스가 실행됨
default flanneld 프로세스 경로 : /opt/bin/flanneld
 
해당 flanneld의 역할을 정리해봄.
 
 

Flannel 환경변수 파일 배포

Flanneld가 node에서 최초 실행되면 먼저 flannel 환경변수 파일을 생성함.
/run/flannel/subnet.env
FLANNEL_NETWORK=10.100.0.0/16
FLANNEL_SUBNET=10.100.74.1/24
FLANNEL_MTU=1400
FLANNEL_IPMASQ=true
Flannel CNI plugin은  /run/flannel/subnet.env의 정보를 사용하여 bridge, host-ipam CNI plugin을 구성하고 호출함.
/run/flannel/subnet.env 파일은 flanneld의 mode에 따라 생성되는 값이 달라짐
 

flanneld kubernetes mode : 일반적인 flannel 배포 시 사용됨.

flanneld가 kube-apiserver로 부터 node의 podCIDR 설정 값을 확인하고 해당 값으로 subnet.env 파일을 생성.
etcd에도 node의 podCIDR 값으로 저장됨.
 
node에 podCIDR 값 확인 방법
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'

만약 flanneld가 kubernetes mode인데 node에 podCIDR 값이 없다면
아래와 같은 오류가 발생하며 flanneld pod가 배포되지 않음.
Error registering network: failed to acquire lease: node "iksoon-master.novalocal" pod cidr not assigned

 

 

flanneld etcd mode 

etcd mode로 동작되는 경우 node의 podCIDR 설정은 무시되고
etcd에 생성되는 node의 podCIDR 정보로 동작됨.
flanneld가 자체적으로 cidr값을 생성해서 etcd에 저장함.
 

 

(node podCIDR 확인 명령어)
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
worker-node-0 : 10.100.0.0/24
worker-node-1 :  10.100.1.0/24

실제 적용되어있는 pod CIDR 를 확인해보면 node의 podCIDR값과 다름
worker-node-0 : 10.100.28.0/24
worker-node-1 :  10.100.54.0/24

worker-node-0 flannel 환경변수 파일 확인

 

worker-node-1 flannel 환경변수 파일 확인

 

 

Flanneld 프로세스 역할

Flanneld Pod은 Host(Node)의 Network Namespace를 이용하기 때문에 Host의 Network 설정을 조회하거나 변경할 수 있음.
Flanneld가 host에 배포되면 host에 vxlan network interface를 생성함

그 뒤에 node에 배포되는 pod 상태를 모니터링하며 flannel 네트워킹을 구성함.
 
 

Flannel CNI Plugin이 pod에 IP를 할당하는 과정

 

1. container runtime으로 pod의 pause container 생성

pause container 배포 시 containerD에 설정되어있는 CNI 설정 파일 경로를 확인
/etc/cni/net.d/10-flannel.conflist
{
  "name": "cbr0",
  "cniVersion": "0.2.0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}
해당 내용으로 flannel CNI plugin이 실행됨.
 
 

2. flannel 환경 변수 확인

flannel CNI plugin은 flanneld가 생성해놓은 /run/flannel/subnet.env 파일 내용을 확인함.
/run/flannel/subnet.env
FLANNEL_NETWORK=10.100.0.0/16
FLANNEL_SUBNET=10.100.28.1/24
FLANNEL_MTU=1400
FLANNEL_IPMASQ=true
 

3. Flannel plugin인 bridge plugin을 호출 함

Flannel plugin은 자체적으로 설정파일을 생성하여 bridge plugin을 호출함.
bridge plugin 설정 파일은 아래와 같음
{
  "name": "cni0",
  "type": "bridge",
  "mtu": 1450,
  "ipMasq": false,
  "isGateway": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.100.28.0/24"
  }
}
mtu, ipMasq, subent 정보는 모두 환경변수 파일의 내용에서 가져옴.
bridge cni plugin을 통해 아래와 같이 cni0 interface가 생성됨.

그리고 ipam 항목에 명시되어있는대로
host-ipam을 통해 pod에 ip가 할당됨.
 
 

참고
반응형