23.10. egress IP アドレスの設定
クラスター管理者は、1 つ以上の egress IP アドレスを namespace に、または namespace 内の特定の pod に割り当てるように、OVN-Kubernetes の Container Network Interface (CNI) クラスターのネットワークプロバイダーを設定することができます。
23.10.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 ネットワーク設定ファイルで設定することはできません。
23.10.1.1. プラットフォームサポート
各種のプラットフォームでの egress IP アドレス機能のサポートについては、以下の表で説明されています。
プラットフォーム | サポート対象 |
---|---|
ベアメタル | はい |
VMware vSphere | はい |
Red Hat OpenStack Platform (RHOSP) | いいえ |
Amazon Web Services (AWS) | はい |
Google Cloud Platform (GCP) | はい |
Microsoft Azure | はい |
EgressIP 機能を持つコントロールプレーンノードへの egress IP アドレスの割り当ては、Amazon Web Services (AWS) でプロビジョニングされるクラスターではサポートされません。(BZ#2039656)
23.10.1.2. パブリッククラウドプラットフォームに関する考慮事項
パブリッククラウドインフラストラクチャーでプロビジョニングされたクラスターの場合は、ノードごとに割り当て可能な IP アドレスの絶対数に制約があります。ノードごとに割り当て可能な IP アドレスの最大数、つまりIP 容量は、次の式で表すことができます。
IP capacity = public cloud default capacity - sum(current IP assignments)
egress IP 機能はノードごとの IP アドレス容量を管理しますが、デプロイメントでこの制約を計画することが重要です。たとえば、8 ノードのベアメタルインフラストラクチャーにインストールされたクラスターの場合は、150 の egress IP アドレスを設定できます。ただし、パブリッククラウドプロバイダーが IP アドレスの容量をノードあたり 10 IP アドレスに制限している場合、割り当て可能な IP アドレスの総数はわずか 80 です。この例のクラウドプロバイダーで同じ IP アドレス容量を実現するには、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 アドレスの両方が含まれます。
次の例は、いくつかのパブリッククラウドプロバイダーのノードからのアノテーションを示しています。アノテーションは、読みやすくするためにインデントされています。
AWS での cloud.network.openshift.io/egress-ipconfig
アノテーションの例
cloud.network.openshift.io/egress-ipconfig: [ { "interface":"eni-078d267045138e436", "ifaddr":{"ipv4":"10.0.128.0/18"}, "capacity":{"ipv4":14,"ipv6":15} } ]
GCP での cloud.network.openshift.io/egress-ipconfig
アノテーションの例
cloud.network.openshift.io/egress-ipconfig: [ { "interface":"nic0", "ifaddr":{"ipv4":"10.0.128.0/18"}, "capacity":{"ip":14} } ]
次のセクションでは、容量計算で使用するためにサポートされているパブリッククラウド環境の IP アドレス容量を説明します。
23.10.1.2.1. Amazon Web Services (AWS) の IP アドレス容量の制限
AWS では、IP アドレスの割り当てに関する制約は、設定されているインスタンスタイプによって異なります。詳細は、IP addresses per network interface per instance type を参照してください。
23.10.1.2.2. Google Cloud Platform (GCP) の IP アドレス容量の制限
GCP では、ネットワークモデルは、IP アドレスの割り当てではなく、IP アドレスのエイリアス作成を介して追加のノード IP アドレスを実装します。ただし、IP アドレス容量は IP エイリアス容量に直接マッピングされます。
IP エイリアスの割り当てには、次の容量制限があります。
- ノードごとに、IPv4 と IPv6 の両方の IP エイリアスの最大数は 10 です。
- VPC ごとに、IP エイリアスの最大数は指定されていませんが、OpenShift Container Platform のスケーラビリティーテストでは、最大数が約 15,000 であることが明らかになっています。
詳細は、インスタンスごとのクォータとエイリアス IP 範囲の概要を参照してください。
23.10.1.2.3. Microsoft Azure IP アドレスの容量制限
Azure では、IP アドレスの割り当てに次の容量制限があります。
- NIC ごとに、IPv4 と IPv6 の両方で割り当て可能な IP アドレスの最大数は 256 です。
- 仮想ネットワークごとに、割り当てられる IP アドレスの最大数は 65,536 を超えることはできません。
詳細は、ネットワークの制限を参照してください。
23.10.1.3. 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 アドレスをホストする予定のノードにラベルを常に適用します。
23.10.1.4. 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 会話にいずれかが使用される可能性があります。
23.10.1.5. 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 オブジェクト
apiVersion: v1 kind: Namespace metadata: name: namespace1 labels: env: prod --- apiVersion: v1 kind: Namespace metadata: name: namespace2 labels: env: prod
EgressIP
オブジェクト以下の
EgressIP
オブジェクトは、env
ラベルがprod
に設定される namespace のすべての Pod を選択する設定を説明しています。選択された Pod の egress IP アドレスは192.168.126.10
および192.168.126.102
です。EgressIP
オブジェクトapiVersion: k8s.ovn.org/v1 kind: EgressIP metadata: name: egressips-prod spec: egressIPs: - 192.168.126.10 - 192.168.126.102 namespaceSelector: matchLabels: env: prod status: items: - node: node1 egressIP: 192.168.126.10 - node: node3 egressIP: 192.168.126.102
直前の例の設定の場合、OpenShift Container Platform は両方の egress IP アドレスを利用可能なノードに割り当てます。
status
フィールドは、egress IP アドレスの割り当ての有無および割り当てられる場所を反映します。
23.10.2. EgressIP オブジェクト
以下の YAML は、EgressIP
オブジェクトの API について説明しています。オブジェクトの範囲はクラスター全体です。これは namespace では作成されません。
apiVersion: k8s.ovn.org/v1 kind: EgressIP metadata: name: <name> 1 spec: egressIPs: 2 - <ip_address> namespaceSelector: 3 ... podSelector: 4 ...
以下の YAML は namespace セレクターのスタンザについて説明しています。
namespace セレクタースタンザ
namespaceSelector: 1
matchLabels:
<label_name>: <label_value>
- 1
- namespace の 1 つ以上のマッチングルール。複数のマッチングルールを指定すると、一致するすべての namespace が選択されます。
以下の YAML は Pod セレクターのオプションのスタンザについて説明しています。
Pod セレクタースタンザ
podSelector: 1
matchLabels:
<label_name>: <label_value>
- 1
- オプション: 指定された
namespaceSelector
ルールに一致する、namespace の Pod の 1 つ以上のマッチングルール。これが指定されている場合、一致する Pod のみが選択されます。namespace の他の Pod は選択されていません。
以下の例では、EgressIP
オブジェクトは 192.168.126.11
および 192.168.126.102
egress IP アドレスを、app
ラベルが web
に設定されており、env
ラベルが prod
に設定されている namespace にある Pod に関連付けます。
EgressIP
オブジェクトの例
apiVersion: k8s.ovn.org/v1 kind: EgressIP metadata: name: egress-group1 spec: egressIPs: - 192.168.126.11 - 192.168.126.102 podSelector: matchLabels: app: web namespaceSelector: matchLabels: env: prod
以下の例では、EgressIP
オブジェクトは、192.168.127.30
および 192.168.127.40
egress IP アドレスを、environment
ラベルが development
に設定されていない Pod に関連付けます。
EgressIP
オブジェクトの例
apiVersion: k8s.ovn.org/v1 kind: EgressIP metadata: name: egress-group2 spec: egressIPs: - 192.168.127.30 - 192.168.127.40 namespaceSelector: matchExpressions: - key: environment operator: NotIn values: - development
23.10.3. egress IP アドレスをホストするノードのラベル付け
OpenShift Container Platform が 1 つ以上の egress IP アドレスをノードに割り当てることができるように、k8s.ovn.org/egress-assignable=""
ラベルをクラスター内のノードに適用することができます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - クラスター管理者としてクラスターにログインします。
手順
1 つ以上の egress IP アドレスをホストできるようにノードにラベルを付けるには、以下のコマンドを入力します。
$ oc label nodes <node_name> k8s.ovn.org/egress-assignable="" 1
- 1
- ラベルを付けるノードの名前。
ヒントまたは、以下の YAML を適用してラベルをノードに追加できます。
apiVersion: v1 kind: Node metadata: labels: k8s.ovn.org/egress-assignable: "" name: <node_name>