Multus CNI は Kubernetes 用のコンテナ ネットワーク インターフェイス (CNI) プラグインで、複数のネットワーク インターフェイスを 1 つのポッドに接続し、それぞれを異なるアドレス範囲を関連付けることができます。
このトピックでは、Multus パッケージをスタンドアローン管理クラスタによって展開されたワークロード クラスタにインストールし、それを使用して複数のネットワーク インターフェイスを持つポッドを作成する方法について説明します。たとえば、プライマリ CNI としての Antrea または Calico、およびハードウェアまたはアクセラレーション インターフェイス用の macvlan、ipvlan、SR-IOV、DPDK デバイスなどのセカンダリ インターフェイスなどです。
macvlan および ipvlan のバイナリは、ワークロード クラスタ ノード テンプレートにすでにインストールされています。
注Multus CNI は、vSphere with Tanzu スーパーバイザーによって展開されたワークロード クラスタではサポートされていません。
kubectl
。large
または extra-large
のワークロード クラスタ ワーカー ノードが必要です。注Multus CNI がクラスタにインストールされた後は、削除しないでください。後述の「Multus の削除はサポート対象外」を参照してください。
ワークロード クラスタに Multus CNI パッケージをインストールし、それを使用するようにクラスタを構成するには、次の手順を実行します。
クラスタに standard
パッケージ リポジトリがまだインストールされていない場合は、インストールします。
注プランベースのクラスタ(レガシー)をターゲットとする場合は、この手順をスキップします。プランベースのクラスタの場合は、
tanzu-standard
パッケージ リポジトリは、すべてのクラスタのtanzu-package-repo-global
名前空間で自動的に有効になります。
tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
ここで、PACKAGE-REPOSITORY-ENDPOINT
は standard
パッケージ リポジトリの URL です。このリリースでは、URL は projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1
です。
Tanzu CLI からこの値を取得するには、「パッケージ リポジトリの一覧表示」を参照してください。また、Tanzu Mission Control では [クラスタ (Cluster)] ペインの [アドオン (Addons)] > [リポジトリ (Repositories)] リストを参照してください。
(オプション)Multus を構成するには、次の手順を実行します。
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
パラメータを参照してください。
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
注ネットワークが制限された環境で動作している場合は、カスタム イメージ レジストリにアクセスできることを確認します。
--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
に表示されるバージョンです
multus-data-values.yaml
構成ファイルに必要なフィールド値を入力します。
multus-data-values.yaml
ファイルからすべてのコメントを削除します。
yq -i eval '... comments=""' multus-data-values.yaml
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.1-tkg.1
。tanzu package installed get
を実行して、インストール済みパッケージのステータスを確認します。
tanzu package installed get multus-cni --namespace NAMESPACE
NetworkAttachmentDefinition
のカスタム リソース定義 (CRD) を作成して、Multus CNI が使用するネットワーク インターフェイスの CNI 構成を定義します。
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"
}
}'
リソースを作成します(例:kubectl create -f multus-cni-crd.yaml
)。
注釈 k8s.v1.cni.cncf.io/networks
を使用してポッドを作成します。これにより、NetworkAttachmentDefinition
カスタム リソースの名前のカンマ区切りリストが取得されます。
ポッド仕様を作成します(例: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
ポッドを作成します。たとえば、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
という名前を取得し、追加のネットワーク ポッド インターフェイスはnet1
、net2
などの名前を取得します。
ポッドで 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 CNI がクラスタにインストールされた後は、削除しないでください。
Multus を削除しても、/etc/cni/net.d/00-multus.conf
構成ファイルが CNI スクリプト ディレクトリからアンインストールされないため、クラスタは新しいポッドを作成できません。
これは既知の問題です。Multus リポジトリの問題 #461 を参照してください。