4.7. MetalLB を使用した対称ルーティングの管理
クラスター管理者は、MetalLB、NMState、OVN-Kubernetes の機能を実装することで、複数のホストインターフェイスを備えた MetalLB ロードバランサーサービスの背後にある Pod のトラフィックを効果的に管理できます。このコンテキストでこれらの機能を組み合わせることで、対称ルーティング、トラフィック分離を提供し、重複する CIDR アドレスを持つ異なるネットワーク上のクライアントをサポートできます。
この機能を実現するために、MetalLB を使用して Virtual Routing and Forwarding (VRF) インスタンスを実装し、Egress サービスを設定する方法を説明します。
MetalLB と出力サービスを備えた VRF インスタンスを使用した対称トラフィックの設定は、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
4.7.1. MetalLB を使用した対称ルーティング管理の課題 リンクのコピーリンクがクリップボードにコピーされました!
複数のホストインターフェイスで MetalLB を使用すると、MetalLB はホスト上で使用可能なすべてのインターフェイスを通じてサービスを公開し、通知します。これにより、ネットワークの分離、非対称リターントラフィック、CIDR アドレスの重複に関する課題が生じる可能性があります。
戻りトラフィックが正しいクライアントに確実に到達するための 1 つのオプションとして、静的ルートを使用します。ただし、このソリューションでは、MetalLB がサービスを分離して、別のインターフェイスを通じて各サービスを通知できません。さらに、静的ルーティングには手動設定が必要であり、リモートサイトが追加された場合はメンテナンスが必要になります。
外部システムで、アプリケーションの送信元と宛先の IP アドレスが同じである必要があるシナリオなどが、MetalLB サービスの実装時における対称ルーティングのさらなる課題として挙げられます。OpenShift Container Platform のデフォルトの動作では、ホストネットワークインターフェイスの IP アドレスが、Pod から発信されるトラフィックの送信元 IP アドレスとして割り当てられます。これは、複数のホストインターフェイスがある場合に問題になります。
MetalLB、NMState、OVN-Kubernetes の機能を組み合わせた設定を実装することで、これらの課題を克服できます。
4.7.2. MetalLB で VRF を使用した対称ルーティング管理の概要 リンクのコピーリンクがクリップボードにコピーされました!
NMState を使用してホスト上で VRF インスタンスを設定し、VRF インスタンスを MetalLB BGPPeer リソースに関連付け、OVN-Kubernetes を使用して出力トラフィック用の出力サービスを設定することで、対称ルーティングの実装の課題を克服できます。
図4.1 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 サービスを設定します。
4.7.3. MetalLB で VRF を使用した対称ルーティングの設定 リンクのコピーリンクがクリップボードにコピーされました!
同じ入力ネットワークパスと Egress ネットワークパスを必要とする MetalLB サービスの背後にあるアプリケーションに対して対称ネットワークルーティングを設定できます。
この例では、VRF ルーティングテーブルを MetalLB および出力サービスに関連付けて、LoadBalancer サービスの背後にある Pod の Ingress および Egress トラフィックの対称ルーティングを有効にします。
-
EgressServiceCR でsourceIPBy: "LoadBalancerIP"設定を使用する場合は、BGPAdvertisementカスタムリソース (CR) でロードバランサーノードを指定する必要があります。 -
sourceIPBy: "Network"設定は、gatewayConfig.routingViaHost仕様がtrueに設定された OVN-Kubernetes を使用するクラスターでのみ使用できます。さらに、sourceIPBy: "Network"設定を使用する場合は、ネットワーク VRF インスタンスで設定されたノード上でアプリケーションワークロードをスケジュールする必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - Kubernetes NMState Operator をインストールします。
- MetalLB Operator がインストールされている。
手順
NodeNetworkConfigurationPolicyCR を作成して VRF インスタンスを定義します。次の例のような内容を含むファイル (
node-network-vrf.yamlなど) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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で、EgressServiceCR で定義した ID を参照します。 - 9
- 追加のルートルールを定義します。
ip-toフィールドは、Cluster Networkの CIDR、Service Networkの CIDR、およびInternal Masqueradeサブネットの CIDR と一致する必要があります。oc describe network.operator/clusterコマンドを実行すると、これらの CIDR アドレス仕様の値を表示できます。 - 10
- Linux カーネルがルートを計算するときに使用するメインルーティングテーブルの ID は
254です。
以下のコマンドを実行してポリシーを適用します。
oc apply -f node-network-vrf.yaml
$ oc apply -f node-network-vrf.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
BGPPeerカスタムリソース (CR) を作成します。次の例のような内容を含むファイル (
frr-via-vrf.yamlなど) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- BGP ピアに関連付ける VRF インスタンスを指定します。MetalLB は、サービスをアドバタイズし、VRF 内のルーティング情報に基づいてルーティングを決定できます。
次のコマンドを実行して、BGP ピアの設定を適用します。
oc apply -f frr-via-vrf.yaml
$ oc apply -f frr-via-vrf.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
IPAddressPoolCR を作成します。次の例のような内容を含むファイル (
first-pool.yamlなど) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、IP アドレスプールの設定を適用します。
oc apply -f first-pool.yaml
$ oc apply -f first-pool.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
BGPAdvertisementCR を作成します。次の例のような内容を含むファイル (
first-adv.yamlなど) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、BGP アドバタイズメントの設定を適用します。
oc apply -f first-adv.yaml
$ oc apply -f first-adv.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
EgressServiceCR を作成します。次の例のような内容を含むファイル (
egress-service.yamlなど) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 トラフィックのルーティングテーブル ID を指定します。必ず
NodeNetworkConfigurationPolicyリソースで定義されているroute-table-idID (例:route-table-id: 2) と一致する値を指定してください。
次のコマンドを実行して、Egress サービスの設定を適用します。
oc apply -f egress-service.yaml
$ oc apply -f egress-service.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、MetalLB サービスの背後で実行されている Pod のアプリケーションエンドポイントにアクセスできることを確認します。
curl <external_ip_address>:<port_number>
$ curl <external_ip_address>:<port_number>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- アプリケーションのエンドポイントに合わせて外部 IP アドレスとポート番号を更新します。
-
オプション:
LoadBalancerサービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てた場合は、tcpdumpなどのツールを使用して外部クライアントで受信したパケットを分析し、この設定を確認します。