26.18. 出力サービスの設定
クラスター管理者は、Egress サービスを使用して、ロードバランサーサービスの背後にある Pod の Egress トラフィックを設定できます。
Egress サービスはテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
EgressService
カスタムリソース (CR) を使用して、次の方法で送信トラフィックを管理できます。
ロードバランサーサービスの IP アドレスを、ロードバランサーサービスの背後にある Pod の送信トラフィックの送信元 IP アドレスとして割り当てます。
このコンテキストでは、ロードバランサーの IP アドレスを送信元 IP アドレスとして割り当てると、単一の Egress と Ingress を提供するのに役立ちます。たとえば、一部のシナリオでは、ロードバランサーサービスの背後でアプリケーションと通信する外部システムは、アプリケーションの送信元 IP アドレスと宛先 IP アドレスが同じであると想定できます。
注記ロードバランサーサービスの IP アドレスをサービスの背後にある Pod の Egress トラフィックに割り当てると、OVN-Kubernetes は Ingress ポイントと Egress ポイントを単一のノードに制限します。これにより、MetalLB が通常提供するトラフィックのロードバランシングが制限されます。
ロードバランサーの背後にある Pod の Egress トラフィックを、デフォルトノードネットワークとは異なるネットワークに割り当てます。
これは、ロードバランサーの背後にあるアプリケーションの Egress トラフィックを、デフォルトネットワークとは異なるネットワークに割り当てる場合に便利です。通常、別のネットワークは、ネットワークインターフェイスに関連付けられた VRF インスタンスを使用して実装されます。
26.18.1. Egress サービスのカスタムリソース
EgressService
カスタムリソースで Egress サービスの設定を定義します。次の YAML は、egress サービスの設定のフィールドを説明します。
apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: <egress_service_name> 1 namespace: <namespace> 2 spec: sourceIPBy: <egress_traffic_ip> 3 nodeSelector: 4 matchLabels: node-role.kubernetes.io/<role>: "" network: <egress_traffic_network> 5
- 1
- Egress サービスの名前を指定します。
EgressService
リソースの名前は、変更するロードバランサーサービスの名前と一致する必要があります。 - 2
- Egress サービスの namespace を指定します。
EgressService
の namespace は、変更するロードバランサーサービスの namespace と一致する必要があります。Egress サービスは namespace スコープです。 - 3
- サービスの背後にある Pod の Egress トラフィックの送信元 IP アドレスを指定します。有効な値は、
LoadBalancerIP
またはNetwork
です。LoadBalancerIP
値を使用して、LoadBalancer
サービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てます。ネットワーク
を指定して、ネットワークインターフェイス IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てます。 - 4
- オプション:
sourceIPBy
指定にLoadBalancerIP
値を使用する場合、単一ノードがLoadBalancer
サービストラフィックを処理します。このタスクを割り当て可能なノードを制限するには、nodeSelector
フィールドを使用します。サービストラフィックを処理するノードが選択されると、OVN-Kubernetes はそのノードにegress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: ""
という形式でラベルを付けます。nodeSelector
フィールドが指定されていない場合、どのノードでもLoadBalancer
サービストラフィックを管理できます。 - 5
- オプション: 出力トラフィックのルーティングテーブルを指定します。
network
仕様を含めない場合、Egress サービスはデフォルトのホストネットワークを使用します。
Egress サービス仕様の例
apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: test-egress-service namespace: test-namespace spec: sourceIPBy: "LoadBalancerIP" nodeSelector: matchLabels: vrf: "true" network: "2"
26.18.2. Egress サービスのデプロイ
Egress サービスをデプロイして、LoadBalancer
サービスの背後にある Pod の Egress トラフィックを管理できます。
次の例では、LoadBalancer
サービスの Ingress IP アドレスと同じ送信元 IP アドレスを持つように Egress トラフィックを設定します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。 -
MetalLB
BGPPeer
リソースを設定している。
手順
サービスに必要な IP を使用して
IPAddressPool
CR を作成します。次の例のような内容を含むファイル (
ip-addr-pool.yaml
など) を作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: example-pool namespace: metallb-system spec: addresses: - 172.19.0.100/32
次のコマンドを実行して、IP アドレスプールの設定を適用します。
$ oc apply -f ip-addr-pool.yaml
Service
CR およびEgressService
CR を作成します。次の例のような内容を含むファイル
(service-egress-service.yaml
など) を作成します。apiVersion: v1 kind: Service metadata: name: example-service namespace: example-namespace annotations: metallb.universe.tf/address-pool: example-pool 1 spec: selector: app: example ports: - name: http protocol: TCP port: 8080 targetPort: 8080 type: LoadBalancer --- apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: example-service namespace: example-namespace spec: sourceIPBy: "LoadBalancerIP" 2 nodeSelector: 3 matchLabels: node-role.kubernetes.io/worker: ""
- 1
LoadBalancer
サービスは、example-pool
IP アドレスプールから MetalLB によって割り当てられた IP アドレスを使用します。- 2
- この例では、
LoadBalancerIP
値を使用して、LoadBalancer
サービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てます。 - 3
LoadBalancerIP
値を指定すると、単一ノードがLoadBalancer
サービスのトラフィックを処理します。この例では、トラフィックを処理する場合にworker
ラベルが割り当てられたノードのみを選択できます。ノードが選択されると、OVN-Kubernetes はそのノードにegress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: ""
という形式でラベルを付けます。
注記sourceIPBy: "LoadBalancerIP"
設定を使用する場合は、BGPAdvertisement
カスタムリソース (CR) でロードバランサーノードを指定する必要があります。次のコマンドを実行して、サービスと Egress サービスの設定を適用します。
$ oc apply -f service-egress-service.yaml
BGPAdvertisement
CR を作成してサービスをアドバタイズします。次の例のような内容を含むファイル
(service-bgp-advertisement.yaml
など) を作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: example-bgp-adv namespace: metallb-system spec: ipAddressPools: - example-pool nodeSelector: - matchLabels: egress-service.k8s.ovn.org/example-namespace-example-service: "" 1
- 1
- この例では、
EgressService
CR は、ロードバランサーサービス IP アドレスを使用するように、Egress トラフィックの送信元 IP アドレスを設定します。したがって、Pod から発信されるトラフィックに同じリターンパスを使用するには、リターントラフィックのロードバランサーノードを指定する必要があります。
検証
次のコマンドを実行して、MetalLB サービスの背後で実行されている Pod のアプリケーションエンドポイントにアクセスできることを確認します。
$ curl <external_ip_address>:<port_number> 1
- 1
- アプリケーションのエンドポイントに合わせて外部 IP アドレスとポート番号を更新します。
-
LoadBalancer
サービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てた場合は、tcpdump
などのツールを使用して外部クライアントで受信したパケットを分析し、この設定を確認します。