워크로드 클러스터에 Multus 배포

Multus CNI는 여러 네트워크 인터페이스를 단일 포드에 연결하고 각각을 다른 주소 범위와 연결할 수 있게 해주는 Kubernetes용 컨테이너 네트워크 인터페이스(CNI) 플러그인입니다.

이 항목에서는 Multus 패키지를 독립형 관리 클러스터에서 배포하는 워크로드 클러스터에 설치하고, 이를 사용하여 여러 네트워크 인터페이스가 있는 포드를 생성하는 방법을 설명합니다. 예를 들어 Antrea 또는 Calico를 기본 CNI로, 하드웨어 또는 가속 인터페이스를 위한 macvlan 또는 ipvlan 또는 SR-IOV 또는 DPDK 디바이스와 같은 보조 인터페이스를 생성합니다.

macvlan 및 ipvlan용 바이너리는 워크로드 클러스터 노드 템플릿에 이미 설치되어 있습니다.

참고

Multus CNI는 vSphere with Tanzu Supervisor가 배포한 워크로드 클러스터에 대해 지원되지 않습니다.

사전 요구 사항

Multus CNI 패키지 설치

참고

클러스터에 Multus CNI가 설치되면 삭제하면 안 됩니다. 아래의 지원되지 않는 Multus 삭제를 참조하십시오.

워크로드 클러스터에 Multus CNI 패키지를 설치하고 이를 사용하도록 클러스터를 구성하려면 다음을 수행합니다.

  1. multus CNI 패키지가 설치된 패키지 저장소(예: tanzu-standard 저장소)가 클러스터에 없는 경우 설치합니다.

    tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
    

    여기서:

    • PACKAGE-REPO-NAME은 패키지 저장소의 이름(예: tanzu-standard 또는 ADDITIONAL_IMAGE_REGISTRY 변수로 구성된 개인 이미지 레지스트리의 이름입니다.
    • PACKAGE-REPO-ENDPOINT는 패키지 저장소의 URL입니다.

      • 이 릴리스의 경우 tanzu-standard URL은 projects.registry.vmware.com/tkg/packages/standard/repo:v2023.10.16입니다. Tanzu CLI에서 이 값을 가져오려면 패키지 저장소 나열을 참조하거나 Tanzu Mission Control의 클러스터(Cluster) 창에서 추가 기능(Addons) > 저장소(Repositories) 목록을 참조하십시오.
  2. (선택 사항) Multus를 구성하려면 다음을 수행합니다.

    1. Multus 매개 변수를 검색하여 Daemonset로 배포하는 구성 파일을 생성합니다.

      tanzu package available get multus-cni.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
      

      여기서 PACKAGE-VERSION은 설치하려는 Multus 패키지의 버전이며 FILE-PATH는 구성 파일을 저장할 위치입니다(예: multus-data-values.yaml).

      구성 파일의 설정에 대한 자세한 내용은 Multus CNI 저장소의 entrypoint.sh 매개 변수를 참조하십시오.

    2. tanzu package available list 명령을 실행하여 사용 가능한 Multus 패키지 버전을 표시합니다. 예를 들면 다음과 같습니다.

      tanzu package available list multus-cni.tanzu.vmware.com -A
       NAME                        VERSION              RELEASED-AT                   NAMESPACE
       multus-cni.tanzu.vmware.com 4.0.1+vmware.1-tkg.1 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
       multus-cni.tanzu.vmware.com 3.8.0+vmware.1-tkg.1 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
       multus-cni.tanzu.vmware.com 3.7.1+vmware.2-tkg.2 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
      
      참고

      네트워크 제한 환경에서 작업하는 경우 사용자 지정 이미지 레지스트리에 연결할 수 있는지 확인합니다.

    3. --values-schema와 함께 tanzu package available get 명령을 실행하여 설정할 수 있는 필드 값을 확인합니다.

      tanzu package available get multus-cni.tanzu.vmware.com/VERSION --values-schema -o FORMAT
      

      형식 설명: VERSIONtanzu package available list 출력에 표시된 버전입니다. FORMATyaml 또는 json입니다.

    4. multus-data-values.yaml 구성 파일을 원하는 필드 값으로 채웁니다.

  3. multus-data-values.yaml 파일에서 모든 주석을 제거합니다.

    yq -i eval '... comments=""' multus-data-values.yaml
    
  4. tanzu package install을 실행하여 패키지를 설치합니다.

    tanzu package install multus-cni --package multus-cni.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file multus-data-values.yaml --namespace TARGET-NAMESPACE
    

    여기서:

    • TARGET-NAMESPACE는 Multus 패키지를 설치하려는 네임스페이스입니다. 예: my-packages 또는 tanzu-cli-managed-packages 네임스페이스.

      • --namespace 플래그가 지정되지 않은 경우 Tanzu CLI는 default 네임스페이스에 패키지를 설치합니다.
      • 지정된 네임스페이스가 이미 존재해야 합니다(예: kubectl create namespace my-packages 실행).
    • AVAILABLE-PACKAGE-VERSION은 위에서 검색한 버전(예: 4.0.1+vmware.1-tkg.1)입니다.
  5. tanzu package installed get을 실행하여 설치된 패키지의 상태를 확인합니다.

    tanzu package installed get multus-cni --namespace NAMESPACE
    
  6. Multus CNI에서 사용할 네트워크 인터페이스의 CNI 구성을 정의하는 NetworkAttachmentDefinition의 사용자 지정 리소스 정의(CRD)를 생성합니다.

    1. CRD 규격을 생성합니다. 예를 들어 이 multus-cni-crd.yamlmacvlan CNI를 구성하고 macvlan-conf라는 NetworkAttachmentDefinition을 지정합니다.

      ---
      apiVersion: "k8s.cni.cncf.io/v1"
      kind: NetworkAttachmentDefinition
      metadata:
        name: macvlan-conf
      spec:
        config: '{
          "cniVersion": "0.3.0",
          "type": "macvlan",
          "master": "ens5",
          "mode": "bridge",
          "ipam": {
            "type": "host-local",
            "subnet": "192.168.1.0/24",
            "rangeStart": "192.168.1.200",
            "rangeEnd": "192.168.1.216",
            "routes": [
              { "dst": "0.0.0.0/0" }
              ],
            "gateway": "192.168.1.1"
          }
        }'
      
    2. 리소스를 생성합니다. 예: kubectl create -f multus-cni-crd.yaml

  7. 쉼표로 구분된 NetworkAttachmentDefinition 사용자 지정 리소스 이름 목록을 사용하는 주석 k8s.v1.cni.cncf.io/networks를 사용하여 포드를 생성합니다.

    1. 포드 규격을 생성합니다. 예: my-multi-cni-pod.yaml:

      apiVersion: v1
      kind: Pod
      metadata:
        name: sample-pod
        annotations:
          k8s.v1.cni.cncf.io/networks: macvlan-conf
      spec:
        securityContext:
          runAsUser: 1000
          runAsGroup: 3000
          fsGroup: 2000
          seccompProfile:
            type: RuntimeDefault
          runAsNonRoot: true
        containers:
        - name: sample-pod
          image: harbor-repo.vmware.com/dockerhub-proxy-cache/library/busybox:1.28
          command: [ "sh", "-c", "sleep 1h" ]
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop:
              - ALL
      
    2. 포드를 생성합니다. 예를 들어 kubectl create -f my-multi-cni-crd.yaml은 포드 sample-pod를 생성합니다.

포드가 생성되면 다음과 같은 세 가지 네트워크 인터페이스가 있습니다.

  • lo 루프백 인터페이스
  • eth0 Antrea 또는 Calico CNI에서 관리하는 기본 포드 네트워크
  • net1 주석 k8s.v1.cni.cncf.io/networks: macvlan-conf를 통해 생성된 새 인터페이스.
참고

기본 네트워크에는 eth0이라는 이름이 지정되고 추가 네트워크 포드 인터페이스에는 net1, net2 등의 이름이 지정됩니다.

Multus 검증

포드에서 kubectl describe pod를 실행하고, 주석 k8s.v1.cni.cncf.io/network-status가 모든 네트워크 인터페이스를 표시하는지 확인합니다. 예:

$ kubectl describe pod sample-pod

Name:         sample-pod
Namespace:    default
Priority:     0
Node:         tcecluster-md-0-6476897f75-rl9vt/10.170.109.225
Start Time:   Thu, 27 May 2021 15:31:20 +0000
Labels:       <none>
Annotations:  k8s.v1.cni.cncf.io/network-status:
                [{
                    "name": "",
                    "interface": "eth0",
                    "ips": [
                        "100.96.1.80"
                    ],
                    "mac": "66:39:dc:63:50:a3",
                    "default": true,
                    "dns": {}
                },{
                    "name": "default/macvlan-conf",
                    "interface": "net1",
                    "ips": [
                        "192.168.1.201"
                    ],
                    "mac": "02:77:cb:a0:60:e3",
                    "dns": {}
                }]
              k8s.v1.cni.cncf.io/networks: macvlan-conf

그런 다음 kubectl exec sample-pod -- ip a show dev net1을 실행하여 대상 인터페이스가 위의 주석에 나열된 IP로 실행 중인지 확인합니다.

지원되지 않는 Multus 삭제

클러스터에 Multus CNI가 설치되면 삭제하면 안 됩니다.

Multus를 삭제해도 CNI 스크립트 디렉토리에서 Multus 구성 파일 /etc/cni/net.d/00-multus.conf가 제거되지 않아 다음과 같은 문제가 발생할 수 있습니다.

  • 새 포드를 생성하지 못합니다. 이는 알려진 문제입니다. Multus 저장소에서 문제 #461을 참조하십시오.
  • Multus가 삭제되기 전에 생성된 포드를 삭제하지 못합니다. 포드는 kubelet 로그에 오류와 함께 Terminating 상태로 유지됩니다.
check-circle-line exclamation-circle-line close-line
Scroll to top icon