第2章 プライマリーネットワーク
2.1. ユーザー定義ネットワークについて リンクのコピーリンクがクリップボードにコピーされました!
UserDefinedNetwork
はテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
ユーザー定義ネットワーク (UDN) が実装される前は、OpenShift Container Platform の OVN-Kubernetes CNI プラグインは、プライマリーまたは メイン ネットワーク上の Layer 3 トポロジーのみをサポートしていました。Kubernetes の設計原則により、すべての Pod はメインネットワークにアタッチされ、すべての Pod は IP アドレスを使用して相互に通信し、Pod 間のトラフィックはネットワークポリシーに基づき制限されます。
UDN では、カスタムの Layer 2 および Layer 3 ネットワークセグメントを有効にすることで、Kubernetes Pod ネットワークのデフォルトの Layer 3 トポロジーの柔軟性とセグメンテーション機能が向上します。これらのセグメントはすべてデフォルトで分離されています。これらのセグメントは、デフォルトの OVN-Kubernetes CNI プラグインを使用するコンテナー Pod および仮想マシンの、プライマリーネットワークまたはセカンダリーネットワークとして機能します。UDN を使用することで、幅広いネットワークアーキテクチャーとトポロジーが可能になり、ネットワークの柔軟性、セキュリティー、パフォーマンスが向上します。
プライマリーネットワークとセカンダリーネットワーク両方での Localnet トポロジーのサポートが、OpenShift Container Platform の今後のバージョンで追加される予定です。
クラスター管理者は、ClusterUserDefinedNetwork
カスタムリソース (CR) を使用することで、クラスターレベルで複数の namespace にまたがるプライマリーまたはセカンダリーのネットワークを UDN を使用して作成および定義できます。クラスター管理者またはクラスターユーザーは、UDN を使用して、namespace レベルで UserDefinedNetwork
CR でセカンダリーネットワークを定義することもできます。
次の図は、4 つのクラスター namespace を示しています。各 namespace には 1 つのユーザー定義ネットワーク (UDN) が割り当てられており、各 UDN には Pod IP 割り当て用のカスタムサブネットが割り当てられています。OVN-Kubernetes は重複する UDN サブネットを処理します。Kubernetes ネットワークポリシーを使用しなくても、UDN にアタッチされた Pod はその UDN 内の他の Pod と通信できます。デフォルトでは、これらの Pod は他の UDN に配置された Pod との通信から分離されます。マイクロセグメンテーションの場合、UDN 内でネットワークポリシーを適用できます。namespace には 1 つ以上の UDN を割り当てることができますが、1 つの namespace には 1 つのプライマリー UDN を、1 つの UDN には 1 つ以上の namespace を割り当てるという制限があります。
図2.1 UserDefinedNetwork CR を使用した namespace 分離
次のセクションでは、ユーザー定義ネットワークの利点と制限、UserDefinedNetwork
カスタムリソースを作成する際のベストプラクティス、カスタムリソースの作成方法、およびお客様のデプロイメントに関連する可能性のある追加設定の詳細についてさらに詳しく説明します。
2.1.1. ユーザー定義ネットワークの利点 リンクのコピーリンクがクリップボードにコピーされました!
ユーザー定義ネットワークには次のような利点があります。
セキュリティーのためのネットワーク分離の強化
- テナントの分離: Red Hat OpenStack Platform (RHOSP) でテナントが分離される方法と同様に、namespace には独自の分離されたプライマリーネットワークを設定できます。これにより、テナント間のトラフィックのリスクが軽減され、セキュリティーが向上します。
ネットワークの柔軟性
- レイヤー 2 およびレイヤー 3 のサポート: クラスター管理者は、プライマリーネットワークをレイヤー 2 またはレイヤー 3 のネットワークタイプとして設定できます。
簡素化されたネットワーク管理
- ネットワーク設定の複雑さの軽減: ユーザー定義ネットワークでは、異なるネットワーク内のワークロードをグループ化することで分離を実現できるため、複雑なネットワークポリシーが不要になります。
高度な機能
- 一貫性があり選択可能な IP アドレス指定: ユーザーは、異なる namespace 間とクラスター間で IP サブネットを指定して再利用できるため、一貫性のあるネットワーク環境が実現します。
- 複数のネットワークのサポート: ユーザー定義のネットワーク機能により、管理者は複数の namespace を単一のネットワークに接続したり、異なる namespace セットごとに個別のネットワークを作成したりできます。
Red Hat OpenStack Platform (RHOSP) からのアプリケーション移行の簡素化
- ネットワークパリティー: ユーザー定義ネットワークでは、同様のネットワーク分離および設定オプションが提供されるため、OpenStack から OpenShift Container Platform へのアプリケーションの移行が簡素化されます。
開発者と管理者は、カスタムリソースを使用して、namespace スコープのユーザー定義ネットワークを作成できます。プロセスの概要は次のとおりです。
-
管理者は、
k8s.ovn.org/primary-user-defined-network
ラベルを使用して、ユーザー定義ネットワークの namespace を作成します。 -
UserDefinedNetwork
CR は、クラスター管理者またはユーザーによって作成されます。 - ユーザーは namespace 内に Pod を作成します。
2.1.2. UserDefinedNetwork カスタムリソースの制限 リンクのコピーリンクがクリップボードにコピーされました!
ユーザー定義ネットワーク (UDN) は高度にカスタマイズ可能なネットワーク設定オプションを提供しますが、クラスター管理者と開発者がこれらのネットワークを実装および管理する際に認識しておくべき制限があります。ユーザー定義ネットワークを実装する前に、次の制限を考慮してください。
DNS の制限:
- Pod の DNS ルックアップは、クラスターのデフォルトネットワーク上の Pod の IP アドレスに解決されます。Pod がユーザー定義ネットワークの一部である場合でも、DNS ルックアップではそのユーザー定義ネットワーク上の Pod の IP アドレスは解決されません。ただし、サービスおよび外部エンティティーの DNS ルックアップは期待どおりに機能します。
- Pod がプライマリー UDN に割り当てられると、その Pod はクラスターのデフォルトネットワーク上の Kubernetes API (KAPI) および DNS サービスにアクセスできるようになります。
- 初期ネットワーク割り当て: Pod を作成する前に、namespace とネットワークを作成する必要があります。Pod を含む namespace を新しいネットワークに割り当てたり、既存の namespace に UDN を作成したりすることは、OVN-Kubernetes では受け入れられません。
- ヘルスチェックの制限: Kubelet ヘルスチェックはクラスターのデフォルトネットワークによって実行されますが、Pod 上のプライマリーインターフェイスのネットワーク接続は確認されません。したがって、デフォルトネットワークでは Pod が正常に見えるものの、プライマリーインターフェイスで接続が切断されるというシナリオが、ユーザー定義ネットワークでは発生する可能性があります。
- ネットワークポリシーの制限: ユーザー定義の異なるプライマリネットワークに接続された namespace 間のトラフィックを有効にするネットワークポリシーは効果がありません。これらのトラフィックポリシーが有効にならないのは、これらの隔離されたネットワーク間に接続性がないためです。
-
作成および変更の制限:
ClusterUserDefinedNetwork
CR およびUserDefinedNetwork
CR は、作成後に変更することはできません。
2.1.3. レイヤー 2 およびレイヤー 3 トポロジー リンクのコピーリンクがクリップボードにコピーされました!
フラットなレイヤー 2 トポロジーでは、クラスター内のすべてのノードに分散される仮想スイッチを作成します。仮想マシンと Pod はこの仮想スイッチに接続し、これらすべてのコンポーネントが同じサブネット内で相互通信できるようにします。フラットなレイヤー 2 トポロジーは、クラスター内に存在するノード間で仮想マシンのライブマイグレーションを実行する場合に役立ちます。次の図は、ライブマイグレーションのために仮想スイッチを使用する 2 つのノードを含むフラットなレイヤー 2 トポロジーを示しています。
図2.2 コンポーネントの通信に仮想スイッチを使用するフラットなレイヤー 2 トポロジー
レイヤー 2 サブネットを指定しない場合は、クラスター内の各 Pod の IP アドレスを手動で設定する必要があります。レイヤー 2 サブネットを指定しないと、ポートのセキュリティーがメディアアクセスコントロール (MAC) スプーフィングの防止だけに限定され、IP スプーフィングが対象外になります。レイヤー 2 トポロジーでは、単一のブロードキャストドメインが作成されます。しかし、大規模なネットワーク環境では、これにより問題が発生することがあります。ブロードキャストストームが発生して、ネットワークのパフォーマンスが低下する可能性があるためです。
ネットワークの詳細な設定オプションを利用する場合は、レイヤー 2 トポロジーをユーザー定義ネットワーク (UDN) と統合できます。次の図は、各ノードに存在する Pod を含むレイヤー 2 トポロジーで UDN を使用する 2 つのノードを示しています。各ノードには、次の 2 つのインターフェイスが含まれています。
- ノードインターフェイス。これは、ネットワークコンポーネントをノードに接続するコンピュートノードです。
-
br-ex
などの Open vSwitch (OVS) ブリッジ。これは、Pod が相互に通信してリソースを共有できるように、レイヤー 2 OVN スイッチを作成します。
これら 2 つのインターフェイスは、外部スイッチによって接続されています。ゲートウェイまたはルーターにより、外部スイッチとレイヤー 2 OVN スイッチ間のルーティングトラフィックが処理されます。ノード内の仮想マシンと Pod は UDN を使用して相互に通信できます。レイヤー 2 OVN スイッチは、UDN 経由のノードトラフィックを処理します。これにより、あるノードから別のノードへの仮想マシンのライブマイグレーションが可能になります。
図2.3 レイヤー 2 トポロジーを使用するユーザー定義ネットワーク (UDN)
レイヤー 3 トポロジーでは、クラスター内の各ノードに固有のレイヤー 2 セグメントが作成されます。レイヤー 3 ルーティングメカニズムはこれらのセグメントを相互接続し、異なるノードでホストされている仮想マシンと Pod が相互に通信できるようにします。レイヤー 3 トポロジーでは、各ドメインを特定のノードに割り当てることで大規模なブロードキャストドメインを効果的に管理できるため、ブロードキャストトラフィックの範囲は小さくなっています。レイヤー 3 トポロジーを設定するには、cidr
および hostSubnet
パラメーターを設定する必要があります。
2.1.4. UserDefinedNetwork のベストプラクティス リンクのコピーリンクがクリップボードにコピーされました!
UserDefinedNetwork
(UDN) リソースを設定する前に、ユーザーは次の情報を考慮する必要があります。
-
UDN を設定するために
openshift-*
namespace を使用しないでください。 ユーザー定義ネットワークには 2 つのマスカレード IP アドレスが必要です。必要な数のネットワークを保持できる大きさになるように、マスカレードサブネットを再設定する必要があります。
重要-
OpenShift Container Platform 4.17 以降では、クラスターはデフォルトのマスカレードサブネットとして、IPv4 の場合は
169.254.0.0/17
、IPv6 の場合はfd69::/112
を使用します。ユーザーはこれらの範囲を避ける必要があります。更新されたクラスターの場合は、デフォルトのマスカレードサブネットに変更がありません。 - プロジェクト用のユーザー定義ネットワークが設定された後は、クラスターのマスカレードサブネットの変更はサポートされません。UDN を設定した後にマスカレードサブネットを変更しようとすると、ネットワーク接続が中断され、設定の問題が発生する可能性があります。
-
OpenShift Container Platform 4.17 以降では、クラスターはデフォルトのマスカレードサブネットとして、IPv4 の場合は
-
テナントが
NetworkAttachmentDefinition
(NAD) リソースではなくUserDefinedNetwork
リソースを使用していることを確認します。これにより、テナント間でセキュリティー上のリスクが生じる可能性があります。 - ネットワークセグメンテーションを作成するときは、UDN リソースを使用してユーザー定義のネットワークセグメンテーションを完了できない場合にのみ、NAD リソースを使用する必要があります。
-
UDN のクラスターサブネットとサービス CIDR は、デフォルトのクラスターサブネット CIDR と重複できません。OVN-Kubernetes ネットワークプラグインは、デフォルトのネットワークの参加サブネットとして
100.64.0.0/16
を使用します。UDNjoinSubnets
フィールドを設定する際にその値を使用しないでください。クラスターのネットワークの任意の場所でデフォルトのアドレス値が使用される場合は、joinSubnets
フィールドを設定して上書きする必要があります。詳細は、「UserDefinedNetworks CR の追加設定の詳細」を参照してください。 -
UDN のクラスターサブネットとサービス CIDR は、デフォルトのクラスターサブネット CIDR と重複できません。OVN-Kubernetes ネットワークプラグインは、ネットワークのデフォルトの参加サブネットとして
100.64.0.0/16
を使用します。UDNjoinSubnets
フィールドを設定するためにその値を使用しないでください。クラスターのネットワーク内のどこかでデフォルトのアドレス値が使用されている場合は、joinSubnets
フィールドを設定してデフォルト値をオーバーライドする必要があります。詳細は、「UserDefinedNetworks CR の追加設定の詳細」を参照してください。
2.1.5. UserDefinedNetwork カスタムリソースの作成 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順では、namespace のスコープのユーザー定義ネットワークを作成します。ユースケースに基づいて、Layer2
トポロジータイプの場合は my-layer-two-udn.yaml
の例、Layer3
トポロジータイプの場合は my-layer-three-udn.yaml
の例を使用してリクエストを作成します。
前提条件
-
cluster-admin
権限でログインしているか、ロールベースのアクセス制御 (RBAC) のview
およびedit
権限がある。
手順
オプション: プライマリーネットワークを使用する
UserDefinedNetwork
CR の場合は、次のコマンドを入力して、k8s.ovn.org/primary-user-defined-network
ラベルを持つ namespace を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Layer2
またはLayer3
トポロジータイプのユーザー定義のネットワークのリクエストを作成します。Layer2
トポロジーのリクエストを定義するには、次の例のように、my-layer-two-udn.yaml
などの YAML ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
UserDefinedNetwork
リソースの名前。これはdefault
にすべきではありません。また、Cluster Network Operator (CNO) によって作成されたグローバル namespace と重複してはなりません。- 2
topology
フィールドはネットワーク設定を記述します。受け入れられる値はLayer2
とLayer3
です。Layer2
トポロジータイプを指定すると、すべてのノードで共有される 1 つの論理スイッチが作成されます。- 3
- このフィールドは、トポロジー設定を指定します。
layer2
またはlayer3
に指定できます。 - 4
Primary
ロールまたはSecondary
ロールを指定します。- 5
Layer2
トポロジータイプの場合、以下はsubnet
フィールドの設定を指定します。- subnets フィールドは任意です。
-
subnets フィールドはタイプが
string
で、IPv4 と IPv6 の両方の標準 CIDR 形式を受け入れます。 -
subnets フィールドには 1 つまたは 2 つの項目を入力できます。2 つのアイテムは、異なるファミリーに属している必要があります。たとえば、subnets の値は
10.100.0.0/16
と2001:db8::/64
です。 -
Layer2
サブネットは省略できます。省略すると、ユーザーは Pod の IP アドレスを設定する必要があります。結果として、ポートセキュリティーは MAC スプーフィングのみを防止します。 -
ipamLifecycle
フィールドが指定されている場合、Layer2
subnets
フィールドは必須です。
Layer3
トポロジーのリクエストを定義するには、次の例のように、my-layer-three-udn.yaml
などの YAML ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
UserDefinedNetwork
リソースの名前。これはdefault
にすべきではありません。また、Cluster Network Operator (CNO) によって作成されたグローバル namespace と重複してはなりません。- 2
topology
フィールドはネットワーク設定を記述します。受け入れられる値はLayer2
とLayer3
です。Layer3
トポロジータイプを指定すると、ノードごとにレイヤー 2 セグメントが作成され、それぞれに異なるサブネットが割り当てられます。レイヤー 3 ルーティングは、ノードサブネットを相互接続するために使用されます。- 3
- このフィールドは、トポロジー設定を指定します。有効な値は
layer2
またはlayer3
です。 - 4
Primary
ロールまたはSecondary
ロールを指定します。- 5
Layer3
トポロジータイプの場合、subnet
フィールドの設定の詳細を次に示します。-
subnets
フィールドは必須です。 subnets
フィールドのタイプは、cidr
およびhostSubnet
です。-
cidr
は、クラスターのclusterNetwork
設定に相当します。CIDR 内の IP アドレスは、ユーザー定義ネットワーク内の Pod に配布されます。このパラメーターは文字列値を受け入れます。 -
hostSubnet
は、ノードごとのサブネット接頭辞を定義します。 -
IPv6 の場合、
hostSubnet
では/64
の長さのみがサポートされます。
-
-
次のコマンドを実行してリクエストを適用します。
oc apply -f <my_layer_two_udn.yaml>
$ oc apply -f <my_layer_two_udn.yaml>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、
<my_layer_two_udn.yaml>
は、Layer2
またはLayer3
設定ファイルの名前です。次のコマンドを実行して、リクエストが成功したことを確認します。
oc get userdefinednetworks udn-1 -n <some_custom_namespace> -o yaml
$ oc get userdefinednetworks udn-1 -n <some_custom_namespace> -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、
some_custom_namespace
は、ユーザー定義ネットワーク用に作成した namespace です。出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.1.5.1. UserDefinedNetworks CR の追加設定の詳細 リンクのコピーリンクがクリップボードにコピーされました!
次の表では、UDN のオプションの追加設定を説明します。OVN-Kubernetes ネットワークトポロジーに対する明示的な要件がなく、理解していない場合は、これらのフィールドを設定することは推奨しません。
- ユーザー定義ネットワークのオプション設定
CUDN のフィールド | UDN のフィールド | タイプ | 説明 |
|
| object |
省略すると、プラットフォームは
|
|
| object |
Persistent の値は、 |
|
| object |
Enabled:
Disabled: |
|
| integer |
最大転送単位 (MTU)。デフォルト値は |
ここでは、以下のようになります。
<topology>
-
layer2
またはlayer3
のいずれかです。