ワークロード クラスタへの Multus の展開

Multus CNI は Kubernetes 用のコンテナ ネットワーク インターフェイス (CNI) プラグインで、複数のネットワーク インターフェイスを 1 つのポッドに接続し、それぞれを異なるアドレス範囲を関連付けることができます。

このトピックでは、Multus パッケージをスタンドアローン管理クラスタによって展開されたワークロード クラスタにインストールし、それを使用して複数のネットワーク インターフェイスを持つポッドを作成する方法について説明します。たとえば、プライマリ CNI としての Antrea または Calico、およびハードウェアまたはアクセラレーション インターフェイス用の macvlanipvlanSR-IOVDPDK デバイスなどのセカンダリ インターフェイスなどです。

macvlan および ipvlan のバイナリは、ワークロード クラスタ ノード テンプレートにすでにインストールされています。

Multus CNI は、vSphere with Tanzu スーパーバイザーによって展開されたワークロード クラスタではサポートされていません。

前提条件

Multus CNI パッケージのインストール

Multus CNI がクラスタにインストールされた後は、削除しないでください。後述の「Multus の削除はサポート対象外」を参照してください。

ワークロード クラスタに Multus CNI パッケージをインストールし、それを使用するようにクラスタを構成するには、次の手順を実行します。

  1. クラスタに、tanzu-standard リポジトリなどの Multus CNI パッケージがインストールされたパッケージ リポジトリがない場合は、次の方法でインストールします。

    プランベースのクラスタ(レガシー)をターゲットとする場合は、この手順をスキップします。プランベースのクラスタの場合は、tanzu-standard パッケージ リポジトリは、すべてのクラスタの tanzu-package-repo-global 名前空間で自動的に有効になります。

    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:v2.2.0 です。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-PATHmultus-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 3.7.1+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.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
      

      ここで、- VERSION は、tanzu package available list 出力 - FORMAT は、yaml または 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 は、前述の手順で取得したバージョンです。例:3.8.0+vmware.3-tkg.1
  5. tanzu package installed get を実行して、インストール済みパッケージのステータスを確認します。

    tanzu package installed get multus-cni --namespace NAMESPACE
    
  6. NetworkAttachmentDefinition のカスタム リソース定義 (CRD) を作成して、Multus CNI が使用するネットワーク インターフェイスの CNI 構成を定義します。

    1. CRD 仕様を作成します。たとえば、この multus-cni-crd.yaml は、macvlan 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. 注釈 k8s.v1.cni.cncf.io/networks を使用してポッドを作成します。これにより、NetworkAttachmentDefinition カスタム リソースの名前のカンマ区切りリストが取得されます。

    1. ポッド仕様を作成します(例:my-multi-cni-pod.yaml)。

      apiVersion: v1
      kind: Pod
      metadata:
        name: sample-pod
        annotations:
          k8s.v1.cni.cncf.io/networks: macvlan-conf
      spec:
        containers:
        - name: sample-pod
          command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
          image: harbor-repo.vmware.com/dockerhub-proxy-cache/library/alpine
      
      
    2. ポッドを作成します。たとえば、kubectl create -f my-multi-cni-crd.yaml はポッド sample-pod を作成します。

ポッドが作成されると、次の 3 つのネットワーク インターフェイスが作成されます。

  • lo:ループバック インターフェイス
  • eth0:Antrea または Calico CNI によって管理されるデフォルトのポッド ネットワーク
  • net1:注釈 k8s.v1.cni.cncf.io/networks: macvlan-conf を介して作成された新しいインターフェイス。

デフォルトのネットワークは eth0 という名前を取得し、追加のネットワーク ポッド インターフェイスは net1net2 などの名前を取得します。

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 を削除しても、/etc/cni/net.d/00-multus.conf 構成ファイルが CNI スクリプト ディレクトリからアンインストールされないため、次のような問題が発生します。

  • 新しいポッドの作成に失敗する。これは既知の問題です。Multus リポジトリの問題 #461 を参照してください。
  • Multus が削除される前に、作成されたポッドの削除に失敗する。ポッドがステータス Terminating で停止し続け、kubelet ログにエラーが記録されます。
check-circle-line exclamation-circle-line close-line
Scroll to top icon