7.2. Egress IP アドレスの設定
クラスター管理者は、1 つ以上の Egress IP アドレスを namespace に、または namespace 内の特定の pod に割り当てるように、OVN-Kubernetes の Container Network Interface (CNI) ネットワークプラグインを設定することができます。
7.2.1. Egress IP アドレスアーキテクチャーの設計および実装
Red Hat OpenShift Service on AWS の egress IP アドレス機能を使用すると、1 つ以上の namespace の 1 つ以上の Pod からのトラフィックに、クラスターネットワーク外のサービスに対する一貫したソース IP アドレスを持たせることができます。
たとえば、クラスター外のサーバーでホストされるデータベースを定期的にクエリーする Pod がある場合があります。サーバーにアクセス要件を適用するために、パケットフィルタリングデバイスは、特定の IP アドレスからのトラフィックのみを許可するよう設定されます。この特定の Pod のみからサーバーに確実にアクセスできるようにするには、サーバーに要求を行う Pod に特定の Egress IP アドレスを設定できます。
namespace に割り当てられた Egress IP アドレスは、特定の宛先にトラフィックを送信するために使用されるスロールーターとは異なります。
ROSA with HCP では、アプリケーション Pod と ingress ルーター Pod が同じノード上で実行されます。このシナリオでアプリケーションプロジェクトの Egress IP アドレスを設定する場合、アプリケーションプロジェクトからルートに要求を送信するときに IP アドレスは使用されません。
EgressIP 機能を持つコントロールプレーンノードへの egress IP アドレスの割り当てはサポートされていません。
次の例は、いくつかのパブリッククラウドプロバイダーのノードからのアノテーションを示しています。アノテーションは、読みやすくするためにインデントされています。
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} } ]
次のセクションでは、容量計算で使用するためにサポートされているパブリッククラウド環境の IP アドレス容量を説明します。
7.2.1.1. Amazon Web Services (AWS) の IP アドレス容量の制限
AWS では、IP アドレスの割り当てに関する制約は、設定されているインスタンスタイプによって異なります。詳細は、IP addresses per network interface per instance type を参照してください。
7.2.1.2. 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
オブジェクトを作成する場合、Red Hat OpenShift Service on AWS は k8s.ovn.org/egress-assignable: ""
ラベルですべての egress IP アドレスを最初のノードに割り当てる可能性があります。
Egress IP アドレスがクラスター内のノード全体に広く分散されるようにするには、EgressIP
オブジェクトを作成する前に、Egress IP アドレスをホストする予定のノードにラベルを常に適用します。
7.2.1.3. 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 会話にいずれかが使用される可能性があります。
7.2.1.4. 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
前述の例の設定では、Red Hat OpenShift Service on AWS は両方の egress IP アドレスを使用可能なノードに割り当てます。
status
フィールドは、Egress IP アドレスの割り当ての有無および割り当てられる場所を反映します。
7.2.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
7.2.3. Egress IP アドレスをホストするノードのラベル付け
Red Hat OpenShift Service on AWS が 1 つ以上の egress IP アドレスをノードに割り当てることができるように、k8s.ovn.org/egress-assignable=""
ラベルをクラスター内のノードに適用できます。
前提条件
-
ROSA CLI (
rosa
) をインストールしている。 - クラスター管理者としてクラスターにログインしている。
手順
1 つ以上の Egress IP アドレスをホストできるようにノードにラベルを付けるには、以下のコマンドを入力します。
$ rosa edit machinepool <machinepool_name> --cluster=<cluster_name> --labels "k8s.ovn.org/egress-assignable="
重要このコマンドは、マシンプール上の既存のノードラベルをすべて置き換えます。既存のノードラベルを確実に保持するには、必要なラベルを
--labels
フィールドに含める必要があります。