본문으로 건너뛰기

Container Network Interface(CNI)

CNI

loading...

Calico CNI and Calico IPAM(pod-network-cidr=10.130.0.0/16)
https://www.youtube.com/watch?v=JyLtg_SJ1lo
  • Network configuration format
  • Execution Protocol
    • 플러그인은 실행파일이어야 합니다.
    • 플러그인은 환경 변수와 stdin을 통해 설정값을 받습니다.
    • 플러그인은 설정 성공 시 stdout, 실패 시 stderr로 결과를 반환합니다.
  • Execution of Network Configurations
    • 컨테이너 런타임은 네트워크 설정을 해석하여 CNI 플러그인을 실행합니다.
    • 수명 주기
      • 컨테이너 런타임은 플러그인을 호출하기 전에 컨테이너에 대한 새 네트워크 네임스페이스를 생성해야 합니다.
      • ...
      • 컨테이너 런타임은 컨테이너의 네트워크 네임스페이스 정리를 담당합니다.
  • Plugin Delegation
    • CNI 플러그인은 일부 기능을 다른 플러그인에 위임할 수 있습니다.(e.g., IPAM plugin)
    • 위임받은 플러그인은 실행파일이어야 합니다.
    • 위임받은 플러그인은 CNI 플러그인에 전달된 것과 동일한 환경 변수와 stdin을 모두 설정값으로 받아야합니다.
    • 위임받은 플러그인은 설정 성공 시 stdout, 실패 시 stderr로 결과를 반환합니다.
  • Result Types
    • CNI 플러그인의 실행 결과에 대한 JSON 형식의 스키마가 있습니다.

Pod을 생성하면 CNI plugin은 아래와 같은 절차로 호출되어 네트워크를 설정합니다.

  • Container Runtime은
    • Sandbox 컨테이너를 생성하고 Network Namespace를 생성합니다.
    • /etc/cni/net.d/에서 알파벳순으로 첫번째 CNI 설정 파일(.conf, .conflist)을 읽습니다.
    • 설정에 맞춰 CNI plugin의 ADD 명령어를 호출합니다.

CNI 설정

규칙

예시

/etc/cni/net.d/10-calico.conflist
{
"cniVersion": "0.3.1",
"name": "k8s-pod-network",
"plugins": [
{
"type": "calico",
// plugin specific parameters
"datastore_type": "kubernetes",
"ipam": {
"type": "calico-ipam",
"assign_ipv4": "true"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
}

//...
}
]
}
/etc/cni/net.d/00-multus.conf
{
"cniVersion": "0.3.1",
"name": "multus-cni-network",
"type": "multus-shim",
"capabilities": {
"bandwidth": true,
"portMappings": true
},
"clusterNetwork": "/host/etc/cni/net.d/10-calico.conflist"
}