Kubernetes に Multus CNI を導入し、Pod に追加ネットワークを接続する考え方を整理します。Multus はデフォルト CNI を置き換えるものではなく、primary CNI の上で secondary CNI を扱うためのメタプラグインです。
この記事の位置づけ
この記事は、Pod に複数のネットワークインターフェースを持たせるための Multus 導入記事です。導入コマンドだけではなく、primary CNI、NetworkAttachmentDefinition、secondary CNI、IPAM、ノード側 NIC の関係を分けて見ます。
関連する記事
- Kubernetes Multus がうまく動かない時に考えること – CNI を複数持つ難しさ
Multus 導入後に崩れやすい点を、primary / secondary CNI の責務から整理しています。 - Kubernetes Calico eBPF の設計メモ – kube-proxy 代替、DualStack、高可用性をどう見るか
primary CNI とデータプレーン側の設計を確認できます。 - Kubernetes NetworkPolicy で Pod のアウトバウンド通信を制御する – egress と CNI を分けて考える
NetworkPolicy と CNI 実装の関係を整理した記事です。 - Kubernetes で送信元アドレスが変わる問題 – externalTrafficPolicy、hostNetwork、BGP 経路広告で考える
Pod や Service の経路設計を考える補助記事です。 - Kubernetes 運用設計ガイド
Kubernetes 関連記事全体の入口です。
次に進む
- Kubernetes Multus がうまく動かない時に考えること – CNI を複数持つ難しさ
導入後に起きやすい問題と切り分けへ進みます。 - Kubernetes Calico eBPF の設計メモ – kube-proxy 代替、DualStack、高可用性をどう見るか
primary CNI とデータプレーン側の設計へ戻って確認します。
参考書籍
書籍
Kubernetes の仕組み、リソース、ネットワーク、運用観点を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
Multus の位置づけ
通常の Pod は、クラスタの primary CNI から 1 つの Pod IP を受け取ります。Multus を使うと、それに加えて macvlan、ipvlan、bridge、SR-IOV などの secondary CNI を Pod に割り当てられます。
- primary CNI は通常の Pod ネットワークを担当する
- Multus は追加ネットワークを割り当てるためのメタ CNI として動く
- NetworkAttachmentDefinition で追加ネットワークを定義する
- Pod annotation で利用する追加ネットワークを指定する
- IPAM、経路、ノード側 NIC は環境ごとに設計する
導入前に確認すること
Multus は Pod ネットワークの土台に関わるため、検証環境で動いたからといって本番にそのまま入れるものではありません。導入前に、既存 CNI、追加ネットワーク用 CNI、ノード側 NIC、IPAM、NetworkPolicy の扱いを確認します。
- 既存の primary CNI が正常に動いていること
- 追加ネットワーク用 CNI のバイナリと設定を用意できること
- ノードごとの NIC 名が揃っている、または差分を吸収できること
- 追加ネットワークの IPAM と経路を設計していること
- NetworkPolicy が primary CNI 側と追加ネットワーク側のどちらに効くのかを理解していること
インストール
Multus は DaemonSet として導入します。利用するマニフェストは環境やバージョンに合わせて確認します。ここでは導入の流れを示すための例として扱います。
kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset-thick.yml
kubectl -n kube-system get pod -l app=multus -o wideNetworkAttachmentDefinition
追加ネットワークは NetworkAttachmentDefinition として定義します。以下は macvlan の例です。実際の master はノード側の NIC 名に合わせます。ノードごとに NIC 名が異なる場合、この例をそのまま使うと破綻します。
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-net
spec:
config: |
{
"cniVersion": "0.3.1",
"type": "macvlan",
"master": "ens37",
"mode": "bridge",
"ipam": {
"type": "host-local",
"ranges": [[{"subnet": "192.0.2.0/24", "rangeStart": "192.0.2.100", "rangeEnd": "192.0.2.120"}]],
"routes": [{"dst": "0.0.0.0/0"}]
}
}macvlan は L2 に近い追加ネットワークを Pod に持たせる場合に使えますが、ノード側 NIC、上位スイッチ、IPAM、経路設計の影響を受けます。Kubernetes の Service と同じ感覚で扱うものではありません。
Pod への割り当て
Pod には annotation で利用する追加ネットワークを指定します。primary CNI による通常の Pod IP に加えて、Multus が追加 NIC を付与します。
apiVersion: v1
kind: Pod
metadata:
name: multus-test
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-net
spec:
containers:
- name: alpine
image: alpine:latest
command: ["sleep", "infinity"]kubectl apply -f multus-test.yaml
kubectl get pod multus-test -o wide
kubectl exec -it multus-test -- ip addr
kubectl describe pod multus-test追加 NIC が見えない場合は、Pod のイベント、Multus のログ、NetworkAttachmentDefinition、ノード上の CNI 設定ファイルを確認します。
導入後の確認ポイント
kubectl get network-attachment-definitions -A
kubectl get pods -n kube-system -o wide
kubectl logs -n kube-system -l app=multus
ls -l /etc/cni/net.dMultus の導入では、Pod が起動するかだけでなく、再起動後にも同じ状態で動くかを確認します。CNI 設定はノード起動時の順序やファイル配置に影響されるため、導入直後だけで判断しない方が安全です。
まとめ
Multus は、Pod ネットワークとは別の L2 / L3 ネットワークへ Pod を接続したい場合に有効です。ただし、物理 NIC、IPAM、ノード配置、NetworkAttachmentDefinition、secondary CNI に依存するため、通常の Service 設計より運用上の制約は強くなります。
まず primary CNI が安定していることを確認し、その上で追加ネットワークを本当に必要とする Pod だけに Multus を使う、という考え方が安全です。

