※本記事は OpenShift Virtualization アドベントカレンダーの 21 日目の記事です。
こんにちは、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 プラグインについては、下記のドキュメントを参照ください。
ライブマイグレーション用ネットワークを設定する方法については、下記をご参照ください。
Migration Toolkit for Virtualization 用ネットワークを設定する方法については、下記をご参照ください。
利用するネットワーク関連のリソース
利用するリソースは、下記ブログと同じく 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 の用途を分けたいユーザーには必須の知識になると思いますので、ぜひ、内容をキャッチアップください。