네트워크 플러그인

네트워크 플러그인 (Network Plugins)

쿠버네티스(버전 1.3부터 최신 v1.37까지, 그리고 계속해서)는 클러스터 네트워킹에 Container Network Interface(CNI) 플러그인을 사용할 수 있게 해줍니다. 클러스터와 호환되고 필요에 맞는 CNI 플러그인을 사용해야 합니다. 다양한 플러그인이 더 넓은 Kubernetes 생태계에서 사용 가능합니다(오픈소스와 클로즈드소스 모두).

CNI 플러그인은 쿠버네티스 네트워크 모델을 구현하는 데 필요합니다.

CNI 사양의 v0.4.0 또는 그 이상 릴리스와 호환되는 CNI 플러그인을 사용해야 합니다. Kubernetes 프로젝트는 v1.0.0 CNI 사양과 호환되는 플러그인을 사용하는 것을 권장합니다(플러그인은 여러 사양 버전과 호환될 수 있습니다).

출처: 문서

본문

설치

컨테이너 런타임은 네트워킹 관점에서, kubelet에 CRI 서비스를 제공하도록 구성된 노드의 데몬입니다. 특히 컨테이너 런타임은 쿠버네티스 네트워크 모델을 구현하는 데 필요한 CNI 플러그인을 로드하도록 구성되어야 합니다.

쿠버네티스 1.24 이전에는 CNI 플러그인이 cni-bin-dirnetwork-plugin 명령줄 파라미터를 사용해 kubelet에 의해 관리될 수도 있었습니다. 이러한 명령줄 파라미터는 쿠버네티스 1.24에서 제거되었으며, 이제 CNI 관리는 kubelet의 범위 밖입니다.

dockershim 제거에 따른 문제가 있다면 CNI 플러그인 관련 오류 문제 해결을 참조하세요.

컨테이너 런타임이 CNI 플러그인을 관리하는 방법에 대한 구체적인 정보는 해당 컨테이너 런타임의 문서를 참조하세요. 예:

CNI 플러그인을 설치하고 관리하는 방법에 대한 구체적인 정보는 해당 플러그인 또는 네트워킹 제공자의 문서를 참조하세요.

네트워크 플러그인 요구 사항

루프백 CNI

쿠버네티스 네트워크 모델을 구현하기 위해 노드에 설치된 CNI 플러그인 외에도, 쿠버네티스는 컨테이너 런타임이 각 샌드박스(파드 샌드박스, VM 샌드박스 등)에 사용되는 루프백 인터페이스 lo를 제공하도록 요구합니다. 루프백 인터페이스 구현은 CNI loopback plugin을 재사용하거나, 이를 달성하기 위해 자신의 코드를 개발함으로써 수행할 수 있습니다(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"
    }
  ]
}

트래픽 셰이핑 지원

실험 기능

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-bandwidthkubernetes.io/egress-bandwidth 어노테이션을 추가할 수 있습니다. 예:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/ingress-bandwidth: 1M
    kubernetes.io/egress-bandwidth: 1M
...

더 알아보기 (Learn more)