4.3.4. ネットワーク VRF を介したサービスの公開
ネットワークトラフィックを分離し、複数のルーティングテーブルを管理するには、仮想ルーティングおよび転送 (VRF) インスタンスを介してサービスを公開します。VRF を MetalLB BGP ピアに関連付けることで、外部トラフィックがセグメント化され、意図したアプリケーションワークロードに正しくルーティングされることが保証されます。
BGP ピア上の VRF を介したサービスの公開は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
ネットワークインターフェイス上で VRF を使用して BGP ピア経由でサービスを公開すると、サービスへのトラフィックを分離し、独立したルーティング決定を設定し、ネットワークインターフェイス上でマルチテナントのサポートを有効化できます。
ネットワーク VRF に属するインターフェイスを通じて BGP セッションを確立すると、MetalLB はそのインターフェイスを通じてサービスをアドバタイズし、外部トラフィックがこのインターフェイスを通じてサービスに到達させることができます。ただし、ネットワーク VRF ルーティングテーブルは、OVN-Kubernetes で使用されるデフォルトの VRF ルーティングテーブルとは異なります。したがって、トラフィックは OVN-Kubernetes ネットワークインフラストラクチャーに到達できません。
サービスに送信されたトラフィックが OVN-Kubernetes ネットワークインフラストラクチャーに到達できるようにするには、ルーティングルールを設定してネットワークトラフィックのネクストホップを定義する必要があります。詳細は、関連情報 セクションの 「MetalLB を使用した対称ルーティングの管理」の NodeNetworkConfigurationPolicy リソースを参照してください。
以下の大まかな手順は、BGP ピアを持つネットワーク VRF を介してサービスを公開する方法を示しています。
- BGP ピアを定義し、ネットワーク VRF インスタンスを追加します。
- MetalLB の IP アドレスプールを指定します。
- MetalLB が指定された IP アドレスプールと VRF インスタンスに関連付けられた BGP ピアを使用してルートをアドバタイズするように、BGP ルートアドバタイズを設定します。
- サービスをデプロイして設定をテストします。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 -
Virtual Routing and Forwarding (VRF) インスタンスをネットワークインターフェイスに関連付けるために、
NodeNetworkConfigurationPolicy(NNCP) を定義しました。この前提条件を満たす方法の詳細は、関連情報 セクションを参照してください。 - MetalLB をクラスターにインストールした。
手順
BGPPeerカスタムリソース (CR) を作成します。次の例のような内容を含むファイル
(frrviavrf.yamlなど) を作成します。apiVersion: metallb.io/v1beta2 kind: BGPPeer metadata: name: frrviavrf namespace: metallb-system spec: myASN: 100 peerASN: 200 peerAddress: 192.168.130.1 vrf: ens4vrf # ...spec.vrf:BGP ピアに関連付けるネットワーク VRF インスタンスを指定します。MetalLB は、サービスをアドバタイズし、VRF 内のルーティング情報に基づいてルーティングを決定できます。注記このネットワーク VRF インスタンスは
NodeNetworkConfigurationPolicyCR で設定する必要があります。詳細は、関連情報 を参照してください。次のコマンドを実行して、BGP ピアの設定を適用します。
$ oc apply -f frrviavrf.yaml
IPAddressPoolCR を作成します。次の例のような内容を含むファイル (
first-pool.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 192.169.10.0/32 # ...次のコマンドを実行して、IP アドレスプールの設定を適用します。
$ oc apply -f first-pool.yaml
BGPAdvertisementCR を作成します。次の例のような内容を含むファイル (
first-adv.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: first-adv namespace: metallb-system spec: ipAddressPools: - first-pool peers: - frrviavrf # ...peers.frrviavrf: この例では、MetalLB はfirst-poolIP アドレスプールから、frrviavrfBGP ピアに IP アドレスの範囲をアドバタイズします。次のコマンドを実行して、BGP アドバタイズメントの設定を適用します。
$ oc apply -f first-adv.yaml
Namespace、Deployment、およびServiceCR を作成します。次の例のような内容を含むファイル (
deploy-service.yamlなど) を作成します。apiVersion: v1 kind: Namespace metadata: name: test --- apiVersion: apps/v1 kind: Deployment metadata: name: server namespace: test spec: selector: matchLabels: app: server template: metadata: labels: app: server spec: containers: - name: server image: nginx ports: - name: http containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: server1 namespace: test spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: server type: LoadBalancer # ...次のコマンドを実行して、namespace、デプロイメント、およびサービスの設定を適用します。
$ oc apply -f deploy-service.yaml
検証
次のコマンドを実行して、MetalLB スピーカー Pod を識別します。
$ oc get -n metallb-system pods -l component=speaker出力例
NAME READY STATUS RESTARTS AGE speaker-c6c5f 6/6 Running 0 69m次のコマンドを実行して、BGP セッションの状態がスピーカー Pod で
Establishedとなっていることを確認します。設定に一致するように変数を置き換えます。$ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> neigh"出力例
BGP neighbor is 192.168.30.1, remote AS 200, local AS 100, external link BGP version 4, remote router ID 192.168.30.1, local router ID 192.168.30.71 BGP state = Established, up for 04:20:09 ...次のコマンドを実行して、サービスが正しくアドバタイズされていることを確認します。
$ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> ipv4"