手当たり次第に書くんだ

飽きっぽいのは本能

Kubernetes Multus の導入 – Pod に複数 NIC を接続する

Kubernetes に Multus CNI を導入し、Pod に追加ネットワークを接続する考え方を整理します。Multus はデフォルト CNI を置き換えるものではなく、primary CNI の上で secondary CNI を扱うためのメタプラグインです。

この記事の位置づけ

この記事は、Pod に複数のネットワークインターフェースを持たせるための Multus 導入記事です。導入コマンドだけではなく、primary CNI、NetworkAttachmentDefinition、secondary CNI、IPAM、ノード側 NIC の関係を分けて見ます。

関連する記事

次に進む

参考書籍

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 wide

NetworkAttachmentDefinition

追加ネットワークは 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.d

Multus の導入では、Pod が起動するかだけでなく、再起動後にも同じ状態で動くかを確認します。CNI 設定はノード起動時の順序やファイル配置に影響されるため、導入直後だけで判断しない方が安全です。

まとめ

Multus は、Pod ネットワークとは別の L2 / L3 ネットワークへ Pod を接続したい場合に有効です。ただし、物理 NIC、IPAM、ノード配置、NetworkAttachmentDefinition、secondary CNI に依存するため、通常の Service 設計より運用上の制約は強くなります。

まず primary CNI が安定していることを確認し、その上で追加ネットワークを本当に必要とする Pod だけに Multus を使う、という考え方が安全です。

Kubernetes Multus の導入 – Pod に複数 NIC を接続する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る