3.3. Pod をセカンダリーネットワークにアタッチする
Pod をセカンダリーネットワークに割り当てることができます。Pod をセカンダリーネットワークに割り当てると、Pod はプライマリークラスターネットワークを超えて追加のネットワークインターフェイスを使用できます。
3.3.1. セカンダリーネットワークに Pod を追加する リンクのコピーリンクがクリップボードにコピーされました!
セカンダリーネットワークに Pod を追加できます。Pod は、デフォルトネットワークで通常のクラスター関連のネットワークトラフィックを継続的に送信します。
Pod が作成されると、セカンダリーネットワークが Pod にアタッチされます。ただし、Pod がすでに存在する場合は、セカンダリーネットワークをその Pod にアタッチすることはできません。
Pod はセカンダリーネットワークと同じ namespace に存在する必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - クラスターにログインする。
手順
アノテーションを
Podオブジェクトに追加します。以下のアノテーション形式のいずれかのみを使用できます。カスタマイズせずにセカンダリーネットワークを割り当てるには、以下の形式でアノテーションを追加します。
metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]ここでは、以下のようになります。
k8s.v1.cni.cncf.io/networks- Pod に関連付けるセカンダリーネットワークの名前を指定します。複数のセカンダリーネットワークを指定するには、各ネットワークをコンマで区切ります。コンマの間にはスペースを入れないでください。同じセカンダリーネットワークを複数回指定した場合、Pod は複数のネットワークインターフェイスをそのネットワークにアタッチします。
カスタマイズしてセカンダリーネットワークをアタッチするには、次の形式でアノテーションを追加します。
metadata: annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "<network>", "namespace": "<namespace>", "default-route": ["<default_route>"] } ]ここでは、以下のようになります。
name-
NetworkAttachmentDefinitionオブジェクトによって定義されるセカンダリーネットワークの名前を指定します。 namespace-
NetworkAttachmentDefinitionオブジェクトが定義される namespace を指定します。 default-route-
オプションのパラメーター。デフォルトルートのオーバーライドを指定します(例:
192.168.17.1)。
以下のコマンドを入力して Pod を作成します。
$ oc create -f <name>.yaml<name>を Pod の名前に置き換えます。オプション:次のコマンドを入力して、アノテーションが
PodCR に存在することを確認します。<name>を Pod の名前に置き換えます。$ oc get pod <name> -o yaml次の例では、
example-podPod がnet1セカンダリーネットワークにアタッチされています。$ oc get pod example-pod -o yaml apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: macvlan-bridge k8s.v1.cni.cncf.io/network-status: |- [{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.128.2.14" ], "default": true, "dns": {} },{ "name": "macvlan-bridge", "interface": "net1", "ips": [ "20.2.2.100" ], "mac": "22:2f:60:a5:f8:00", "dns": {} }] name: example-pod namespace: default spec: ... status: ...ここでは、以下のようになります。
k8s.v1.cni.cncf.io/network-status- オブジェクトの JSON 配列を指定します。各オブジェクトは、Pod にアタッチされているセカンダリーネットワークのステータスを表します。アノテーションの値はプレーンテキストの値として保存されます。
3.3.1.1. Pod 固有のアドレスおよびルーティングオプションの指定 リンクのコピーリンクがクリップボードにコピーされました!
JSON 形式のアノテーションを使用して、Pod 固有のアドレス指定およびルーティングオプションを設定できます。これらのオプションを設定すると、Pod の静的 IP アドレス、MAC アドレス、およびデフォルトルートを設定できます。
前提条件
- Pod はセカンダリーネットワークと同じ namespace に存在する必要があります。
-
OpenShift CLI (
oc) がインストールされている。 - クラスターにログインすること。
手順
Podリソース定義を編集します。既存のPodリソースを編集する場合は、以下のコマンドを実行してデフォルトエディターでその定義を編集します。<name>を、編集するPodリソースの名前に置き換えます。$ oc edit pod <name>Podリソース定義で、k8s.v1.cni.cncf.io/networksパラメーターを Pod のmetadataマッピングに追加します。k8s.v1.cni.cncf.io/networksは、追加のプロパティーを指定するだけでなく、NetworkAttachmentDefinitionカスタムリソース (CR) 名を参照するオブジェクトリストの JSON 文字列を受け入れます。metadata: annotations: k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]' # ...ここでは、以下のようになります。
<network>- 次の例に示すように、JSON オブジェクトに置き換えます。一重引用符が必要です。
次の例では、アノテーション内で
default-routeパラメーターを使用して、デフォルトルートを持つネットワークアタッチメントを指定しています。apiVersion: v1 kind: Pod metadata: name: example-pod annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "net1" }, { "name": "net2", "default-route": ["192.0.2.1"] }]' spec: containers: - name: example-pod command: ["/bin/bash", "-c", "sleep 2000000000000"] image: centos/toolsここでは、以下のようになります。
name- Pod に関連付けるセカンダリーネットワークの名前を指定します。
default-route-
ルーティングテーブルに他のルーティングテーブルがない場合に、ルーティングされるトラフィックのゲートウェイ値を指定します。複数の
default-routeキーを指定すると、Pod がアクティブでなくなります。
デフォルトのルートにより、他のルートに指定されていないトラフィックがゲートウェイにルーティングされます。
重要OpenShift Container Platform のデフォルトのネットワークインターフェイス以外のインターフェイスへのデフォルトのルートを設定すると、Pod 間のトラフィックに予想されるトラフィックが別のインターフェイスでルーティングされる可能性があります。
Pod のルーティングプロパティーを確認する場合、
ocコマンドを Pod 内でipコマンドを実行するために使用できます。$ oc exec -it <pod_name> -- ip route注記また、Pod の
k8s.v1.cni.cncf.io/network-statusを参照して、JSON 形式のオブジェクトリスト内のdefault-routeキーの存在によって、どのセカンダリーネットワークにデフォルトルートが割り当てられているかを確認することもできます。Pod に静的 IP アドレスまたは MAC アドレスを設定するには、JSON 形式のアノテーションを使用できます。これには、この機能をとくに許可するネットワークを作成する必要があります。これは、CNO の rawCNIConfig で指定できます。
以下のコマンドを実行して CNO CR を編集します。
$ oc edit networks.operator.openshift.io cluster以下の YAML は、CNO の設定パラメーターを説明しています。
Cluster Network Operator YAML の設定
name: <name> namespace: <namespace> rawCNIConfig: '{ ... }' type: Rawここでは、以下のようになります。
name-
作成するセカンダリーネットワーク割り当ての名前を指定します。名前は指定された
namespace内で一意である必要があります。 namespace-
ネットワークの割り当てを作成する namespace を指定します。値を指定しない場合、
defaultの namespace が使用されます。 rawCNIConfig- 以下のテンプレートに基づく CNI プラグイン設定を JSON 形式で指定します。
以下のオブジェクトは、macvlan CNI プラグインを使用して静的 MAC アドレスと IP アドレスを使用するための設定パラメーターを説明しています。
静的 IP および MAC アドレスを使用した macvlan CNI プラグイン JSON 設定オブジェクト
{ "cniVersion": "0.3.1", "name": "<name>", "plugins": [{ "type": "macvlan", "capabilities": { "ips": true }, "master": "eth0", "mode": "bridge", "ipam": { "type": "static" } }, { "capabilities": { "mac": true }, "type": "tuning" }] }ここでは、以下のようになります。
name-
作成するセカンダリーネットワークアタッチメントの名前を指定します。名前は指定された
namespace内で一意である必要があります。 plugins- CNI プラグイン設定の配列を指定します。1 つ目のオブジェクトは、macvlan プラグイン設定を指定し、2 つ目のオブジェクトはチューニングプラグイン設定を指定します。
ips- CNI プラグインのランタイム設定機能の静的 IP 機能を有効にするために要求が実行されるように指定します。
master- macvlan プラグインが使用するインターフェイスを指定します。
mac- CNI プラグインの静的 MAC アドレス機能を有効にするために要求が実行されるように指定します。
上記のネットワークアタッチメントは、特定の Pod に割り当てる静的 IP と MAC アドレスを指定するためのキーとともに、JSON 形式のアノテーション内で参照できます。
以下のコマンドを入力して Pod を編集します。
$ oc edit pod <name>静的 IP および MAC アドレスを使用した macvlan CNI プラグイン JSON 設定オブジェクト
apiVersion: v1 kind: Pod metadata: name: example-pod annotations: k8s.v1.cni.cncf.io/networks: '[ { "name": "<name>", "ips": [ "192.0.2.205/24" ], "mac": "CA:FE:C0:FF:EE:00" } ]'ここでは、以下のようになります。
name-
作成するセカンダリーネットワークアタッチメントの名前を指定します。名前は指定された
namespace内で一意である必要があります。 ips- サブネットマスクを含む IP アドレスを指定します。
mac- MAC アドレスを指定します。
注記静的 IP アドレスおよび MAC アドレスを同時に使用することはできません。これらは個別に、または一緒に使用することもできます。