본문으로 건너뛰기

Container Network Interface(CNI)

Kubernetes network

Kubernetes network 기본 요구 사항

  • 노드의 파드는 NAT 없이 모든 노드의 모든 파드와 통신할 수 있다.
  • 노드의 에이전트(예: 시스템 데몬, kubelet)는 해당 노드의 모든 파드와 통신할 수 있다.
  • 노드의 호스트 네트워크에 있는 파드는 NAT 없이 모든 노드에 있는 모든 파드와 통신할 수 있다.

Pod

Docker 의 host 방식으로 pod 내의 컨테이너간 네트워크를 공유합니다. Pause라는 container가 생성되며 이 컨테이너가 IPC, Network namespace를 생성하고 유지합니다.

CNI


요약

  • 관리자가 네트워크 설정을 정의하는 형식입니다.
  • 컨테이너 런타임이 네트워크 플러그인에 요청을 보내는 프로토콜입니다.
  • 제공된 구성을 기반으로 플러그인을 실행하는 절차입니다.
  • 플러그인이 다른 플러그인에 기능을 위임하는 절차입니다.
  • 결과를 런타임에 반환하는 플러그인의 데이터 유형입니다.

  • Network configuration format
    • cniVersion, cniVersions, name, disableCheck, plugins 등을 포함한 JSON 객체로 구성됩니다.
  • Execution Protocol
    • 플러그인은 실행파일이어야 합니다.
    • 플러그인은 환경 변수와 stdin을 통해 설정값을 받습니다.
    • 플러그인은 설정 성공 시 stdout, 실패 시 stderr로 결과를 반환합니다.
  • Execution of Network Configurations
    • 컨테이너 런타임은 네트워크 설정을 해석하여 CNI 플러그인을 실행합니다.
    • 수명 주기
      • 컨테이너 런타임은 플러그인을 호출하기 전에 컨테이너에 대한 새 네트워크 네임스페이스를 생성해야 합니다.
      • ...
      • 컨테이너 런타임은 컨테이너의 네트워크 네임스페이스 정리를 담당합니다.
  • Plugin Delegation
    • CNI 플러그인은 일부 기능을 다른 플러그인에 위임할 수 있습니다.(ex) IPAM plugin)
    • 위임받은 플러그인은 실행파일이어야 합니다.
    • 위임받은 플러그인은 CNI 플러그인에 전달된 것과 동일한 환경 변수와 stdin을 모두 설정값으로 받아야합니다.
    • 위임받은 플러그인은 설정 성공 시 stdout, 실패 시 stderr로 결과를 반환합니다.
  • Result Types
    • CNI 플러그인의 실행 결과에 대한 JSON 형식의 스키마가 있습니다.

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"
}

Example(Calico)


Calico CNI and Calico IPAM(pod-network-cidr=10.130.0.0/16)

https://www.youtube.com/watch?v=JyLtg_SJ1lo