ワークロード クラスタでの Whereabouts を使用した Multus の展開

Whereabouts は IP アドレス管理 (IPAM) CNI プラグインで、クラスタ内のすべてのノードのポッドに IP アドレスを動的に割り当てます。同じノード上のポッドにのみ IP アドレスを割り当てる host-local などのその他の IP アドレス管理プラグインと比べて、whereabouts はクラスタ全体に IP アドレスを割り当てます。

このトピックでは、whereabouts を使用して指定した範囲内で IP アドレスが割り当てられたポッドにセカンダリ ネットワーク インターフェイスを接続する方法について説明します。たとえば、プライマリ CNI として Antrea または Calico、macvlan または ipvlan を使用して作成されたセカンダリ インターフェイス、および IP アドレス管理 CNI としての Whereabouts を指定します。

前提条件

Whereabouts パッケージのインストール

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

  1. Whereabout を構成してインストールします。

    1. Whereabouts パラメータを取得する構成ファイルを作成します。

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

      whereabouts コンポーネントを展開する名前空間は kube-system である必要があります。カスタマイズされた名前空間のインストールは失敗します。

      ここで、PACKAGE-VERSION はインストールする Whereabouts パッケージのバージョンで、FILE-PATHwhereabouts-data-values.yaml などの構成ファイルを保存する場所です。上記のコマンドを実行すると、デフォルト値を含む whereabouts-data-values.yaml という名前の構成ファイルが作成されます。

    2. 次のように、tanzu package available list コマンドを実行して、Whereabouts パッケージの使用可能なバージョンを一覧表示します。

      tanzu package available list whereabouts.tanzu.vmware.com -A
       NAME                           VERSION               RELEASED-AT                     NAMESPACE
       whereabouts.tanzu.vmware.com   0.6.1+vmware.2-tkg.1  2023-30-04 18:00:00 +0000 UTC   tanzu-package-repo-global
      
      

      ネットワークが制限された環境で動作している場合は、カスタム イメージ レジストリにアクセスできることを確認します。

    3. --values-schema を使用して tanzu package available get コマンドを実行し、設定可能なフィールド値を確認します。

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

      ここで、- VERSION は、tanzu package available list 出力 - FORMAT は、yaml または json に表示されるバージョンです

    4. whereabouts-data-values.yaml 構成ファイルに必要なフィールド値を入力します。

  2. whereabouts-data-values.yaml ファイルからすべてのコメントを削除します。

    yq -i eval '... comments=""' whereabouts-cni-default-values.yaml
    
  3. tanzu package install を実行してパッケージをインストールします。

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

    ここで、

    • TARGET-NAMESPACE は、Whereabouts パッケージをインストールする名前空間です。たとえば、my-packages または tanzu-cli-managed-packages 名前空間などです。

      • --namespace フラグが指定されていない場合、Tanzu CLI は default 名前空間にパッケージをインストールします。
      • 指定された名前空間は、たとえば kubectl create namespace my-packages を実行することによってすでに存在している必要があります。
    • AVAILABLE-PACKAGE-VERSION は、前述の手順で取得したバージョンです。例:0.6.1+vmware.2-tkg.1
  4. tanzu package installed get を実行して、インストール済みパッケージのステータスを確認します。

    tanzu package installed get whereabouts -o <json|yaml|table>
    
  5. NetworkAttachmentDefinition のカスタム リソース定義 (CRD) を作成します。この CRD は、Whereabouts を IP アドレス管理タイプとして使用する Multus CNI で使用されるネットワーク インターフェイスの CNI 構成を定義します。

    1. CRD 仕様を作成します。たとえば、この multus-cni-crd.yaml は、macvlan CNI を構成し、whereabouts を IP アドレス管理タイプとして持つ macvlan-conf という名前の NetworkAttachmentDefinition を指定します。

      ---
      apiVersion: "k8s.cni.cncf.io/v1"
      kind: NetworkAttachmentDefinition
      metadata:
        name: macvlan-conf
      spec:
        config: '{
          "cniVersion": "0.3.1",
          "plugins": [
            {
            "type": "macvlan",
            "capabilities": { "ips": true },
            "master": "eth0",
            "mode": "bridge",
            "ipam": {
              "type": "whereabouts",
              "range": "192.168.20.0/24",
              "range_start": "192.168.20.10",
              "range_end": "192.168.20.100",
              "gateway": "192.168.20.1"
              }
            } ]
          }'
      
    2. リソースを作成します(例:kubectl create -f multus-cni-crd.yaml)。

  6. 注釈 k8s.v1.cni.cncf.io/networks を使用してポッドを作成し、追加するネットワークを指定します。

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

      apiVersion: v1
      kind: Pod
      metadata:
        name: pod0
        annotations:
          k8s.v1.cni.cncf.io/networks: macvlan-conf
      spec:
        containers:
        - name: pod0
          command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
          image: docker.io/kserving/tools:latest
      
      
    2. ポッドを作成します。たとえば、kubectl create -f my-multi-cni-crd.yaml はポッド pod0 を作成します。

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

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

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

    4. pod0kubectl describe pod を実行し、注釈 k8s.v1.cni.cncf.io/network-status にすべてのネットワーク インターフェイスが一覧表示されていることを確認します。

      例:

      $ kubectl describe pod pod0
      
      Name:         pod0
      Namespace:    default
      Priority:     0
      Node:         tcecluster-md-0-6476897f75-rl9vt/10.170.109.225
      Start Time:   Thu, 25 August 2022 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.20.11"
                         ],
                         "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 アドレスを使用してターゲット インターフェイスが起動し、実行されているかどうかを確認します。この手順を繰り返して、次の手順で作成する他のポッドの構成を検証します。

  7. 同じノードに pod1、別のノードに pod2 の 2 つの追加ポッドを作成します。これらのポッドを使用して、クラスタ全体の単一ノードおよびノード内のネットワーク アクセスを確認します。

クラスタ全体のポッド間のネットワーク トラフィックの検証

同じノード内のポッドとクラスタ全体のポッド間のネットワーク アクセスを確認できるようになりました。

  1. 同じノード上のポッド間のネットワーク アクセスが機能することを確認します。たとえば、次のコマンドは、pod0 が割り当てられた IP アドレスを介して pod1 にアクセスできることを確認します。

      kubectl exec -it pod0 -- ping -c 3 192.168.20.12
      PING 192.168.20.12 (192.168.20.12) 56(84) bytes of data.
      64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.237 ms
      64 bytes from 192.168.20.12: icmp_seq=2 ttl=64 time=0.215 ms
      64 bytes from 192.168.20.12: icmp_seq=3 ttl=64 time=0.156 ms
    
    --- 192.168.20.12 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2030ms
    rtt min/avg/max/mdev = 0.156/0.202/0.237/0.037 ms
    
  2. 異なるノードのポッド間のネットワーク アクセスが機能することを確認します。たとえば、次のコマンドは、pod0 が割り当てられた IP アドレスを介して pod2 にアクセスできることを確認します。

      kubectl exec -it pod0 -- ping -c 3 <192.168.20.13
      PING 192.168.20.13 (192.168.20.13) 56(84) bytes of data.
      64 bytes from 192.168.20.13: icmp_seq=1 ttl=64 time=0.799 ms
      64 bytes from 192.168.20.13: icmp_seq=2 ttl=64 time=0.626 ms
      64 bytes from 192.168.20.13: icmp_seq=3 ttl=64 time=0.655 ms
    
    --- 192.168.20.13 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2030ms
    rtt min/avg/max/mdev = 0.626/0.693/0.799/0.078 ms
    
check-circle-line exclamation-circle-line close-line
Scroll to top icon