第3章 セカンダリーネットワーク
3.1. OVN-Kubernetes でのセカンダリーネットワークの作成 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、NetworkAttachmentDefinition (NAD) リソースを使用して、クラスターのセカンダリーネットワークを設定できます。
3.1.1. OVN-Kubernetes セカンダリーネットワークの設定 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenShift Networking OVN-Kubernetes ネットワークプラグインを使用すると、Pod のセカンダリーネットワークインターフェイスを設定できます。セカンダリーネットワークインターフェイスを設定するには、NetworkAttachmentDefinition カスタムリソース定義 (CRD) で設定を定義する必要があります。
Pod およびマルチネットワークポリシーの作成は、ノード内の OVN-Kubernetes コントロールプレーンエージェントが関連する network-attachment-definition CRD を処理するまで、保留状態のままになる場合があります。
OVN-Kubernetes セカンダリーネットワークは、レイヤー 2、レイヤー 3、または localnet トポロジーで設定できます。
次のセクションでは、OVN-Kubernetes で現在セカンダリーネットワークに許可されている各トポロジーの設定例を示します。
ネットワーク名は一意である必要があります。たとえば、同じネットワークを参照する異なる設定を持つ複数の NetworkAttachmentDefinition CRD の作成はサポートされていません。
3.1.1.1. OVN-Kubernetes セカンダリーネットワークのサポート対象プラットフォーム リンクのコピーリンクがクリップボードにコピーされました!
次のサポート対象プラットフォームで OVN-Kubernetes セカンダリーネットワークを使用できます。
- ベアメタル
- IBM Power®
- IBM Z®
- IBM® LinuxONE
- VMware vSphere
- Red Hat OpenStack Platform (RHOSP)
3.1.1.2. OVN-Kubernetes ネットワークプラグインの JSON 設定テーブル リンクのコピーリンクがクリップボードにコピーされました!
OVN-Kubernetes ネットワークプラグインの JSON 設定オブジェクトには、OVN-Kubernetes CNI ネットワークプラグインの設定パラメーターを記述します。次の表にそのパラメーターの詳細を示します。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
CNI 仕様のバージョン。必要な値は |
|
|
|
ネットワークの名前。このネットワークは namespace スコープではありません。たとえば、 |
|
|
|
設定する CNI プラグインの名前。この値は |
|
|
|
ネットワークのトポロジー設定。 |
|
|
| クラスター全体のネットワークに使用するサブネット。
省略した場合、ネットワークを実装する論理スイッチはレイヤー 2 通信のみを提供し、ユーザーは Pod の IP アドレスを設定する必要があります。ポートセキュリティーは、MAC スプーフィングのみを防止します。 |
|
|
| 最大伝送単位 (MTU)。この値を設定しなかった場合、Cluster Network Operator (CNO) が、プライマリーネットワークインターフェイスのアンダーレイ MTU、Geneve (Generic Network Virtualization Encapsulation) などの Pod ネットワークのオーバーレイ MTU、および IPsec などの有効な機能のバイト容量の差を計算して、デフォルトの MTU 値を設定します。 |
|
|
|
この設定が含まれるネットワークアタッチメント定義 CRD のメタデータの |
|
|
| CIDR と IP アドレスのコンマ区切りのリスト。IP アドレスは割り当て可能な IP アドレスプールから削除され、Pod に渡されることはありません。 |
|
|
|
トポロジーが |
3.1.1.3. マルチネットワークポリシーとの互換性 リンクのコピーリンクがクリップボードにコピーされました!
ネットワークポリシーを定義する場合、使用できるネットワークポリシールールは、OVN-Kubernetes セカンダリーネットワークが subnets フィールドを定義しているかどうかによって異なります。
k8s.cni.cncf.io API グループの MultiNetworkPolicy カスタムリソース定義 (CRD) によって提供されるマルチネットワークポリシー API は、OVN-Kubernetes セカンダリーネットワークと互換性があります。
subnets CNI 設定に基づいてサポートされているマルチネットワークポリシーセレクターの詳細は、次の表を参照してください。
subnets フィールドの指定 | 許可されたマルチネットワークポリシーセレクター |
|---|---|
| はい |
|
| いいえ |
|
MultiNetworkPolicy オブジェクトで k8s.v1.cni.cncf.io/policy-for アノテーションを使用することで、NetworkAttachmentDefinition (NAD) カスタムリソース (CR) を指定できます。NAD CR は、ポリシーを適用するネットワークを定義します。次に示す Pod セレクターを使用したマルチネットワークポリシーの例は、subnets フィールドが blue2 という名前のセカンダリーネットワーク用のセカンダリーネットワーク CNI 設定で定義されている場合にのみ有効です。
apiVersion: k8s.cni.cncf.io/v1beta1
kind: MultiNetworkPolicy
metadata:
name: allow-same-namespace
annotations:
k8s.v1.cni.cncf.io/policy-for: blue2
spec:
podSelector:
ingress:
- from:
- podSelector: {}
次の例では、ipBlock ネットワークマルチネットワークポリシーを使用します。このポリシーは、OVN-Kubernetes セカンダリーネットワークに対して常に有効です。
IP ブロックセレクターを使用するマルチネットワークポリシーの例
apiVersion: k8s.cni.cncf.io/v1beta1
kind: MultiNetworkPolicy
metadata:
name: ingress-ipblock
annotations:
k8s.v1.cni.cncf.io/policy-for: default/flatl2net
spec:
podSelector:
matchLabels:
name: access-control
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 10.200.0.0/30
3.1.1.4. localnet スイッチドトポロジーの設定 リンクのコピーリンクがクリップボードにコピーされました!
スイッチド localnet トポロジーは、ネットワークアタッチメント定義 (NAD) として作成されたワークロードを、クラスター全体の論理スイッチを介して物理ネットワークに相互接続します。
セカンダリーネットワークを OVN-Kubernetes のセカンダリーネットワークとして使用するには、それを OVS ブリッジにマッピングする必要があります。ブリッジマッピングにより、ネットワークトラフィックが物理ネットワークに到達できるようになります。ブリッジマッピングは、インターフェイスラベルとも呼ばれる物理ネットワーク名を、Open vSwitch (OVS) で作成されたブリッジに関連付けます。
nmstate.io/v1 API グループの一部である NodeNetworkConfigurationPolicy (NNCP) オブジェクトを作成して、宣言的にマッピングを作成できます。この API は NMState Operator によって提供されます。この API を使用すると、指定した nodeSelector 式 (node-role.kubernetes.io/worker: '' など) に一致するノードにブリッジマッピングを適用できます。この宣言的なアプローチにより、NMState Operator は、ノードセレクターによって指定されたすべてのノードにセカンダリーネットワーク設定を自動的かつ透過的に適用します。
セカンダリーネットワークを接続する場合、既存の br-ex ブリッジを使用することも、新しいブリッジを作成することもできます。どのアプローチを使用するかは、特定のネットワークインフラストラクチャーによって異なります。次のアプローチを検討してください。
-
ノードにネットワークインターフェイスが 1 つしか含まれていない場合は、既存のブリッジを使用する必要があります。このネットワークインターフェイスは OVN-Kubernetes によって所有および管理されているため、
br-exブリッジから削除したり、インターフェイス設定を変更したりしないでください。ネットワークインターフェイスを削除または変更すると、クラスターネットワークが正常に動作しなくなります。 - ノードに複数のネットワークインターフェイスが含まれている場合は、別のネットワークインターフェイスを新しいブリッジに接続して、セカンダリーネットワークに使用できます。このアプローチでは、プライマリークラスターネットワークからトラフィックが分離されます。
次のブリッジ共有の例では、localnet1 ネットワークが br-ex ブリッジにマッピングされています。
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: mapping
spec:
nodeSelector:
node-role.kubernetes.io/worker: ''
desiredState:
ovn:
bridge-mappings:
- localnet: localnet1
bridge: br-ex
state: present
# ...
ここでは、以下のようになります。
name- 設定オブジェクトの名前。
node-role.kubernetes.io/worker- ノードネットワーク設定ポリシーを適用するノードを指定するノードセレクター。
localnet-
トラフィックが OVS ブリッジに転送されるセカンダリーネットワークの名前。このセカンダリーネットワークは、OVN-Kubernetes セカンダリーネットワークを定義する
NetworkAttachmentDefinitionCRD のspec.config.nameフィールドの名前と一致する必要があります。 bridge-
ノード上の OVS ブリッジの名前。この値は、
state: presentを指定する場合にのみ必要です。 state-
マッピングの状態。ブリッジを追加する場合は
present、ブリッジを削除する場合はabsentである必要があります。デフォルト値はpresentです。
次の JSON の例では、localnet1 という名前の localnet セカンダリーネットワークを設定します。mtu パラメーターの値は、br-ex ブリッジインターフェイスにマッピングされるセカンダリーネットワークインターフェイスに設定された MTU 値と一致する必要があることに注意してください。
{
"cniVersion": "0.3.1",
"name": "localnet1",
"type": "ovn-k8s-cni-overlay",
"topology":"localnet",
"physicalNetworkName": "localnet1",
"subnets": "202.10.130.112/28",
"vlanID": 33,
"mtu": 1500,
"netAttachDefName": "ns1/localnet-network",
"excludeSubnets": "10.100.200.0/29"
}
次に示す複数のインターフェイスの例では、localnet2 ネットワークインターフェイスが ovs-br1 ブリッジに接続されています。この接続を使って、ネットワークインターフェイスを OVN-Kubernetes ネットワークプラグインでセカンダリーネットワークとして利用できるようになります。
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: ovs-br1-multiple-networks
spec:
nodeSelector:
node-role.kubernetes.io/worker: ''
desiredState:
interfaces:
- name: ovs-br1
description: |-
A dedicated OVS bridge with eth1 as a port
allowing all VLANs and untagged traffic
type: ovs-bridge
state: up
bridge:
allow-extra-patch-ports: true
options:
stp: false
mcast-snooping-enable: true
port:
- name: eth1
ovn:
bridge-mappings:
- localnet: localnet2
bridge: ovs-br1
state: present
ここでは、以下のようになります。
name- 設定オブジェクトの名前を指定します。
node-role.kubernetes.io/worker- ノードネットワーク設定ポリシーが適用されるノードを識別するノードセレクターを指定します。
interfaces.name- クラスタートラフィック用に OVN-Kubernetes によって使用されるデフォルトのブリッジとは別に動作する新しい OVS ブリッジを指定します。
mcast-snooping-enable-
マルチキャストスヌーピングを有効にするかどうかを指定します。マルチキャストスヌーピングを有効にすると、ネットワークデバイスがすべてのネットワークメンバーにマルチキャストトラフィックをフラッディングすることを防止します。デフォルトでは、OVS ブリッジはマルチキャストスヌーピングを有効にしません。デフォルト値は
falseです。 `port.name- 新しい OVS ブリッジに関連付けるホストシステム上のネットワークデバイスを指定します。
bridge-mappings.localnet-
トラフィックを OVS ブリッジに転送するセカンダリーネットワークの名前を指定します。この名前は、OVN-Kubernetes セカンダリーネットワークを定義する
NetworkAttachmentDefinitionCRD のspec.config.nameフィールドの値と一致する必要があります。 bridge-mappings.bridge-
ノード上の OVS ブリッジの名前を指定します。値は、
state: presentが設定されている場合にのみ必要です。 bridge-mappings.state-
マッピングの状態を指定します。有効な値は、ブリッジを追加する場合は
present、ブリッジを削除する場合はabsentです。デフォルト値はpresentです。
次の JSON の例では、localnet2 という名前の localnet セカンダリーネットワークを設定します。mtu パラメーターの値は、eth1 セカンダリーネットワークインターフェイスに設定された MTU 値と一致する必要があることに注意してください。
{
"cniVersion": "0.3.1",
"name": "localnet2",
"type": "ovn-k8s-cni-overlay",
"topology":"localnet",
"physicalNetworkName": "localnet2",
"subnets": "202.10.130.112/28",
"vlanID": 33,
"mtu": 1500,
"netAttachDefName": "ns1/localnet-network",
"excludeSubnets": "10.100.200.0/29"
}
3.1.1.4.1. レイヤー 2 スイッチドトポロジーの設定 リンクのコピーリンクがクリップボードにコピーされました!
スイッチド (レイヤー 2) トポロジーネットワークは、クラスター全体の論理スイッチを介してワークロードを相互接続します。この設定は、IPv6 およびデュアルスタックデプロイメントに使用できます。
レイヤー 2 スイッチドトポロジーネットワークでは、クラスター内の Pod 間のデータパケットの転送のみが許可されます。
次の JSON 例では、スイッチドセカンダリーネットワークを設定します。
{
"cniVersion": "0.3.1",
"name": "l2-network",
"type": "ovn-k8s-cni-overlay",
"topology":"layer2",
"subnets": "10.100.200.0/24",
"mtu": 1300,
"netAttachDefName": "ns1/l2-network",
"excludeSubnets": "10.100.200.0/29"
}
3.1.1.5. セカンダリーネットワーク用の Pod の設定 リンクのコピーリンクがクリップボードにコピーされました!
k8s.v1.cni.cncf.io/networks アノテーションを使用して、セカンダリーネットワーク割り当てを指定する必要があります。
次の例では、このガイドに示されているアタッチメント設定ごとに 1 つずつ、合計 2 つのセカンダリーアタッチメントを持つ Pod をプロビジョニングします。
apiVersion: v1
kind: Pod
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: l2-network
name: tinypod
namespace: ns1
spec:
containers:
- args:
- pause
image: k8s.gcr.io/e2e-test-images/agnhost:2.36
imagePullPolicy: IfNotPresent
name: agnhost-container
3.1.1.6. 静的 IP アドレスを使用して Pod を設定する リンクのコピーリンクがクリップボードにコピーされました!
静的 IP アドレス使用して Pod を設定できます。この手順の例では、静的 IP アドレスを使用して Pod をプロビジョニングします。
- セカンダリーネットワークアタッチメント (namespace スコープのオブジェクト) がレイヤー 2 または localnet トポロジーを使用している場合にのみ、Pod のセカンダリーネットワークアタッチメントの IP アドレスを指定できます。
- Pod の静的 IP アドレスを指定できるのは、割り当て設定にサブネットが含まれていない場合のみです。
apiVersion: v1
kind: Pod
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: '[
{
"name": "l2-network",
"mac": "02:03:04:05:06:07",
"interface": "myiface1",
"ips": [
"192.0.2.20/24"
]
}
]'
name: tinypod
namespace: ns1
spec:
containers:
- args:
- pause
image: k8s.gcr.io/e2e-test-images/agnhost:2.36
imagePullPolicy: IfNotPresent
name: agnhost-container
ここでは、以下のようになります。
k8s.v1.cni.cncf.io/networks.name-
ネットワークの名前。この値は、すべての
NetworkAttachmentDefinitionCRD にわたって一意である必要があります。 k8s.v1.cni.cncf.io/networks.mac- インターフェイスに割り当てられる MAC アドレス。
k8s.v1.cni.cncf.io/networks.interface- Pod 用に作成されるネットワークインターフェイスの名前。
k8s.v1.cni.cncf.io/networks.ips- ネットワークインターフェイスに割り当てられる IP アドレス。