Multus CNI は Kubernetes 用のコンテナ ネットワーク インターフェイス (CNI) プラグインで、複数のネットワーク インターフェイスを 1 つのポッドに接続し、それぞれを異なるアドレス範囲を関連付けることができます。
このトピックでは、Multus パッケージをスタンドアローン管理クラスタによって展開されたワークロード クラスタにインストールし、それを使用して複数のネットワーク インターフェイスを持つポッドを作成する方法について説明します。たとえば、プライマリ CNI としての Antrea または Calico、およびハードウェアまたはアクセラレーション インターフェイス用の macvlan、ipvlan、SR-IOV、DPDK デバイスなどのセカンダリ インターフェイスなどです。
macvlan および ipvlan のバイナリは、ワークロード クラスタ ノード テンプレートにすでにインストールされています。
注Multus CNI は、vSphere with Tanzu スーパーバイザーによって展開されたワークロード クラスタではサポートされていません。
kubectl
(「スタンドアローン管理クラスタで使用する Tanzu CLI と Kubernetes CLI のインストール」を参照)。large
または extra-large
のワークロード クラスタ ワーカー ノードが必要です。注Multus CNI がクラスタにインストールされた後は、削除しないでください。後述の「Multus の削除はサポート対象外」を参照してください。
ワークロード クラスタに Multus CNI パッケージをインストールし、それを使用するようにクラスタを構成するには、次の手順を実行します。
クラスタに、tanzu-standard
リポジトリなどの Multus CNI パッケージがインストールされたパッケージ リポジトリがない場合は、次の方法でインストールします。
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)] リストを参照してください。(オプション)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 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
注ネットワークが制限された環境で動作している場合は、カスタム イメージ レジストリにアクセスできることを確認します。
--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
は、前述の手順で取得したバージョンです。例:4.0.1+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:
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
ポッドを作成します。たとえば、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 スクリプト ディレクトリからアンインストールされないため、次のような問題が発生します。
Terminating
で停止し続け、kubelet
ログにエラーが記録されます。