34.10. MetalLB を使用した対称ルーティングの管理
クラスター管理者は、MetalLB、NMState、OVN-Kubernetes の機能を実装することで、複数のホストインターフェイスを備えた MetalLB ロードバランサーサービスの背後にある Pod のトラフィックを効果的に管理できます。このコンテキストでこれらの機能を組み合わせることで、対称ルーティング、トラフィック分離を提供し、重複する CIDR アドレスを持つ異なるネットワーク上のクライアントをサポートできます。
この機能を実現するために、MetalLB を使用して Virtual Routing and Forwarding (VRF) インスタンスを実装し、Egress サービスを設定する方法を説明します。
MetalLB と出力サービスを備えた VRF インスタンスを使用した対称トラフィックの設定は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
34.10.1. MetalLB を使用した対称ルーティング管理の課題
複数のホストインターフェイスで MetalLB を使用すると、MetalLB はホスト上で使用可能なすべてのインターフェイスを通じてサービスを公開し、通知します。これにより、ネットワークの分離、非対称リターントラフィック、CIDR アドレスの重複に関する課題が生じる可能性があります。
戻りトラフィックが正しいクライアントに確実に到達するための 1 つのオプションとして、静的ルートを使用します。ただし、このソリューションでは、MetalLB がサービスを分離して、別のインターフェイスを通じて各サービスを通知できません。さらに、静的ルーティングには手動設定が必要であり、リモートサイトが追加された場合はメンテナンスが必要になります。
外部システムで、アプリケーションの送信元と宛先の IP アドレスが同じである必要があるシナリオなどが、MetalLB サービスの実装時における対称ルーティングのさらなる課題として挙げられます。OpenShift Container Platform のデフォルトの動作では、ホストネットワークインターフェイスの IP アドレスが、Pod から発信されるトラフィックの送信元 IP アドレスとして割り当てられます。これは、複数のホストインターフェイスがある場合に問題になります。
MetalLB、NMState、OVN-Kubernetes の機能を組み合わせた設定を実装することで、これらの課題を克服できます。
34.10.2. MetalLB で VRF を使用した対称ルーティング管理の概要
NMState を使用してホスト上で VRF インスタンスを設定し、VRF インスタンスを MetalLB BGPPeer
リソースに関連付け、OVN-Kubernetes を使用して出力トラフィック用の出力サービスを設定することで、対称ルーティングの実装の課題を克服できます。
図34.2 MetalLB で VRF を使用して対称ルーティングを管理するネットワークの概要

設定プロセスには 3 つの段階が含まれます。
1.VRF とルーティングルールを定義する
-
NodeNetworkConfigurationPolicy
カスタムリソース (CR) を設定して、VRF インスタンスをネットワークインターフェイスに関連付けます。 - VRF ルーティングテーブルを使用して、受信トラフィックと送信トラフィックを送信します。
2. VRF を MetalLB BGPPeer
にリンクする
-
ネットワークインターフェイス上で VRF インスタンスを使用するように MetalLB
BGPPeer
リソースを設定します。 -
BGPPeer
リソースを VRF インスタンスに関連付けることにより、指定されたネットワークインターフェイスが BGP セッションのプライマリーインターフェイスになり、MetalLB はこのインターフェイスを通じてサービスをアドバタイズします。
3.Egress サービスを設定する
- Egress サービスを設定して、Egress トラフィック用の VRF インスタンスに関連付けられたネットワークを選択します。
- オプション: MetalLB ロードバランサーサービスの IP アドレスを Egress トラフィックの送信元 IP として使用するように Egress サービスを設定します。
34.10.3. MetalLB で VRF を使用した対称ルーティングの設定
同じ入力ネットワークパスと Egress ネットワークパスを必要とする MetalLB サービスの背後にあるアプリケーションに対して対称ネットワークルーティングを設定できます。
この例では、VRF ルーティングテーブルを MetalLB および出力サービスに関連付けて、LoadBalancer
サービスの背後にある Pod の Ingress および Egress トラフィックの対称ルーティングを有効にします。
-
EgressService
CR でsourceIPBy: "LoadBalancerIP"
設定を使用する場合は、BGPAdvertisement
カスタムリソース (CR) でロードバランサーノードを指定する必要があります。 -
sourceIPBy: "Network"
設定は、gatewayConfig.routingViaHost
仕様がtrue
に設定された OVN-Kubernetes を使用するクラスターでのみ使用できます。さらに、sourceIPBy: "Network"
設定を使用する場合は、ネットワーク VRF インスタンスで設定されたノード上でアプリケーションワークロードをスケジュールする必要があります。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。 - Kubernetes NMState Operator をインストールします。
- MetalLB Operator がインストールされている。
手順
NodeNetworkConfigurationPolicy
CR を作成して VRF インスタンスを定義します。次の例のような内容を含むファイル (
node-network-vrf.yaml
など) を作成します。apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: vrfpolicy 1 spec: nodeSelector: vrf: "true" 2 maxUnavailable: 3 desiredState: interfaces: - name: ens4vrf 3 type: vrf 4 state: up vrf: port: - ens4 5 route-table-id: 2 6 - name: ens4 7 type: ethernet state: up ipv4: address: - ip: 192.168.130.130 prefix-length: 24 dhcp: false enabled: true routes: 8 config: - destination: 0.0.0.0/0 metric: 150 next-hop-address: 192.168.130.1 next-hop-interface: ens4 table-id: 2 route-rules: 9 config: - ip-to: 172.30.0.0/16 priority: 998 route-table: 254 10 - ip-to: 10.132.0.0/14 priority: 998 route-table: 254
- 1
- ポリシーの名前。
- 2
- この例では、
vrf:true
のラベルが割り当てられたべてのノードにポリシーを適用します。 - 3
- インターフェイスの名前。
- 4
- インターフェイスのタイプ。この例では VRF インスタンスを作成します。
- 5
- VRF が接続されるノードインターフェイス。
- 6
- VRF のルートテーブル ID の名前。
- 7
- VRF に関連付けられたインターフェイスの IPv4 アドレス。
- 8
- ネットワークルートの設定を定義します。
next-hop-address
フィールドは、ルートのネクストホップの IP アドレスを定義します。next-hop-interface
フィールドは、ルートの送信インターフェイスを定義します。この例では、VRF ルーティングテーブルは2
で、EgressService
CR で定義した ID を参照します。 - 9
- 追加のルートルールを定義します。
ip-to
フィールドは、クラスターネットワーク
CIDR およびサービスネットワーク
CIDR と一致する必要があります。これらの CIDR アドレス仕様の値を表示するには、コマンドoc describe network.config/cluster
を実行します。 - 10
- Linux カーネルがルートを計算するときに使用するメインルーティングテーブルの ID は
254
です。
以下のコマンドを実行してポリシーを適用します。
$ oc apply -f node-network-vrf.yaml
BGPPeer
カスタムリソース (CR) を作成します。次の例のような内容を含むファイル (
frr-via-vrf.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 1
- 1
- BGP ピアに関連付ける VRF インスタンスを指定します。MetalLB は、サービスをアドバタイズし、VRF 内のルーティング情報に基づいてルーティングを決定できます。
次のコマンドを実行して、BGP ピアの設定を適用します。
$ oc apply -f frr-via-vrf.yaml
IPAddressPool
CR を作成します。次の例のような内容を含むファイル (
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
BGPAdvertisement
CR を作成します。次の例のような内容を含むファイル (
first-adv.yaml
など) を作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: first-adv namespace: metallb-system spec: ipAddressPools: - first-pool peers: - frrviavrf 1 nodeSelectors: - matchLabels: egress-service.k8s.ovn.org/test-server1: "" 2
次のコマンドを実行して、BGP アドバタイズメントの設定を適用します。
$ oc apply -f first-adv.yaml
EgressService
CR を作成します。次の例のような内容を含むファイル (
egress-service.yaml
など) を作成します。apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: server1 1 namespace: test 2 spec: sourceIPBy: "LoadBalancerIP" 3 nodeSelector: matchLabels: vrf: "true" 4 network: "2" 5
- 1
- Egress サービスの名前を指定します。
EgressService
リソースの名前は、変更するロードバランサーサービスの名前と一致する必要があります。 - 2
- Egress サービスの namespace を指定します。
EgressService
の namespace は、変更するロードバランサーサービスの namespace と一致する必要があります。Egress サービスは namespace スコープです。 - 3
- この例では、
LoadBalancer
サービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てます。 - 4
sourceIPBy
仕様のLoadBalancer
を指定すると、単一ノードがLoadBalancer
サービストラフィックを処理します。この例では、ラベルがvrf: "true"
のノードのみがサービストラフィックを処理できます。ノードを指定しない場合、OVN-Kubernetes はサービストラフィックを処理するワーカーノードを選択します。ノードが選択されると、OVN-Kubernetes はそのノードにegress-service.k8s.ovn.org/<svc_namespace>-<svc_name>: ""
という形式でラベルを付けます。- 5
- Egress トラフィックのルーティングテーブルを指定します。
次のコマンドを実行して、Egress サービスの設定を適用します。
$ oc apply -f egress-service.yaml
検証
次のコマンドを実行して、MetalLB サービスの背後で実行されている Pod のアプリケーションエンドポイントにアクセスできることを確認します。
$ curl <external_ip_address>:<port_number> 1
- 1
- アプリケーションのエンドポイントに合わせて外部 IP アドレスとポート番号を更新します。
-
オプション:
LoadBalancer
サービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てた場合は、tcpdump
などのツールを使用して外部クライアントで受信したパケットを分析し、この設定を確認します。