네트워크 플러그인
네트워크 플러그인 (Network Plugins)
쿠버네티스 클러스터의 팟 간 통신을 가능하게 하는 핵심이 바로 CNI(Container Network Interface) 플러그인이에요. 이 페이지는 CNI 플러그인의 요구 사항과 설치 방법, 그리고 필수 기능들에 대해 설명해 드립니다. 네트워킹을 제대로 구성하려면 CNI가 어떤 역할을 하는지 이해하는 게 중요해요.
쿠버네티스(버전 1.3부터 최신 1.36까지, 그리고 이후로도)는 클러스터 네트워킹에 CNI(Container Network Interface) 플러그인을 사용하게 해 줍니다. 클러스터와 호환되고 필요에 맞는 CNI 플러그인을 반드시 사용해야 해요. 쿠버네티스 생태계에는 다양한 플러그인(오픈소스와 클로즈드소스 모두)이 있습니다.
CNI 플러그인은 쿠버네티스 네트워크 모델을 구현해야 해요.
CNI 사양의 v0.4.0 이상과 호환되는 플러그인을 사용해야 합니다. 쿠버네티스 프로젝트는 v1.0.0 CNI 사양과 호환되는 플러그인을 권장해요(플러그인은 여러 사양 버전과 호환될 수 있습니다).
설치 (Installation)
네트워킹 관점에서 컨테이너 런타임(Container Runtime) 은 kubelet에 CRI 서비스를 제공하도록 구성된 노드의 데몬이에요. 특히 컨테이너 런타임은 쿠버네티스 네트워크 모델을 구현하는 데 필요한 CNI 플러그인을 로드하도록 구성되어야 합니다.
참고: 쿠버네티스 1.24 이전에는 CNI 플러그인을 kubelet이
cni-bin-dir과network-plugin커맨드라인 파라미터로 관리할 수도 있었어요. 이 파라미터들은 쿠버네티스 1.24에서 제거되었고, CNI 관리는 더 이상 kubelet의 범위에 속하지 않습니다.
dockershim 제거 이후 문제가 발생한다면 CNI 플러그인 관련 오류 트러블슈팅을 참고하세요.
컨테이너 런타임이 CNI 플러그인을 관리하는 방법에 대한 자세한 내용은 해당 컨테이너 런타임 문서를 참고하세요. 예:
CNI 플러그인 설치·관리에 대한 자세한 내용은 해당 플러그인 문서나 네트워킹 프로바이더 문서를 참고하세요.
네트워크 플러그인 요구 사항 (Network Plugin Requirements)
루프백 CNI (Loopback CNI)
쿠버네티스 네트워크 모델을 구현하기 위해 노드에 설치된 CNI 플러그인 외에도, 컨테이너 런타임은 각 샌드박스(팟 샌드박스, VM 샌드박스 등)에 사용되는 루프백 인터페이스 lo 를 제공해야 해요. 루프백 인터페이스 구현은 CNI 루프백 플러그인을 재사용하거나, 자체 코드를 개발해(CRI-O의 이 예제 참고) 달성할 수 있습니다.
hostPort 지원
CNI 네트워킹 플러그인은 hostPort를 지원해요. CNI 플러그인 팀이 제공하는 공식 portmap 플러그인을 사용하거나, portMapping 기능을 가진 자체 플러그인을 사용할 수 있습니다.
hostPort 지원을 활성화하려면 cni-conf-dir에서 portMappings capability를 지정해야 해요. 예:
{
"name": "k8s-pod-network",
"cniVersion": "0.4.0",
"plugins": [
{
"type": "calico",
"log_level": "info",
"datastore_type": "kubernetes",
"nodename": "127.0.0.1",
"ipam": {
"type": "host-local",
"subnet": "usePodCidr"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
}
},
{
"type": "portmap",
"capabilities": {"portMappings": true},
"externalSetMarkChain": "KUBE-MARK-MASQ"
}
]
}
트래픽 셰이핑 지원 (Support traffic shaping)
실험적 기능 (Experimental Feature)
CNI 네트워킹 플러그인은 팟의 수신·송신 트래픽 셰이핑도 지원해요. CNI 플러그인 팀이 제공하는 공식 bandwidth 플러그인을 사용하거나, 대역폭 제어 기능을 가진 자체 플러그인을 사용할 수 있습니다.
트래픽 셰이핑 지원을 활성화하려면 CNI 설정 파일(기본 /etc/cni/net.d)에 bandwidth 플러그인을 추가하고, 바이너리가 CNI bin 디렉터리(기본 /opt/cni/bin)에 포함되어 있는지 확인해야 해요.
{
"name": "k8s-pod-network",
"cniVersion": "0.4.0",
"plugins": [
{
"type": "calico",
"log_level": "info",
"datastore_type": "kubernetes",
"nodename": "127.0.0.1",
"ipam": {
"type": "host-local",
"subnet": "usePodCidr"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
}
},
{
"type": "bandwidth",
"capabilities": {"bandwidth": true}
}
]
}
이제 팟에 kubernetes.io/ingress-bandwidth와 kubernetes.io/egress-bandwidth 어노테이션을 추가할 수 있어요. 예:
apiVersion: v1
kind: Pod
metadata:
annotations:
kubernetes.io/ingress-bandwidth: 1M
kubernetes.io/egress-bandwidth: 1M
...