第9章 Egress IP アドレスの設定
クラスター管理者は、1 つ以上の Egress IP アドレスを、namespace または namespace 内の特定の Pod に割り当てるように、OVN-Kubernetes Container Network Interface (CNI) ネットワークプラグインを設定できます。
9.1. Egress IP アドレスアーキテクチャーの設計および実装 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform の Egress IP アドレス機能を使用すると、1 つ以上の namespace の 1 つ以上の Pod からのトラフィックに、クラスターネットワーク外のサービスに対する一貫したソース IP アドレスを持たせることができます。
たとえば、クラスター外のサーバーでホストされるデータベースを定期的にクエリーする Pod がある場合があります。サーバーにアクセス要件を適用するために、パケットフィルタリングデバイスは、特定の IP アドレスからのトラフィックのみを許可するよう設定されます。この特定の Pod のみからサーバーに確実にアクセスできるようにするには、サーバーに要求を行う Pod に特定の Egress IP アドレスを設定できます。
namespace に割り当てられた Egress IP アドレスは、特定の宛先にトラフィックを送信するために使用されるスロールーターとは異なります。
一部のクラスター設定では、アプリケーション Pod と Ingress ルーター Pod が同じノードで実行されます。このシナリオでアプリケーションプロジェクトの Egress IP アドレスを設定する場合、アプリケーションプロジェクトからルートに要求を送信するときに IP アドレスは使用されません。
Egress IP アドレスは、ifcfg-eth0
などのように Linux ネットワーク設定ファイルで設定することはできません。
9.1.1. プラットフォームサポート リンクのコピーリンクがクリップボードにコピーされました!
各種のプラットフォームでの Egress IP アドレス機能のサポートは、以下の表で説明されています。
プラットフォーム | サポート対象 |
---|---|
ベアメタル | はい |
VMware vSphere | はい |
Red Hat OpenStack Platform (RHOSP) | はい |
Amazon Web Services (AWS) | はい |
Google Cloud Platform (GCP) | はい |
Microsoft Azure | はい |
IBM Z® および IBM® LinuxONE | はい |
IBM Z® および IBM® LinuxONE for Red Hat Enterprise Linux (RHEL) KVM | はい |
IBM Power® | はい |
Nutanix | はい |
EgressIP 機能を持つコントロールプレーンノードへの Egress IP アドレスの割り当ては、Amazon Web Services (AWS) でプロビジョニングされるクラスターではサポートされません。(BZ#2039656)。
9.1.2. パブリッククラウドプラットフォームに関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
通常、パブリッククラウドプロバイダーは Egress IP に制限を設けています。つまり、パブリッククラウドインフラストラクチャー上にプロビジョニングされたクラスターでは、ノードごとに割り当て可能な IP アドレスの絶対数に制約があります。ノードごとに割り当て可能な IP アドレスの最大数、つまり IP 容量 は、次の式で表すことができます。
IP capacity = public cloud default capacity - sum(current IP assignments)
IP capacity = public cloud default capacity - sum(current IP assignments)
Egress IP 機能はノードごとの IP アドレス容量を管理しますが、デプロイメントでこの制約を計画することが重要です。たとえば、パブリッククラウドプロバイダーが IP アドレス容量をノードあたり 10 個に制限していて、ノードが 8 個ある場合、割り当て可能な IP アドレスの合計数は 80 個だけになります。IP アドレス容量を引き上げるには、追加のノードを割り当てる必要があります。たとえば、割り当て可能な IP アドレスが 150 個必要な場合は、7 つの追加のノードを割り当てる必要があります。
パブリッククラウド環境内の任意のノードの IP 容量とサブネットを確認するには、oc get node <node_name> -o yaml
コマンドを入力します。cloud.network.openshift.io/egress-ipconfig
アノテーションには、ノードの容量とサブネット情報が含まれています。
アノテーション値は、プライマリーネットワークインターフェイスに次の情報を提供するフィールドを持つ単一のオブジェクトを持つ配列です。
-
interface
: AWS と Azure のインターフェイス ID と GCP のインターフェイス名を指定します。 -
ifaddr
: 一方または両方の IP アドレスファミリーのサブネットマスクを指定します。 -
capacity
: ノードの IP アドレス容量を指定します。AWS では、IP アドレス容量は IP アドレスファミリーごとに提供されます。Azure と GCP では、IP アドレスの容量には IPv4 アドレスと IPv6 アドレスの両方が含まれます。
ノード間のトラフィックの送信 IP アドレスの自動アタッチおよびデタッチが可能です。これにより、namespace 内の多くの Pod からのトラフィックが、クラスター外の場所への一貫した送信元 IP アドレスを持つことができます。これは、OpenShift Container Platform 4.19 の Red Hat OpenShift Networking におけるデフォルトのネットワーキングプラグインである OpenShift SDN および OVN-Kubernetes もサポートします。
RHOSP Egress IP アドレス機能は、egressip-<IP address>
と呼ばれる Neutron 予約ポートを作成します。OpenShift Container Platform クラスターのインストールに使用したものと同じ RHOSP ユーザーを使用して、Floating IP アドレスをこの予約ポートに割り当て、Egress トラフィック用の予測可能な SNAT アドレスを指定できます。RHOSP ネットワーク上の Egress IP アドレスが、ノードのフェイルオーバーなどのためにあるノードから別のノードに移動されると、Neutron 予約ポートが削除され、再作成されます。これは、フローティング IP の関連付けが失われ、フローティング IP アドレスを新しい予約ポートに手動で再割り当てする必要があることを意味します。
RHOSP クラスター管理者が Floating IP を予約ポートに割り当てると、OpenShift Container Platform は予約ポートを削除できません。RHOSP クラスター管理者が予約ポートから Floating IP の割り当てを解除するまで、CloudPrivateIPConfig
オブジェクトは削除および移動操作を実行できません。
次の例は、いくつかのパブリッククラウドプロバイダーのノードからのアノテーションを示しています。アノテーションは、読みやすくするためにインデントされています。
AWS での cloud.network.openshift.io/egress-ipconfig
アノテーションの例
GCP での cloud.network.openshift.io/egress-ipconfig
アノテーションの例
次のセクションでは、容量計算で使用するためにサポートされているパブリッククラウド環境の IP アドレス容量を説明します。
9.1.2.1. Amazon Web Services (AWS) の IP アドレス容量の制限 リンクのコピーリンクがクリップボードにコピーされました!
AWS では、IP アドレスの割り当てに関する制約は、設定されているインスタンスタイプによって異なります。詳細は、IP addresses per network interface per instance type を参照してください。
9.1.2.2. Google Cloud Platform (GCP) の IP アドレス容量の制限 リンクのコピーリンクがクリップボードにコピーされました!
GCP では、ネットワークモデルは、IP アドレスの割り当てではなく、IP アドレスのエイリアス作成を介して追加のノード IP アドレスを実装します。ただし、IP アドレス容量は IP エイリアス容量に直接マッピングされます。
IP エイリアスの割り当てには、次の容量制限があります。
- ノードごとに、IPv4 と IPv6 の両方の IP エイリアスの最大数は 100 です。
- VPC ごとに、IP エイリアスの最大数は指定されていませんが、OpenShift Container Platform のスケーラビリティーテストでは、最大数が約 15,000 であることが明らかになっています。
詳細は、インスタンスごと のクォータと エイリアス IP 範囲の概要 を参照してください。
9.1.2.3. Microsoft Azure IP アドレスの容量制限 リンクのコピーリンクがクリップボードにコピーされました!
Azure では、IP アドレスの割り当てに次の容量制限があります。
- NIC ごとに、IPv4 と IPv6 の両方で割り当て可能な IP アドレスの最大数は 256 です。
- 仮想ネットワークごとに、割り当てられる IP アドレスの最大数は 65,536 を超えることはできません。
詳細は、ネットワークの制限 を参照してください。
9.1.3. 追加のネットワークインターフェイスで Egress IP を使用する場合の考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform では、Egress IP は管理者にネットワークトラフィックを制御する方法を提供します。Egress IP は、Open vSwitch (OVS) のブリッジインターフェイスである br-ex
および IP 接続が有効な任意の物理インターフェイスで使用できます。
次のコマンドを実行して、ネットワークインターフェイスのタイプを検査できます。
ip -details link show
$ ip -details link show
プライマリーネットワークインターフェイスには、サブネットマスクも含まれるノード IP アドレスが割り当てられます。このノードの IP アドレスの情報は、k8s.ovn.org/node-primary-ifaddr
アノテーションを検査して、クラスター内の各ノードの Kubernetes ノードオブジェクトから取得できます。IPv4 クラスターでは、このアノテーションは "k8s.ovn.org/node-primary-ifaddr: {"ipv4":"192.168.111.23/24"}"
の例に似ています。
Egress IP がプライマリーネットワークインターフェイスのサブネット内にない場合は、プライマリーネットワークインターフェイスタイプではない別の Linux ネットワークインターフェイスで Egress IP を使用できます。これにより、OpenShift Container Platform 管理者は、ルーティング、アドレス指定、セグメンテーション、セキュリティーポリシーなどのネットワーク側面をより高度に制御できるようになります。この機能は、トラフィックのセグメント化や特殊な要件への対応などの目的で、ワークロードトラフィックを特定のネットワークインターフェイス経由でルーティングするオプションもユーザーに提供します。
Egress IP がプライマリーネットワークインターフェイスのサブネット内にない場合、ノード上に Egress トラフィック用の別のネットワークインターフェイスが存在すると、そのネットワークインターフェイスが選択される可能性があります。
k8s.ovn.org/host-cidrs
Kubernetes ノードのアノテーションを検査することで、他のどのネットワークインターフェイスが Egress IP をサポートしているかを判断できます。このアノテーションには、プライマリーネットワークインターフェイスで見つかったアドレスとサブネットマスクが含まれています。また、追加のネットワークインターフェイスアドレスとサブネットマスク情報も含まれます。これらのアドレスとサブネットマスクは、最長接頭辞マッチルーティング メカニズムを使用して、どのネットワークインターフェイスが Egress IP をサポートするかを決定するネットワークインターフェイスに割り当てられます。
OVN-Kubernetes は、特定の namespace および Pod からのアウトバウンドネットワークトラフィックを制御および送信するメカニズムを提供します。これにより、特定のネットワークインターフェイス経由で、特定の Egress IP アドレスを使用してクラスターからトラフィックが出ていきます。
プライマリーネットワークインターフェイスではないネットワークインターフェイスに Egress IP を割り当てる場合の要件
Egress IP とトラフィックをプライマリーネットワークインターフェイスではない特定のインターフェイス経由でルーティングすることを希望する場合は、次の条件を満たす必要があります。
- OpenShift Container Platform がベアメタルクラスターにインストールされている。この機能は、クラウドまたはハイパーバイザー環境では無効になります。
- OpenShift Container Platform Pod が、ホストネットワークを使用する Pod として設定されていない。
- ネットワークインターフェイスが削除された場合、またはインターフェイス上で Egress IP をホストできるようにする IP アドレスとサブネットマスクが削除された場合、Egress IP は再設定されます。結果として、その Egress IP は別のノードおよびインターフェイスに割り当てられることがあります。
- セカンダリーネットワークインターフェイスカード (NIC) で Egress IP アドレスを使用する場合は、Node Tuning Operator を使用してセカンダリー NIC で IP 転送を有効にする必要があります。
9.1.4. Egress IP の Pod への割り当て リンクのコピーリンクがクリップボードにコピーされました!
1 つ以上の Egress IP を namespace に、または namespace の特定の Pod に割り当てるには、以下の条件を満たす必要があります。
-
クラスター内の 1 つ以上のノードに
k8s.ovn.org/egress-assignable: ""
ラベルがなければなりません。 -
EgressIP
オブジェクトが存在し、これは namespace の Pod からクラスターを離脱するトラフィックのソース IP アドレスとして使用する 1 つ以上の Egress IP アドレスを定義します。
Egress IP の割り当て用にクラスター内のノードにラベルを付ける前に EgressIP
オブジェクトを作成する場合、OpenShift Container Platform は k8s.ovn.org/egress-assignable: ""
ラベルですべての Egress IP アドレスを最初のノードに割り当てる可能性があります。
Egress IP アドレスがクラスター内のノード全体に広く分散されるようにするには、EgressIP
オブジェクトを作成する前に、Egress IP アドレスをホストする予定のノードにラベルを常に適用します。
9.1.5. Egress IP のノードへの割り当て リンクのコピーリンクがクリップボードにコピーされました!
EgressIP
オブジェクトを作成する場合、k8s.ovn.org/egress-assignable: ""
ラベルのラベルが付いたノードに以下の条件が適用されます。
- Egress IP アドレスは一度に複数のノードに割り当てられることはありません。
- Egress IP アドレスは、Egress IP アドレスをホストできる利用可能なノード間で均等に分散されます。
EgressIP
オブジェクトのspec.EgressIPs
配列が複数の IP アドレスを指定する場合は、以下の条件が適用されます。- 指定された IP アドレスを複数ホストするノードはありません。
- トラフィックは、指定された namespace の指定された IP アドレス間でほぼ均等に分散されます。
- ノードが利用不可の場合、そのノードに割り当てられる Egress IP アドレスは自動的に再割り当てされます (前述の条件が適用されます)。
Pod が複数の EgressIP
オブジェクトのセレクターに一致する場合、EgressIP
オブジェクトに指定される Egress IP アドレスのどれが Pod の Egress IP アドレスとして割り当てられるのかという保証はありません。
さらに、EgressIP
オブジェクトが複数の送信 IP アドレスを指定する場合、どの送信 IP アドレスが使用されるかは保証されません。たとえば、Pod が 10.10.20.1
と 10.10.20.2
の 2 つの Egress IP アドレスを持つ EgressIP
オブジェクトのセレクターと一致する場合、各 TCP 接続または UDP 会話にいずれかが使用される可能性があります。
9.1.6. Egress IP アドレス設定のアーキテクチャー図 リンクのコピーリンクがクリップボードにコピーされました!
以下の図は、Egress IP アドレス設定を示しています。この図では、クラスターの 3 つのノードで実行される 2 つの異なる namespace の 4 つの Pod を説明します。ノードには、ホストネットワークの 192.168.126.0/18
CIDR ブロックから IP アドレスが割り当てられます。
ノード 1 とノード 3 の両方に k8s.ovn.org/egress-assignable: ""
というラベルが付けられるため、Egress IP アドレスの割り当てに利用できます。
図の破線は、pod1、pod2、および pod3 からのトラフィックフローが Pod ネットワークを通過し、クラスターがノード 1 およびノード 3 から出る様子を示しています。外部サービスが、EgressIP
オブジェクトの例で選択した Pod からトラフィックを受信する場合、送信元 IP アドレスは 192.168.126.10
または 192.168.126.102
のいずれかになります。トラフィックはこれらの 2 つのノード間でほぼ均等に分散されます。
図にある次のリソースの詳細を以下に示します。
Namespace
オブジェクトnamespace は以下のマニフェストで定義されます。
namespace オブジェクト
Copy to Clipboard Copied! Toggle word wrap Toggle overflow EgressIP
オブジェクト以下の
EgressIP
オブジェクトは、env
ラベルがprod
に設定される namespace のすべての Pod を選択する設定を説明しています。選択された Pod の Egress IP アドレスは192.168.126.10
および192.168.126.102
です。EgressIP
オブジェクトCopy to Clipboard Copied! Toggle word wrap Toggle overflow 直前の例の設定の場合、OpenShift Container Platform は両方の Egress IP アドレスを利用可能なノードに割り当てます。
status
フィールドは、Egress IP アドレスの割り当ての有無および割り当てられる場所を反映します。