OpenShift Virtualization の物理 NIC に VLAN サブインタフェース を設定してみよう!

※本記事は OpenShift Virtualization アドベントカレンダーの 21 日目の記事です。

qiita.com

こんにちは、OpenShift のプリセールスを担当している山川です。

今回は、OpenShift Virtualization の物理 NIC に VLAN サブインタフェースを設定してみたいと思います。 また、Worker Node とストレージアプライアンス間でストレージセッションを張る際などに利用される物理 NIC に対して IP アドレスをアサインする必要があるユースケースを想定し、VLAN サブインタフェースに IP アドレスも設定してみます。

VMware だと VMkernel ポートを利用しながら進めますが、OpenShift Virtualization の場合、本設定で、仮想マシンのライブマイグレーション用ネットワーク、Migration Toolkit for Virtualization でデータ転送を行うネットワーク、iSCSI や NFS で外部のストレージアプライアンスのネットワーク設定を進めます。

なお、ストレージアプライアンスとの接続に関しては、ストレージメーカーがサポートする CSI ドライバーの仕様によって、セカンダリネットワークが利用可能かどうかをチェックしていただく必要があります。 ネットワークを何も意識せずに CSI ドライバーをインストールしていただくと、デフォルトでプライマリネットワークが利用されるケースがほとんどです。

また、セカンダリネットワークが利用が可能な場合、OpenShift がサポートする CNI プラグイン (bridge、ovs bridge、macvlan 等) が何かを確認いただく必要がございます。 CNI プラグインによってネットワークの挙動が変わるため、各マニュアルを参照しながら用途との互換性を確認するようお願いします。

CNI プラグインについては、下記のドキュメントを参照ください。

3.2. 他の CNI プラグインを使用したセカンダリーネットワークの作成 | 複数ネットワーク | OpenShift Container Platform | 4.20 | Red Hat Documentation

ライブマイグレーション用ネットワークを設定する方法については、下記をご参照ください。

10.14. ライブマイグレーション用の専用ネットワークの設定 | Virtualization | OpenShift Container Platform | 4.20 | Red Hat Documentation

Migration Toolkit for Virtualization 用ネットワークを設定する方法については、下記をご参照ください。

10.7. OpenShift Virtualization プロバイダーの移行ネットワークの選択 | Red Hat OpenShift Virtualization への移行の計画 | Migration Toolkit for Virtualization | 2.10 | Red Hat Documentation

利用するネットワーク関連のリソース

利用するリソースは、下記ブログと同じく NodeNetworkConfigulationPolicy (NNCP) と NetworkAttachmentDefinition (NAD) を利用します。 rheb.hatenablog.com

NNCP を用いると、NIC 冗長化 (bond)、VLAN サブインタフェース、Bridge の作成、VLAN サブインタフェースに割り当てる静的 IP アドレスの設定が可能です。 NAD を用いると、各ユースケースで必要な機能を実現するための Pod (コンテナ) と VLAN サブインタフェース経由で外部ネットワーク通信とさせることが可能です。

それでは実際に設定を入れていきたいと思います。 今回は、仮想 L2 スイッチの挙動をする bridge type の CNI プラグインを利用し、VLAN サブインタフェースを設定しています。

VLAN サブインタフェースの設定

冗長化したいインタフェースの bond、VLAN サブインタフェース bond.vlanid、および Linux Bridge を作成するための yaml ファイルを用意し、oc apply -f .yaml コマンドを実行します。 VLAN サブインタフェースごとに IP アドレスを指定する場合は、Worker Node に個別の IP アドレスを指定する必要があるため、設定が必要な Worker Node 分の NNCP の設定ファイルを用意しましょう。

なお、NIC の冗長化が不要な場合は bond セクションに記載の内容をスキップし、vlan サブインタフェースのセクションに物理インタフェースの名前を設定します。

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: bridge-vlan20-worker-01
spec:
  nodeSelector:
    kubernetes.io/hostname: "worker-01.domain" # Worker Node の FQDN を設定  
  desiredState:
    interfaces:
      - name: bond1  # bond を作成
        type: bond # type を bond と指定
        state: up
        link-aggregation:
          mode: 802.3ad # 802.3ad (LACP) mode の設定例
          options:
            miimon: '100' # リンク監視 (故障検知) の間隔を指定
          port:
            - ens2f0 # 冗長化したい物理 NIC の1 つ目を指定
            - ens3f0 # 冗長化したい物理 NIC の2 つ目を指定
      - name: bond1.20 # VLAN サブインタフェースを作成
        type: vlan
        state: up
        vlan:
          base-iface: bond1
          id: 20 # VLAN ID を指定
      - name: br-vlan20 # Linux Bridge を作成。NAD で macvlan、ipvlan 等を選択する場合は不要。
        type: linux-bridge
        state: up
        bridge:
          port:
          - name: bond0.20
        ipv4:
          enabled: true
          address:
          - ip: 192.168.0.20  # ノードに割り当てるIPアドレスをして
            prefix-length: 24

次に NAD を設定します。

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: bridge-vlan20-network
  namespace: default
spec:
  config: |-
    {
      "cniVersion": "0.4.0",
      "name": "bridge-vlan20-network",
      "type": "bridge", # linux bridge の場合は bridge type を指定
      "bridge": "br-vlan20", # NNCP で作成した bridge name を指定
      "master": "bond1.20",  # NNCP で作成した VLAN インタフェースを指定
    }

一般的には、今回作成した VLAN サブインタフェース経由での通信が必要な Pod の metadata.annotations に NAD の metadata.name を指定いただくことが必要になると思います。 ただし、設定方法は Operator によって異なっている可能性があるため、各機能の設定マニュアルを注意深く読んでいただくことを推奨します。

今回の設定は、Pod と外部のネットワークセグメントが 1 つであることが前提でした。 別のネットワークへのルーティングが必要な場合は、Next Hop を指定する設定を追加していく必要がありますが、今回は割愛しています。

まとめ

今回は、VLAN サブインタフェースの設定方法について見てみました。 物理 NIC の用途を分けたいユーザーには必須の知識になると思いますので、ぜひ、内容をキャッチアップください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。