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"
}
plugins
- https://www.cni.dev/plugins/current/
- https://github.com/containernetworking/plugins
type
을 제외한 나머지 필드는 플러그인마다 다르며, 정해진 값이 없습니다.type
: CNI 바이너리 이름과 매칭되는 값입니다.ls /opt/cni/bin
ipam
type
: IPAM 바이너리 이름과 매칭되는 값입니다.- https://www.cni.dev/plugins/current/ipam/
dhcp
host-local
static
Example(Calico)
Calico CNI and Calico IPAM(pod-network-cidr=10.130.0.0/16)