OVN-Kubernetes ネットワークプラグイン
OpenShift Container Platform における OVN-Kubernetes ネットワークプラグインの詳細な設定とトラブルシューティング
概要
第1章 OVN-Kubernetes ネットワークプラグインについて リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターは、Pod およびサービスネットワークに仮想化ネットワークを使用します。
Red Hat OpenShift Networking の一部である OVN-Kubernetes ネットワークプラグインは、OpenShift Container Platform のデフォルトのネットワークプロバイダーです。OVN-Kubernetes は Open Virtual Network (OVN) をベースとしており、オーバーレイベースのネットワーク実装を提供します。OVN-Kubernetes プラグインを使用するクラスターは、各ノードで Open vSwitch (OVS) も実行します。OVN は、宣言ネットワーク設定を実装するように各ノードで OVS を設定します。
OVN-Kubernetes は、OpenShift Container Platform および単一ノードの OpenShift デプロイメントのデフォルトのネットワークソリューションです。
OVS プロジェクトから生まれた OVN-Kubernetes は、オープンフロールールなどの同じコンストラクトの多くを使用して、パケットがネットワークをどのように移動するかを決定します。詳細は、Open Virtual Network の Web サイト を参照してください。
OVN-Kubernetes は、仮想ネットワーク設定を OpenFlow ルールに変換する OVS 用のデーモンシリーズです。OpenFlow は、ネットワークスイッチやルーターと通信するためのプロトコルであり、ネットワークデバイス上のネットワークトラフィックのフローをリモートで制御する手段を提供します。つまり、ネットワーク管理者はネットワークトラフィックのフローを設定、管理、および監視できます。
OVN-Kubernetes は、OpenFlow では利用できない高度な機能をさらに提供します。OVN は、分散仮想ルーティング、分散論理スイッチ、アクセス制御、Dynamic Host Configuration Protocol (DHCP)、および DNS をサポートしています。OVN は、オープンフローと同等の論理フロー内に分散仮想ルーターを実装します。たとえば、ネットワーク上の DHCP サーバーに DHCP 要求を送信する Pod がある場合、その要求内の論理フロールールが、OVN-Kubernetes によるパケットの処理を補助します。これは、サーバーがゲートウェイ、DNS サーバー、IP アドレスなどの情報で応答できることを意味します。
OVN-Kubernetes は、各ノードでデーモンを実行します。すべてのノードで実行されるデータベースおよび OVN コントローラー用のデーモンセットがあります。OVN コントローラーは、ノード上の Open vSwitch デーモンをプログラムして、次のネットワークプロバイダー機能をサポートします。
- Egress IP
- ファイアウォール
- ハードウェアのオフロード
- ハイブリッドネットワーク
- Internet Protocol Security (IPsec) 暗号化
- IPv6
- マルチキャスト。
- ネットワークポリシーとネットワークポリシーログ
- Routers
1.1. OVN-Kubernetes の目的 リンクのコピーリンクがクリップボードにコピーされました!
OVN-Kubernetes ネットワークプラグインは、Open Virtual Network (OVN) を使用してネットワークトラフィックフローを管理する、オープンソースのフル機能の Kubernetes CNI プラグインです。OVN はコミュニティーで開発され、ベンダーに依存しないネットワーク仮想化ソリューションです。OVN-Kubernetes ネットワークプラグインは次のテクノロジーを使用します。
- ネットワークトラフィックフローを管理するための OVN。
- Ingress ルールおよび Egress ルールを含む Kubernetes ネットワークポリシーのサポートとログ。
- ノード間にオーバーレイネットワークを作成するための、Virtual Extensible LAN (VXLAN) ではなく、Generic Network Virtualization Encapsulation (Geneve) プロトコル。
OVN-Kubernetes ネットワークプラグインは、次の機能をサポートしています。
- Linux と Microsoft Windows の両方のワークロードを実行できるハイブリッドクラスター。この環境は ハイブリッドネットワーキング と呼ばれます。
- ホストの中央処理装置 (CPU) から互換性のあるネットワークカードおよびデータ処理装置 (DPU) へのネットワークデータ処理のオフロード。これは ハードウェアオフロード と呼ばれます。
- ベアメタル、VMware vSphere、IBM Power®、IBM Z®、および Red Hat OpenStack Platform (RHOSP) プラットフォーム上の IPv4 プライマリーデュアルスタックネットワーク。
- RHOSP およびベアメタルプラットフォーム上の IPv6 シングルスタックネットワーク。
- ベアメタル、VMware vSphere、または RHOSP プラットフォーム上で実行しているクラスター用の IPv6 プライマリーデュアルスタックネットワーク。
- Egress ファイアウォールデバイスと Egress IP アドレス。
- リダイレクトモードで動作する Egress ルーターデバイス。
- クラスター内通信の IPsec 暗号化。
Red Hat は、OVN-Kubernetes ネットワークプラグインを使用する次のインストール後の設定をサポートしません。
- NMState Operator を使用してインターフェイスのボンディングを設定するなどのプライマリーネットワークインターフェイスの設定。
-
Open vSwitch (OVS) または OVN-Kubernetes
br-exブリッジネットワークを使用するネットワークデバイス上でのサブインターフェイスまたは追加のネットワークインターフェイスの設定。 - プライマリーネットワークインターフェイス上での追加の仮想ローカルエリアネットワーク (VLAN) の作成。
-
クラスターのインストール中にノード用に作成した
eth0またはbond0などのプライマリーネットワークインターフェイスを使用した、追加のセカンダリーネットワークの作成。
Red Hat は、OVN-Kubernetes ネットワークプラグインを使用する次のインストール後の設定をサポートします。
-
クラスターのインストール中にプライマリーネットワークインターフェイスをノードの VLAN として設定した
eth0.100などのベースとなる物理インターフェイスからの追加の VLAN の作成。これは、Open vSwitch (OVS) ブリッジがeth0.100のような初期 VLAN サブインターフェイスに接続され、ベースとなる物理インターフェイスを新しい設定で利用可能な状態のままにするため、機能します。 -
localnetトポロジーネットワークを使用して追加の OVN セカンダリーネットワークを作成するには、NodeNetworkConfigurationPolicy(NNCP) オブジェクトでセカンダリーネットワークを定義する必要があります。ネットワークを作成すると、Pod または仮想マシン (VM) をネットワークに接続できるようになります。これらのセカンダリーネットワークは、VLAN タグ付けを使用する場合と使用しない場合がある物理ネットワークへの専用の接続を提供します。ホストに必要なネットワーク設定などの必要なセットアップがないノードのホストネットワークからは、これらのネットワークにアクセスできません。
1.2. OVN-Kubernetes IPv6 とデュアルスタックの制限 リンクのコピーリンクがクリップボードにコピーされました!
OVN-Kubernetes ネットワークプラグインには、次の制限があります。
デュアルスタックネットワークに設定されたクラスターでは、IPv4 と IPv6 の両方のトラフィックがデフォルトゲートウェイとして同じネットワークインターフェイスを使用する必要があります。
この要件が満たされない場合には、
ovnkube-nodeデーモンセットのホストにある Pod は、CrashLoopBackOff状態になります。oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node -o yamlのようなコマンドで Pod を表示すると、以下の出力のように、statusフィールドにデフォルトゲートウェイに関する複数のメッセージが表示されます。I1006 16:09:50.985852 60651 helper_linux.go:73] Found default gateway interface br-ex 192.168.127.1 I1006 16:09:50.985923 60651 helper_linux.go:73] Found default gateway interface ens4 fe80::5054:ff:febe:bcd4 F1006 16:09:50.985939 60651 ovnkube.go:130] multiple gateway interfaces detected: br-ex ens4唯一の解決策は、両方の IP ファミリーがデフォルトゲートウェイに同じネットワークインターフェイスを使用するように、ホストネットワークを再設定することです。
デュアルスタックネットワーク用に設定されたクラスターの場合、IPv4 と IPv6 の両方のルーティングテーブルにデフォルトゲートウェイが含まれている必要があります。
この要件が満たされない場合には、
ovnkube-nodeデーモンセットのホストにある Pod は、CrashLoopBackOff状態になります。oc get pod -n openshift-ovn-kubernetes -l app=ovnkube-node -o yamlのようなコマンドで Pod を表示すると、以下の出力のように、statusフィールドにデフォルトゲートウェイに関する複数のメッセージが表示されます。I0512 19:07:17.589083 108432 helper_linux.go:74] Found default gateway interface br-ex 192.168.123.1 F0512 19:07:17.589141 108432 ovnkube.go:133] failed to get default gateway interface唯一の解決策として、両方の IP ファミリーにデフォルトゲートウェイが含まれるようにホストネットワークを再設定できます。
-
クラスターの
MachineConfigカスタムリソース (CR) のkernelArgumentセクションでipv6.disableパラメーターを1に設定すると、OVN-Kubernetes Pod がCrashLoopBackOff状態になります。さらに、Network Operator がDegraded状態のままであるため、クラスターを OpenShift Container Platform の新しいバージョンに更新することが失敗します。Red Hat はクラスターの IPv6 アドレスの無効化をサポートしていないため、ipv6.disableパラメーターを1に設定しないでください。
1.3. セッションアフィニティー リンクのコピーリンクがクリップボードにコピーされました!
セッションアフィニティーは、Kubernetes Service オブジェクトに適用される機能です。<service_VIP>:<Port> に接続するたびに、トラフィックが常に同じバックエンドに負荷分散されるようにする場合は、セッションアフィニティー を使用できます。クライアントの IP アドレスに基づいてセッションアフィニティーを設定する方法など、詳細は、セッションアフィニティー を参照してください。
1.3.1. セッションアフィニティーのスティッキタイムアウト リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform の OVN-Kubernetes ネットワークプラグインは、最後のパケットに基づいて、クライアントからのセッションのスティッキタイムアウトを計算します。たとえば、curl コマンドを 10 回実行すると、スティッキーセッションタイマーは最初のパケットではなく 10 番目のパケットから開始します。その結果、クライアントが継続的にサービスに接続している場合でも、セッションがタイムアウトすることはありません。タイムアウトは、timeoutSeconds パラメーターで設定された時間、サービスがパケットを受信しなかった場合に開始されます。
第2章 OVN-Kubernetes のアーキテクチャー リンクのコピーリンクがクリップボードにコピーされました!
2.1. OVN-Kubernetes のアーキテクチャーの紹介 リンクのコピーリンクがクリップボードにコピーされました!
次の図は、OVN-Kubernetes のアーキテクチャーを示しています。
図2.1 OVK-Kubernetes のアーキテクチャー
主なコンポーネントは次のとおりです。
- Cloud Management System (CMS) - OVN 統合用の CMS 固有のプラグインを提供する OVN 用のプラットフォーム固有のクライアント。このプラグインは、CMS 固有の形式で CMS 設定データベースに格納されているクラウド管理システムの論理ネットワーク設定の概念を、OVN が理解できる中間表現に変換します。
-
OVN ノースバウンドデータベース (
nbdb) コンテナー - CMS プラグインによって渡された論理ネットワーク設定を格納します。 -
OVN サウスバウンドデータベース (
sbdb) コンテナー - 各ノードの Open vSwitch (OVS) システムの物理および論理ネットワーク設定状態を、それらをバインドするテーブルを含めて格納します。 -
OVN North デーモン (
ovn-northd) - これは、nbdbコンテナーとsbdbコンテナーの間の仲介クライアントです。これは、論理ネットワーク設定を、nbdbコンテナーから取得した従来のネットワーク概念の観点から、その下のsbdbコンテナーの論理データパスフローに変換します。ovn-northdデーモンのコンテナー名はnorthdです。このコンテナーはovnkube-nodePod 内で実行されます。 -
ovn-controller -
sbdbコンテナーに必要な情報または更新のために、OVS およびハイパーバイザーと対話する OVN エージェントです。ovn-controllerはsbdbコンテナーから論理フローを読み取り、それらをOpenFlowフローに変換して、ノードの OVS デーモンに送信します。コンテナー名はovn-controllerで、ovnkube-nodePod で実行されます。
OVN Northd、ノースバウンドデータベース、およびサウスバウンドデータベースはクラスター内の各ノードで実行され、主にそのノードにローカルな情報を格納して処理します。
OVN ノースバウンドデータベースには、クラウド管理システム (CMS) によって渡された論理ネットワーク設定があります。OVN ノースバウンドデータベースには、ネットワークの現在の望ましい状態が含まれており、論理ポート、論理スイッチ、論理ルーターなどのコレクションとして提示されます。ovn-northd (northd コンテナー) は、OVN ノースバウンドデータベースと OVN サウスバウンドデータベースに接続します。これは、論理ネットワーク設定を、OVN ノースバウンドデータベースから取得した従来のネットワーク概念の観点から、OVN サウスバウンドデータベースの論理データパスフローに変換します。
OVN サウスバウンドデータベースには、ネットワークの物理的および論理的表現と、それらをリンクするバインディングテーブルがあります。これには、ノードのシャーシ情報と、クラスター内の他のノードに接続するために必要なリモート中継スイッチポートなどの他の設定要素が含まれます。OVN サウスバウンドデータベースには、すべての論理フローも含まれています。この論理フローは、各ノードで実行される ovn-controller プロセスと共有され、ovn-controller はそれらを Open vSwitch (OVS) をプログラムする OpenFlow ルールに変換します。
Kubernetes コントロールプレーンノードでは、別々のノードに 2 つの ovnkube-control-plane Pod が含まれています。これらの Pod は、クラスター内の各ノードに一元的な IP アドレス管理 (IPAM) 割り当てを実行します。どの時点でも、1 つの ovnkube-control-plane Pod がリーダーです。
2.2. OVN-Kubernetes プロジェクト内のすべてのリソースの一覧表示 リンクのコピーリンクがクリップボードにコピーされました!
OVN-Kubernetes プロジェクトで実行されるリソースとコンテナーを見つけることは、OVN-Kubernetes ネットワークの実装を理解するのに役立ちます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
次のコマンドを実行して、OVN-Kubernetes プロジェクト内のすべてのリソース、エンドポイント、および
ConfigMapsを取得します。$ oc get all,ep,cm -n openshift-ovn-kubernetes出力例
Warning: apps.openshift.io/v1 DeploymentConfig is deprecated in v4.14+, unavailable in v4.10000+ NAME READY STATUS RESTARTS AGE pod/ovnkube-control-plane-65c6f55656-6d55h 2/2 Running 0 114m pod/ovnkube-control-plane-65c6f55656-fd7vw 2/2 Running 2 (104m ago) 114m pod/ovnkube-node-bcvts 8/8 Running 0 113m pod/ovnkube-node-drgvv 8/8 Running 0 113m pod/ovnkube-node-f2pxt 8/8 Running 0 113m pod/ovnkube-node-frqsb 8/8 Running 0 105m pod/ovnkube-node-lbxkk 8/8 Running 0 105m pod/ovnkube-node-tt7bx 8/8 Running 1 (102m ago) 105m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ovn-kubernetes-control-plane ClusterIP None <none> 9108/TCP 114m service/ovn-kubernetes-node ClusterIP None <none> 9103/TCP,9105/TCP 114m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/ovnkube-node 6 6 6 6 6 beta.kubernetes.io/os=linux 114m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/ovnkube-control-plane 3/3 3 3 114m NAME DESIRED CURRENT READY AGE replicaset.apps/ovnkube-control-plane-65c6f55656 3 3 3 114m NAME ENDPOINTS AGE endpoints/ovn-kubernetes-control-plane 10.0.0.3:9108,10.0.0.4:9108,10.0.0.5:9108 114m endpoints/ovn-kubernetes-node 10.0.0.3:9105,10.0.0.4:9105,10.0.0.5:9105 + 9 more... 114m NAME DATA AGE configmap/control-plane-status 1 113m configmap/kube-root-ca.crt 1 114m configmap/openshift-service-ca.crt 1 114m configmap/ovn-ca 1 114m configmap/ovnkube-config 1 114m configmap/signer-ca 1 114mクラスター内の各ノードには、1 つの
ovnkube-nodePod があります。ovnkube-configconfig map には、OpenShift Container Platform OVN-Kubernetes 設定が含まれています。次のコマンドを実行して、
ovnkube-nodePod 内のすべてのコンテナーを一覧表示します。$ oc get pods ovnkube-node-bcvts -o jsonpath='{.spec.containers[*].name}' -n openshift-ovn-kubernetes予想される出力
ovn-controller ovn-acl-logging kube-rbac-proxy-node kube-rbac-proxy-ovn-metrics northd nbdb sbdb ovnkube-controllerovnkube-nodePod は、複数のコンテナーで構成されています。これは、ノースバウンドデータベース (nbdbコンテナー)、サウスバウンドデータベース (sbdbコンテナー)、ノースデーモン (northdコンテナー)、ovn-controllerおよびovnkube-controllerコンテナーをホストします。ovnkube-controllerコンテナーは、Pod、Egress IP、namespace、サービス、エンドポイント、Egress ファイアウォール、ネットワークポリシーなどの API オブジェクトを監視します。また、そのノードの利用可能なサブネットプールから Pod IP への割り当ても行います。次のコマンドを実行して、
ovnkube-control-planePod 内のすべてのコンテナーをリスト表示します。$ oc get pods ovnkube-control-plane-65c6f55656-6d55h -o jsonpath='{.spec.containers[*].name}' -n openshift-ovn-kubernetes予想される出力
kube-rbac-proxy ovnkube-cluster-managerovnkube-control-planePod には、各 OpenShift Container Platform ノードに常駐するコンテナー (ovnkube-cluster-manager) があります。ovnkube-cluster-managerコンテナーは、Pod サブネット、トランジットスイッチサブネット IP、およびジョインスイッチサブネット IP をクラスター内の各ノードに割り当てます。kube-rbac-proxyコンテナーはovnkube-cluster-managerコンテナーのメトリックを監視します。
2.3. OVN-Kubernetes ノースバウンドデータベースの内容の一覧表示 リンクのコピーリンクがクリップボードにコピーされました!
各ノードは、そのノード上の ovnkube-node Pod で実行されている ovnkube-controller コンテナーによって制御されます。OVN 論理ネットワークエンティティーを理解するには、そのノード上の ovnkube-node Pod 内でコンテナーとして実行されているノースバウンドデータベースを調べて、表示するノード内にどのようなオブジェクトがあるかを確認する必要があります。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
クラスター内で ovn nbctl または sbctl コマンドを実行するには、関連するノード上の nbdb または sbdb コンテナーにリモートシェルを開く必要があります。
次のコマンドを実行して Pod をリスト表示します。
$ oc get po -n openshift-ovn-kubernetes出力例
NAME READY STATUS RESTARTS AGE ovnkube-control-plane-8444dff7f9-4lh9k 2/2 Running 0 27m ovnkube-control-plane-8444dff7f9-5rjh9 2/2 Running 0 27m ovnkube-node-55xs2 8/8 Running 0 26m ovnkube-node-7r84r 8/8 Running 0 16m ovnkube-node-bqq8p 8/8 Running 0 17m ovnkube-node-mkj4f 8/8 Running 0 26m ovnkube-node-mlr8k 8/8 Running 0 26m ovnkube-node-wqn2m 8/8 Running 0 16mオプション: Pod とノード情報をリストするには、次のコマンドを実行します。
$ oc get pods -n openshift-ovn-kubernetes -owide出力例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ovnkube-control-plane-8444dff7f9-4lh9k 2/2 Running 0 27m 10.0.0.3 ci-ln-t487nnb-72292-mdcnq-master-1 <none> <none> ovnkube-control-plane-8444dff7f9-5rjh9 2/2 Running 0 27m 10.0.0.4 ci-ln-t487nnb-72292-mdcnq-master-2 <none> <none> ovnkube-node-55xs2 8/8 Running 0 26m 10.0.0.4 ci-ln-t487nnb-72292-mdcnq-master-2 <none> <none> ovnkube-node-7r84r 8/8 Running 0 17m 10.0.128.3 ci-ln-t487nnb-72292-mdcnq-worker-b-wbz7z <none> <none> ovnkube-node-bqq8p 8/8 Running 0 17m 10.0.128.2 ci-ln-t487nnb-72292-mdcnq-worker-a-lh7ms <none> <none> ovnkube-node-mkj4f 8/8 Running 0 27m 10.0.0.5 ci-ln-t487nnb-72292-mdcnq-master-0 <none> <none> ovnkube-node-mlr8k 8/8 Running 0 27m 10.0.0.3 ci-ln-t487nnb-72292-mdcnq-master-1 <none> <none> ovnkube-node-wqn2m 8/8 Running 0 17m 10.0.128.4 ci-ln-t487nnb-72292-mdcnq-worker-c-przlm <none> <none>次のコマンドを実行して、Pod に移動してノースバウンドデータベースを確認します。
$ oc rsh -c nbdb -n openshift-ovn-kubernetes ovnkube-node-55xs2次のコマンドを実行して、ノースバウンドデータベース内のすべてのオブジェクトを表示します。
$ ovn-nbctl show出力は長すぎてここにリストできません。リストには、NAT ルール、論理スイッチ、ロードバランサーなどが含まれます。
次の任意のコマンドのいくつかを使用すると、特定のコンポーネントに絞り込むことができます。
次のコマンドを実行して、論理ルーターのリストを表示します。
$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c northd -- ovn-nbctl lr-list出力例
45339f4f-7d0b-41d0-b5f9-9fca9ce40ce6 (GR_ci-ln-t487nnb-72292-mdcnq-master-2) 96a0a0f0-e7ed-4fec-8393-3195563de1b8 (ovn_cluster_router)注記この出力から、各ノードにルーターと
ovn_cluster_routerがあることがわかります。次のコマンドを実行して、論理スイッチのリストを表示します。
$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c nbdb -- ovn-nbctl ls-list出力例
bdd7dc3d-d848-4a74-b293-cc15128ea614 (ci-ln-t487nnb-72292-mdcnq-master-2) b349292d-ee03-4914-935f-1940b6cb91e5 (ext_ci-ln-t487nnb-72292-mdcnq-master-2) 0aac0754-ea32-4e33-b086-35eeabf0a140 (join) 992509d7-2c3f-4432-88db-c179e43592e5 (transit_switch)注記この出力から、各ノードの ext スイッチに加えて、ノード名自体を持つスイッチと結合スイッチがあることがわかります。
次のコマンドを実行して、ロードバランサーのリストを表示します。
$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c nbdb -- ovn-nbctl lb-list出力例
UUID LB PROTO VIP IPs 7c84c673-ed2a-4436-9a1f-9bc5dd181eea Service_default/ tcp 172.30.0.1:443 10.0.0.3:6443,169.254.169.2:6443,10.0.0.5:6443 4d663fd9-ddc8-4271-b333-4c0e279e20bb Service_default/ tcp 172.30.0.1:443 10.0.0.3:6443,10.0.0.4:6443,10.0.0.5:6443 292eb07f-b82f-4962-868a-4f541d250bca Service_openshif tcp 172.30.105.247:443 10.129.0.12:8443 034b5a7f-bb6a-45e9-8e6d-573a82dc5ee3 Service_openshif tcp 172.30.192.38:443 10.0.0.3:10259,10.0.0.4:10259,10.0.0.5:10259 a68bb53e-be84-48df-bd38-bdd82fcd4026 Service_openshif tcp 172.30.161.125:8443 10.129.0.32:8443 6cc21b3d-2c54-4c94-8ff5-d8e017269c2e Service_openshif tcp 172.30.3.144:443 10.129.0.22:8443 37996ffd-7268-4862-a27f-61cd62e09c32 Service_openshif tcp 172.30.181.107:443 10.129.0.18:8443 81d4da3c-f811-411f-ae0c-bc6713d0861d Service_openshif tcp 172.30.228.23:443 10.129.0.29:8443 ac5a4f3b-b6ba-4ceb-82d0-d84f2c41306e Service_openshif tcp 172.30.14.240:9443 10.129.0.36:9443 c88979fb-1ef5-414b-90ac-43b579351ac9 Service_openshif tcp 172.30.231.192:9001 10.128.0.5:9001,10.128.2.5:9001,10.129.0.5:9001,10.129.2.4:9001,10.130.0.3:9001,10.131.0.3:9001 fcb0a3fb-4a77-4230-a84a-be45dce757e8 Service_openshif tcp 172.30.189.92:443 10.130.0.17:8440 67ef3e7b-ceb9-4bf0-8d96-b43bde4c9151 Service_openshif tcp 172.30.67.218:443 10.129.0.9:8443 d0032fba-7d5e-424a-af25-4ab9b5d46e81 Service_openshif tcp 172.30.102.137:2379 10.0.0.3:2379,10.0.0.4:2379,10.0.0.5:2379 tcp 172.30.102.137:9979 10.0.0.3:9979,10.0.0.4:9979,10.0.0.5:9979 7361c537-3eec-4e6c-bc0c-0522d182abd4 Service_openshif tcp 172.30.198.215:9001 10.0.0.3:9001,10.0.0.4:9001,10.0.0.5:9001,10.0.128.2:9001,10.0.128.3:9001,10.0.128.4:9001 0296c437-1259-410b-a6fd-81c310ad0af5 Service_openshif tcp 172.30.198.215:9001 10.0.0.3:9001,169.254.169.2:9001,10.0.0.5:9001,10.0.128.2:9001,10.0.128.3:9001,10.0.128.4:9001 5d5679f5-45b8-479d-9f7c-08b123c688b8 Service_openshif tcp 172.30.38.253:17698 10.128.0.52:17698,10.129.0.84:17698,10.130.0.60:17698 2adcbab4-d1c9-447d-9573-b5dc9f2efbfa Service_openshif tcp 172.30.148.52:443 10.0.0.4:9202,10.0.0.5:9202 tcp 172.30.148.52:444 10.0.0.4:9203,10.0.0.5:9203 tcp 172.30.148.52:445 10.0.0.4:9204,10.0.0.5:9204 tcp 172.30.148.52:446 10.0.0.4:9205,10.0.0.5:9205 2a33a6d7-af1b-4892-87cc-326a380b809b Service_openshif tcp 172.30.67.219:9091 10.129.2.16:9091,10.131.0.16:9091 tcp 172.30.67.219:9092 10.129.2.16:9092,10.131.0.16:9092 tcp 172.30.67.219:9093 10.129.2.16:9093,10.131.0.16:9093 tcp 172.30.67.219:9094 10.129.2.16:9094,10.131.0.16:9094 f56f59d7-231a-4974-99b3-792e2741ec8d Service_openshif tcp 172.30.89.212:443 10.128.0.41:8443,10.129.0.68:8443,10.130.0.44:8443 08c2c6d7-d217-4b96-b5d8-c80c4e258116 Service_openshif tcp 172.30.102.137:2379 10.0.0.3:2379,169.254.169.2:2379,10.0.0.5:2379 tcp 172.30.102.137:9979 10.0.0.3:9979,169.254.169.2:9979,10.0.0.5:9979 60a69c56-fc6a-4de6-bd88-3f2af5ba5665 Service_openshif tcp 172.30.10.193:443 10.129.0.25:8443 ab1ef694-0826-4671-a22c-565fc2d282ec Service_openshif tcp 172.30.196.123:443 10.128.0.33:8443,10.129.0.64:8443,10.130.0.37:8443 b1fb34d3-0944-4770-9ee3-2683e7a630e2 Service_openshif tcp 172.30.158.93:8443 10.129.0.13:8443 95811c11-56e2-4877-be1e-c78ccb3a82a9 Service_openshif tcp 172.30.46.85:9001 10.130.0.16:9001 4baba1d1-b873-4535-884c-3f6fc07a50fd Service_openshif tcp 172.30.28.87:443 10.129.0.26:8443 6c2e1c90-f0ca-484e-8a8e-40e71442110a Service_openshif udp 172.30.0.10:53 10.128.0.13:5353,10.128.2.6:5353,10.129.0.39:5353,10.129.2.6:5353,10.130.0.11:5353,10.131.0.9:5353注記この出力 (一部省略あり) から、多くの OVN-Kubernetes ロードバランサーがあることがわかります。OVN-Kubernetes のロードバランサーはサービスの表現です。
次のコマンドを実行して、コマンド
ovn-nbctlで使用可能なオプションを表示します。$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c nbdb ovn-nbctl --help
2.4. ノースバウンドデータベースの内容を調べるための ovn-nbctl のコマンドライン引数 リンクのコピーリンクがクリップボードにコピーされました!
次の表に、ノースバウンドデータベースの内容を調べるために ovn-nbctl で使用できるコマンドライン引数を示します。
内容を表示する Pod でリモートシェルを開き、ovn-nbctl コマンドを実行します。
| 引数 | 説明 |
|---|---|
|
| 特定のノードから見たノースバウンドデータベースの内容の概要。 |
|
| 指定されたスイッチまたはルーターに関連付けられた詳細を表示します。 |
|
| 論理ルーターを表示します。 |
|
|
|
|
| 指定されたルーターのネットワークアドレス変換の詳細を表示します。 |
|
| 論理スイッチを表示します。 |
|
|
|
|
| 論理ポートのタイプを取得します。 |
|
| ロードバランサーを表示します。 |
2.5. OVN-Kubernetes サウスバウンドデータベースの内容の一覧表示 リンクのコピーリンクがクリップボードにコピーされました!
各ノードは、そのノード上の ovnkube-node Pod で実行されている ovnkube-controller コンテナーによって制御されます。OVN 論理ネットワークエンティティーを理解するには、そのノード上の ovnkube-node Pod 内でコンテナーとして実行されているノースバウンドデータベースを調べて、表示するノード内にどのようなオブジェクトがあるかを確認する必要があります。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
クラスター内で ovn nbctl または sbctl コマンドを実行するには、関連するノード上の nbdb または sbdb コンテナーにリモートシェルを開く必要があります。
次のコマンドを実行して、Pod を一覧表示します。
$ oc get po -n openshift-ovn-kubernetes出力例
NAME READY STATUS RESTARTS AGE ovnkube-control-plane-8444dff7f9-4lh9k 2/2 Running 0 27m ovnkube-control-plane-8444dff7f9-5rjh9 2/2 Running 0 27m ovnkube-node-55xs2 8/8 Running 0 26m ovnkube-node-7r84r 8/8 Running 0 16m ovnkube-node-bqq8p 8/8 Running 0 17m ovnkube-node-mkj4f 8/8 Running 0 26m ovnkube-node-mlr8k 8/8 Running 0 26m ovnkube-node-wqn2m 8/8 Running 0 16mオプション: Pod とノード情報をリストするには、次のコマンドを実行します。
$ oc get pods -n openshift-ovn-kubernetes -owide出力例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ovnkube-control-plane-8444dff7f9-4lh9k 2/2 Running 0 27m 10.0.0.3 ci-ln-t487nnb-72292-mdcnq-master-1 <none> <none> ovnkube-control-plane-8444dff7f9-5rjh9 2/2 Running 0 27m 10.0.0.4 ci-ln-t487nnb-72292-mdcnq-master-2 <none> <none> ovnkube-node-55xs2 8/8 Running 0 26m 10.0.0.4 ci-ln-t487nnb-72292-mdcnq-master-2 <none> <none> ovnkube-node-7r84r 8/8 Running 0 17m 10.0.128.3 ci-ln-t487nnb-72292-mdcnq-worker-b-wbz7z <none> <none> ovnkube-node-bqq8p 8/8 Running 0 17m 10.0.128.2 ci-ln-t487nnb-72292-mdcnq-worker-a-lh7ms <none> <none> ovnkube-node-mkj4f 8/8 Running 0 27m 10.0.0.5 ci-ln-t487nnb-72292-mdcnq-master-0 <none> <none> ovnkube-node-mlr8k 8/8 Running 0 27m 10.0.0.3 ci-ln-t487nnb-72292-mdcnq-master-1 <none> <none> ovnkube-node-wqn2m 8/8 Running 0 17m 10.0.128.4 ci-ln-t487nnb-72292-mdcnq-worker-c-przlm <none> <none>Pod に移動してサウスバウンドデータベースを確認します。
$ oc rsh -c sbdb -n openshift-ovn-kubernetes ovnkube-node-55xs2次のコマンドを実行して、サウスバウンドデータベース内のすべてのオブジェクトを表示します。
$ ovn-sbctl show出力例
Chassis "5db31703-35e9-413b-8cdf-69e7eecb41f7" hostname: ci-ln-9gp362t-72292-v2p94-worker-a-8bmwz Encap geneve ip: "10.0.128.4" options: {csum="true"} Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-worker-a-8bmwz Chassis "070debed-99b7-4bce-b17d-17e720b7f8bc" hostname: ci-ln-9gp362t-72292-v2p94-worker-b-svmp6 Encap geneve ip: "10.0.128.2" options: {csum="true"} Port_Binding k8s-ci-ln-9gp362t-72292-v2p94-worker-b-svmp6 Port_Binding rtoe-GR_ci-ln-9gp362t-72292-v2p94-worker-b-svmp6 Port_Binding openshift-monitoring_alertmanager-main-1 Port_Binding rtoj-GR_ci-ln-9gp362t-72292-v2p94-worker-b-svmp6 Port_Binding etor-GR_ci-ln-9gp362t-72292-v2p94-worker-b-svmp6 Port_Binding cr-rtos-ci-ln-9gp362t-72292-v2p94-worker-b-svmp6 Port_Binding openshift-e2e-loki_loki-promtail-qcrcz Port_Binding jtor-GR_ci-ln-9gp362t-72292-v2p94-worker-b-svmp6 Port_Binding openshift-multus_network-metrics-daemon-mkd4t Port_Binding openshift-ingress-canary_ingress-canary-xtvj4 Port_Binding openshift-ingress_router-default-6c76cbc498-pvlqk Port_Binding openshift-dns_dns-default-zz582 Port_Binding openshift-monitoring_thanos-querier-57585899f5-lbf4f Port_Binding openshift-network-diagnostics_network-check-target-tn228 Port_Binding openshift-monitoring_prometheus-k8s-0 Port_Binding openshift-image-registry_image-registry-68899bd877-xqxjj Chassis "179ba069-0af1-401c-b044-e5ba90f60fea" hostname: ci-ln-9gp362t-72292-v2p94-master-0 Encap geneve ip: "10.0.0.5" options: {csum="true"} Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-master-0 Chassis "68c954f2-5a76-47be-9e84-1cb13bd9dab9" hostname: ci-ln-9gp362t-72292-v2p94-worker-c-mjf9w Encap geneve ip: "10.0.128.3" options: {csum="true"} Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-worker-c-mjf9w Chassis "2de65d9e-9abf-4b6e-a51d-a1e038b4d8af" hostname: ci-ln-9gp362t-72292-v2p94-master-2 Encap geneve ip: "10.0.0.4" options: {csum="true"} Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-master-2 Chassis "1d371cb8-5e21-44fd-9025-c4b162cc4247" hostname: ci-ln-9gp362t-72292-v2p94-master-1 Encap geneve ip: "10.0.0.3" options: {csum="true"} Port_Binding tstor-ci-ln-9gp362t-72292-v2p94-master-1この詳細な出力は、シャーシとシャーシに接続されているポート (この場合、すべてのルーターポートとホストネットワークのように動作するもの) を示しています。すべての Pod は、ソースネットワークアドレス変換 (SNAT) を使用して、より広いネットワークと通信します。Pod の IP アドレスは、Pod が実行されているノードの IP アドレスに変換され、ネットワークに送信されます。
シャーシ情報に加えて、サウスバウンドデータベースにはすべての論理フローがあります。これらの論理フローは各ノードで実行されている
ovn-controllerに送信されます。ovn-controllerは、論理フローをオープンフロールールに変換し、最終的にOpenvSwitchをプログラムして、Pod がオープンフロールールに従ってネットワークの外に出られるようにします。次のコマンドを実行して、コマンド
ovn-sbctlで使用可能なオプションを表示します。$ oc exec -n openshift-ovn-kubernetes -it ovnkube-node-55xs2 \ -c sbdb ovn-sbctl --help
2.6. サウスバウンドデータベースの内容を調べるための ovn-sbctl のコマンドライン引数 リンクのコピーリンクがクリップボードにコピーされました!
次の表に、サウスバウンドデータベースの内容を調べるために ovn-sbctl で使用できるコマンドライン引数を示します。
内容を表示する Pod でリモートシェルを開き、ovn-sbctl コマンドを実行します。
| 引数 | 説明 |
|---|---|
|
| 特定のノードから見たサウスバウンドデータベースの内容の概要。 |
|
| 指定されたポートのサウスバウンドデータベースの内容を一覧表示します。 |
|
| 論理フローを一覧表示します。 |
2.7. OVN-Kubernetes の論理アーキテクチャー リンクのコピーリンクがクリップボードにコピーされました!
OVN はネットワーク仮想化ソリューションです。OVN は論理スイッチとルーターを作成します。これらのスイッチとルーターは相互接続され、任意のネットワークトポロジーを作成します。ログレベルを 2 または 5 に設定して ovnkube-trace を実行すると、OVN-Kubernetes 論理コンポーネントが公開されます。以下の図は、ルーターとスイッチが OpenShift Container Platform でどのように接続されているかを示しています。
図2.2 OVN-Kubernetes のルーターおよびスイッチコンポーネント
パケット処理に関係する主要なコンポーネントは次のとおりです。
- ゲートウェイルーター
-
L3 ゲートウェイルーターとも呼ばれるゲートウェイルーターは、通常、分散ルーターと物理ネットワークの間で使用されます。論理パッチポートを含むゲートウェイルーターは、(分散されていない) 物理的な場所またはシャーシにバインドされます。このルーターのパッチポートは、ovn-southbound データベース (
ovn-sbdb) では l3gateway ポートと呼ばれます。 - 分散論理ルーター
- 分散論理ルーターと、仮想マシンとコンテナーが接続されるその背後にある論理スイッチは、事実上、各ハイパーバイザーに常駐します。
- 結合ローカルスイッチ
- 結合ローカルスイッチは、分散ルーターとゲートウェイルーターを接続するために使用されます。これにより、分散ルーターで必要な IP アドレスの数が減ります。
- パッチポートを備えた論理スイッチ
- パッチポートを備えた論理スイッチは、ネットワークスタックを仮想化するために使用されます。これらは、トンネルを介してリモート論理ポートを接続します。
- localnet ポートを備えた論理スイッチ
- localnet ポートを備えた論理スイッチは、OVN を物理ネットワークに接続するために使用されます。これらは、localnet ポートを使用して直接接続された物理 L2 セグメントにパケットをブリッジすることにより、リモート論理ポートを接続します。
- パッチポート
- パッチポートは、論理スイッチと論理ルーターの間、およびピア論理ルーター間の接続を表します。1 つの接続には、このような接続ポイントごとに、両側に 1 つずつ、1 組のパッチポートがあります。
- l3gateway ポート
-
l3gateway ポートは、ゲートウェイルーターで使用される論理パッチポートの
ovn-sbdb内のポートバインディングエントリーです。これらのポートは、ゲートウェイルーター本体と同様にシャーシにバインドされているという事実を表すために、パッチポートではなく l3gateway ポートと呼ばれます。 - localnet ポート
-
localnet ポートは、各
ovn-controllerインスタンスからローカルにアクセス可能なネットワークへの接続を可能にするブリッジ論理スイッチに存在します。これは、論理スイッチから物理ネットワークへの直接接続をモデル化するのに役立ちます。論理スイッチに接続できる localnet ポートは 1 つだけです。
2.7.1. ローカルホストへの network-tools のインストール リンクのコピーリンクがクリップボードにコピーされました!
ローカルホストに network-tools をインストールして、OpenShift Container Platform クラスターネットワークの問題をデバッグするための一連のツールを使用できるようにします。
手順
次のコマンドを使用して、
network-toolsリポジトリーのクローンをワークステーションに作成します。$ git clone git@github.com:openshift/network-tools.gitクローン作成したリポジトリーのディレクトリーに移動します。
$ cd network-toolsオプション: 使用可能なすべてのコマンドをリストします。
$ ./debug-scripts/network-tools -h
2.7.2. network-tools の実行 リンクのコピーリンクがクリップボードにコピーされました!
network-tools を実行して、論理スイッチとルーターに関する情報を取得します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 -
ローカルホストに
network-toolsがインストールされている。
手順
次のコマンドを実行して、ルーターを一覧表示します。
$ ./debug-scripts/network-tools ovn-db-run-command ovn-nbctl lr-list出力例
944a7b53-7948-4ad2-a494-82b55eeccf87 (GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99) 84bd4a4c-4b0b-4a47-b0cf-a2c32709fc53 (ovn_cluster_router)次のコマンドを実行して、localnet ポートを一覧表示します。
$ ./debug-scripts/network-tools ovn-db-run-command \ ovn-sbctl find Port_Binding type=localnet出力例
_uuid : d05298f5-805b-4838-9224-1211afc2f199 additional_chassis : [] additional_encap : [] chassis : [] datapath : f3c2c959-743b-4037-854d-26627902597c encap : [] external_ids : {} gateway_chassis : [] ha_chassis_group : [] logical_port : br-ex_ci-ln-54932yb-72292-kd676-worker-c-rzj99 mac : [unknown] mirror_rules : [] nat_addresses : [] options : {network_name=physnet} parent_port : [] port_security : [] requested_additional_chassis: [] requested_chassis : [] tag : [] tunnel_key : 2 type : localnet up : false virtual_parent : [] [...]次のコマンドを実行して、
l3gatewayポートを一覧表示します。$ ./debug-scripts/network-tools ovn-db-run-command \ ovn-sbctl find Port_Binding type=l3gateway出力例
_uuid : 5207a1f3-1cf3-42f1-83e9-387bbb06b03c additional_chassis : [] additional_encap : [] chassis : ca6eb600-3a10-4372-a83e-e0d957c4cd92 datapath : f3c2c959-743b-4037-854d-26627902597c encap : [] external_ids : {} gateway_chassis : [] ha_chassis_group : [] logical_port : etor-GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99 mac : ["42:01:0a:00:80:04"] mirror_rules : [] nat_addresses : ["42:01:0a:00:80:04 10.0.128.4"] options : {l3gateway-chassis="84737c36-b383-4c83-92c5-2bd5b3c7e772", peer=rtoe-GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99} parent_port : [] port_security : [] requested_additional_chassis: [] requested_chassis : [] tag : [] tunnel_key : 1 type : l3gateway up : true virtual_parent : [] _uuid : 6088d647-84f2-43f2-b53f-c9d379042679 additional_chassis : [] additional_encap : [] chassis : ca6eb600-3a10-4372-a83e-e0d957c4cd92 datapath : dc9cea00-d94a-41b8-bdb0-89d42d13aa2e encap : [] external_ids : {} gateway_chassis : [] ha_chassis_group : [] logical_port : jtor-GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99 mac : [router] mirror_rules : [] nat_addresses : [] options : {l3gateway-chassis="84737c36-b383-4c83-92c5-2bd5b3c7e772", peer=rtoj-GR_ci-ln-54932yb-72292-kd676-worker-c-rzj99} parent_port : [] port_security : [] requested_additional_chassis: [] requested_chassis : [] tag : [] tunnel_key : 2 type : l3gateway up : true virtual_parent : [] [...]次のコマンドを実行して、パッチポートを一覧表示します。
$ ./debug-scripts/network-tools ovn-db-run-command \ ovn-sbctl find Port_Binding type=patch出力例
_uuid : 785fb8b6-ee5a-4792-a415-5b1cb855dac2 additional_chassis : [] additional_encap : [] chassis : [] datapath : f1ddd1cc-dc0d-43b4-90ca-12651305acec encap : [] external_ids : {} gateway_chassis : [] ha_chassis_group : [] logical_port : stor-ci-ln-54932yb-72292-kd676-worker-c-rzj99 mac : [router] mirror_rules : [] nat_addresses : ["0a:58:0a:80:02:01 10.128.2.1 is_chassis_resident(\"cr-rtos-ci-ln-54932yb-72292-kd676-worker-c-rzj99\")"] options : {peer=rtos-ci-ln-54932yb-72292-kd676-worker-c-rzj99} parent_port : [] port_security : [] requested_additional_chassis: [] requested_chassis : [] tag : [] tunnel_key : 1 type : patch up : false virtual_parent : [] _uuid : c01ff587-21a5-40b4-8244-4cd0425e5d9a additional_chassis : [] additional_encap : [] chassis : [] datapath : f6795586-bf92-4f84-9222-efe4ac6a7734 encap : [] external_ids : {} gateway_chassis : [] ha_chassis_group : [] logical_port : rtoj-ovn_cluster_router mac : ["0a:58:64:40:00:01 100.64.0.1/16"] mirror_rules : [] nat_addresses : [] options : {peer=jtor-ovn_cluster_router} parent_port : [] port_security : [] requested_additional_chassis: [] requested_chassis : [] tag : [] tunnel_key : 1 type : patch up : false virtual_parent : [] [...]
第3章 OVN-Kubernetes のトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
OVN-Kubernetes には、組み込みのヘルスチェックとログのソースが多数あります。以下のセクションの手順に従ってクラスターを調査してください。サポートケースが必要な場合は、サポートガイド に従って、must-gather を使用して追加情報を収集してください。-- gather_network_logs は、サポートから指示された場合にのみ使用してください。
3.1. readiness プローブを使用した OVN-Kubernetes の正常性の監視 リンクのコピーリンクがクリップボードにコピーされました!
ovnkube-control-plane および ovnkube-node Pod には、readiness プローブが設定されたコンテナーがあります。
前提条件
-
OpenShift CLI (
oc) へのアクセスがある。 -
cluster-admin権限でクラスターにアクセスできる。 -
jqがインストールされている。
手順
次のコマンドを実行して、
ovnkube-nodereadiness プローブの詳細を確認します。$ oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node \ -o json | jq '.items[0].spec.containers[] | .name,.readinessProbe'ovnkube-nodePod 内のノースバウンドおよびサウスバウンドのデータベースコンテナーの Readiness プローブは、データベースとovnkube-controllerコンテナーの正常性をチェックします。ovnkube-nodePod のovnkube-controllerコンテナーには、OVN-Kubernetes CNI 設定ファイルの存在を確認するための readiness プローブがあります。この設定ファイルがない場合、Pod が実行中でないか、Pod を設定するリクエストを受け入れる準備ができていません。次のコマンドを使用して、プローブの失敗を含む namespace のすべてのイベントを表示します。
$ oc get events -n openshift-ovn-kubernetes特定の Pod のみのイベントを表示します。
$ oc describe pod ovnkube-node-9lqfk -n openshift-ovn-kubernetesクラスターネットワーク Operator からのメッセージとステータスを表示します。
$ oc get co/network -o json | jq '.status.conditions[]'次のスクリプトを実行して、
ovnkube-nodePod 内の各コンテナーのreadyステータスを表示します。$ for p in $(oc get pods --selector app=ovnkube-node -n openshift-ovn-kubernetes \ -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); do echo === $p ===; \ oc get pods -n openshift-ovn-kubernetes $p -o json | jq '.status.containerStatuses[] | .name, .ready'; \ done注記すべてのコンテナーのステータスが
trueとして報告されることが期待されます。readiness プローブが失敗すると、ステータスがfalseに設定されます。
3.2. コンソールでの OVN-Kubernetes アラートの表示 リンクのコピーリンクがクリップボードにコピーされました!
アラート UI は、アラートおよびそれらを規定するアラートルールおよびサイレンスに関する詳細情報を提供します。
前提条件
- 開発者として、またはメトリクスで表示しているプロジェクトの表示権限を持つユーザーとしてクラスターへのアクセスがある。
手順 (UI)
- Administrator パースペクティブで、Observe → Alerting を選択します。このパースペクティブのアラート UI の主なページには、Alerts、Silences、および Alerting Rules という 3 つのページがあります。
- Observe → Alerting → Alerting Rules を選択して、OVN-Kubernetes アラートのルールを表示します。
3.3. CLI での OVN-Kubernetes アラートの表示 リンクのコピーリンクがクリップボードにコピーされました!
コマンドラインから、アラートとその管理アラートルールおよびサイレンスに関する情報を取得できます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。 -
jqがインストールされている。
手順
次のコマンドを実行して、アクティブまたは発生中のアラートを表示します。
次のコマンドを実行して、アラートマネージャーのルート環境変数を設定します。
$ ALERT_MANAGER=$(oc get route alertmanager-main -n openshift-monitoring \ -o jsonpath='{@.spec.host}')以下のコマンドを実行してアラートマネージャールート API に
curlリクエストを実行します。$ALERT_MANAGERは、Alertmanagerインスタンスの URL に置き換えます。$ curl -s -k -H "Authorization: Bearer $(oc create token prometheus-k8s -n openshift-monitoring)" https://$ALERT_MANAGER/api/v1/alerts | jq '.data[] | "\(.labels.severity) \(.labels.alertname) \(.labels.pod) \(.labels.container) \(.labels.endpoint) \(.labels.instance)"'
次のコマンドを実行して、アラートルールを表示します。
$ oc -n openshift-monitoring exec -c prometheus prometheus-k8s-0 -- curl -s 'http://localhost:9090/api/v1/rules' | jq '.data.groups[].rules[] | select(((.name|contains("ovn")) or (.name|contains("OVN")) or (.name|contains("Ovn")) or (.name|contains("North")) or (.name|contains("South"))) and .type=="alerting")'
3.4. CLI を使用した OVN-Kubernetes ログの表示 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift CLI (oc) を使用して、ovnkube-master および ovnkube-node Pod 内の各 Pod のログを表示できます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) へのアクセスがある。 -
jqがインストールされている。
手順
特定の Pod のログを表示します。
$ oc logs -f <pod_name> -c <container_name> -n <namespace>ここでは、以下のようになります。
-f- オプション: ログに書き込まれている内容に沿って出力することを指定します。
<pod_name>- Pod の名前を指定します。
<container_name>- オプション: コンテナーの名前を指定します。Pod に複数のコンテナーがある場合、コンテナー名を指定する必要があります。
<namespace>- Pod が実行されている namespace を指定します。
以下に例を示します。
$ oc logs ovnkube-node-5dx44 -n openshift-ovn-kubernetes$ oc logs -f ovnkube-node-5dx44 -c ovnkube-controller -n openshift-ovn-kubernetesログファイルの内容が出力されます。
ovnkube-nodePod 内のすべてのコンテナーの最新のエントリーを調べます。$ for p in $(oc get pods --selector app=ovnkube-node -n openshift-ovn-kubernetes \ -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); \ do echo === $p ===; for container in $(oc get pods -n openshift-ovn-kubernetes $p \ -o json | jq -r '.status.containerStatuses[] | .name');do echo ---$container---; \ oc logs -c $container $p -n openshift-ovn-kubernetes --tail=5; done; done次のコマンドを使用して、
ovnkube-nodePod 内のすべてのコンテナーのすべてのログの最後の 5 行を表示します。$ oc logs -l app=ovnkube-node -n openshift-ovn-kubernetes --all-containers --tail 5
3.5. Web コンソールを使用した OVN-Kubernetes ログの表示 リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールで、ovnkube-master Pod と ovnkube-node Pod の各 Pod のログを表示できます。
前提条件
-
OpenShift CLI (
oc) へのアクセスがある。
手順
- OpenShift Container Platform コンソールで Workloads → Pods に移動するか、調査するリソースから Pod に移動します。
-
ドロップダウンメニューから
openshift-ovn-kubernetesプロジェクトを選択します。 - 調査する Pod の名前をクリックします。
-
Logs をクリックします。
ovnkube-masterのデフォルトでは、northdコンテナーに関連付けられたログが表示されます。 - ドロップダウンメニューを使用して、各コンテナーのログを順番に選択します。
3.5.1. OVN-Kubernetes のログレベルの変更 リンクのコピーリンクがクリップボードにコピーされました!
OVN-Kubernetes のデフォルトのログレベルは 4 です。OVN-Kubernetes をデバッグするには、ログレベルを 5 に設定します。次の手順に従って OVN-Kubernetes のログレベルを上げることで、問題のデバッグに役立てることができます。
前提条件
-
cluster-admin権限でクラスターにアクセスできる。 - OpenShift Container Platform Web コンソールにアクセスできる。
手順
次のコマンドを実行して、OVN-Kubernetes プロジェクト内のすべての Pod の詳細情報を取得します。
$ oc get po -o wide -n openshift-ovn-kubernetes出力例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ovnkube-control-plane-65497d4548-9ptdr 2/2 Running 2 (128m ago) 147m 10.0.0.3 ci-ln-3njdr9b-72292-5nwkp-master-0 <none> <none> ovnkube-control-plane-65497d4548-j6zfk 2/2 Running 0 147m 10.0.0.5 ci-ln-3njdr9b-72292-5nwkp-master-2 <none> <none> ovnkube-node-5dx44 8/8 Running 0 146m 10.0.0.3 ci-ln-3njdr9b-72292-5nwkp-master-0 <none> <none> ovnkube-node-dpfn4 8/8 Running 0 146m 10.0.0.4 ci-ln-3njdr9b-72292-5nwkp-master-1 <none> <none> ovnkube-node-kwc9l 8/8 Running 0 134m 10.0.128.2 ci-ln-3njdr9b-72292-5nwkp-worker-a-2fjcj <none> <none> ovnkube-node-mcrhl 8/8 Running 0 134m 10.0.128.4 ci-ln-3njdr9b-72292-5nwkp-worker-c-v9x5v <none> <none> ovnkube-node-nsct4 8/8 Running 0 146m 10.0.0.5 ci-ln-3njdr9b-72292-5nwkp-master-2 <none> <none> ovnkube-node-zrj9f 8/8 Running 0 134m 10.0.128.3 ci-ln-3njdr9b-72292-5nwkp-worker-b-v78h7 <none> <none>次の例のような
ConfigMapファイルを作成し、env-overrides.yamlなどのファイル名を使用します。ConfigMapファイルの例kind: ConfigMap apiVersion: v1 metadata: name: env-overrides namespace: openshift-ovn-kubernetes data: ci-ln-3njdr9b-72292-5nwkp-master-0: |1 # This sets the log level for the ovn-kubernetes node process: OVN_KUBE_LOG_LEVEL=5 # You might also/instead want to enable debug logging for ovn-controller: OVN_LOG_LEVEL=dbg ci-ln-3njdr9b-72292-5nwkp-master-2: | # This sets the log level for the ovn-kubernetes node process: OVN_KUBE_LOG_LEVEL=5 # You might also/instead want to enable debug logging for ovn-controller: OVN_LOG_LEVEL=dbg _master: |2 # This sets the log level for the ovn-kubernetes master process as well as the ovn-dbchecker: OVN_KUBE_LOG_LEVEL=5 # You might also/instead want to enable debug logging for northd, nbdb and sbdb on all masters: OVN_LOG_LEVEL=dbg次のコマンドを使用して、
ConfigMapファイルを適用します。$ oc apply -n openshift-ovn-kubernetes -f env-overrides.yaml出力例
configmap/env-overrides.yaml created次のコマンドを使用して
ovnkubePod を再起動し、新しいログレベルを適用します。$ oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-0 -l app=ovnkube-node$ oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-2 -l app=ovnkube-node$ oc delete pod -n openshift-ovn-kubernetes -l app=ovnkube-nodeConfigMap ファイルが特定の Pod のすべてのノードに適用されていることを確認するには、次のコマンドを実行します。
$ oc logs -n openshift-ovn-kubernetes --all-containers --prefix ovnkube-node-<xxxx> | grep -E -m 10 '(Logging config:|vconsole|DBG)'ここでは、以下のようになります。
<XXXX>前の手順の Pod の文字のランダムなシーケンスを指定します。
出力例
[pod/ovnkube-node-2cpjc/sbdb] + exec /usr/share/ovn/scripts/ovn-ctl --no-monitor '--ovn-sb-log=-vconsole:info -vfile:off -vPATTERN:console:%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m' run_sb_ovsdb [pod/ovnkube-node-2cpjc/ovnkube-controller] I1012 14:39:59.984506 35767 config.go:2247] Logging config: {File: CNIFile:/var/log/ovn-kubernetes/ovn-k8s-cni-overlay.log LibovsdbFile:/var/log/ovnkube/libovsdb.log Level:5 LogFileMaxSize:100 LogFileMaxBackups:5 LogFileMaxAge:0 ACLLoggingRateLimit:20} [pod/ovnkube-node-2cpjc/northd] + exec ovn-northd --no-chdir -vconsole:info -vfile:off '-vPATTERN:console:%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m' --pidfile /var/run/ovn/ovn-northd.pid --n-threads=1 [pod/ovnkube-node-2cpjc/nbdb] + exec /usr/share/ovn/scripts/ovn-ctl --no-monitor '--ovn-nb-log=-vconsole:info -vfile:off -vPATTERN:console:%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m' run_nb_ovsdb [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.552Z|00002|hmap|DBG|lib/shash.c:114: 1 bucket with 6+ nodes, including 1 bucket with 6 nodes (32 nodes total across 32 buckets) [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00003|hmap|DBG|lib/shash.c:114: 1 bucket with 6+ nodes, including 1 bucket with 6 nodes (64 nodes total across 64 buckets) [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00004|hmap|DBG|lib/shash.c:114: 1 bucket with 6+ nodes, including 1 bucket with 7 nodes (32 nodes total across 32 buckets) [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00005|reconnect|DBG|unix:/var/run/openvswitch/db.sock: entering BACKOFF [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00007|reconnect|DBG|unix:/var/run/openvswitch/db.sock: entering CONNECTING [pod/ovnkube-node-2cpjc/ovn-controller] 2023-10-12T14:39:54.553Z|00008|ovsdb_cs|DBG|unix:/var/run/openvswitch/db.sock: SERVER_SCHEMA_REQUESTED -> SERVER_SCHEMA_REQUESTED at lib/ovsdb-cs.c:423
オプション: 次のコマンドを実行して、
ConfigMapファイルが適用されていることを確認します。for f in $(oc -n openshift-ovn-kubernetes get po -l 'app=ovnkube-node' --no-headers -o custom-columns=N:.metadata.name) ; do echo "---- $f ----" ; oc -n openshift-ovn-kubernetes exec -c ovnkube-controller $f -- pgrep -a -f init-ovnkube-controller | grep -P -o '^.*loglevel\s+\d' ; done出力例
---- ovnkube-node-2dt57 ---- 60981 /usr/bin/ovnkube --init-ovnkube-controller xpst8-worker-c-vmh5n.c.openshift-qe.internal --init-node xpst8-worker-c-vmh5n.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4 ---- ovnkube-node-4zznh ---- 178034 /usr/bin/ovnkube --init-ovnkube-controller xpst8-master-2.c.openshift-qe.internal --init-node xpst8-master-2.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4 ---- ovnkube-node-548sx ---- 77499 /usr/bin/ovnkube --init-ovnkube-controller xpst8-worker-a-fjtnb.c.openshift-qe.internal --init-node xpst8-worker-a-fjtnb.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4 ---- ovnkube-node-6btrf ---- 73781 /usr/bin/ovnkube --init-ovnkube-controller xpst8-worker-b-p8rww.c.openshift-qe.internal --init-node xpst8-worker-b-p8rww.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4 ---- ovnkube-node-fkc9r ---- 130707 /usr/bin/ovnkube --init-ovnkube-controller xpst8-master-0.c.openshift-qe.internal --init-node xpst8-master-0.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 5 ---- ovnkube-node-tk9l4 ---- 181328 /usr/bin/ovnkube --init-ovnkube-controller xpst8-master-1.c.openshift-qe.internal --init-node xpst8-master-1.c.openshift-qe.internal --config-file=/run/ovnkube-config/ovnkube.conf --ovn-empty-lb-events --loglevel 4
3.6. OVN-Kubernetes Pod ネットワーク接続のチェック リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 4.10 以降の接続チェックコントローラーは、クラスター内の接続検証チェックをオーケストレーションします。これには、Kubernetes API、OpenShift API、および個々のノードが含まれます。接続テストの結果は、openshift-network-diagnostics namespace の PodNetworkConnectivity オブジェクトに保存されます。接続テストは、1 分ごとに並行して実行されます。
前提条件
-
OpenShift CLI (
oc) へのアクセスがある。 -
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
jqがインストールされている。
手順
現在の
PodNetworkConnectivityCheckオブジェクトをリスト表示するには、以下のコマンドを入力します。$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics次のコマンドを使用して、各接続オブジェクトの最新の成功を表示します。
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.successes[0]'次のコマンドを使用して、各接続オブジェクトの最新のエラーを表示します。
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.failures[0]'次のコマンドを使用して、各接続オブジェクトの最新の停止を表示します。
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.outages[0]'接続チェックコントローラーは、これらのチェックからのメトリクスも Prometheus に記録します。
次のコマンドを実行して、すべてのメトリクスを表示します。
$ oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'過去 5 分間のソース Pod と openshift api サービス間のレイテンシーを表示します。
$ oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'
3.7. CLI を使用して OVS サンプリングで OVN-Kubernetes ネットワークトラフィックを確認する リンクのコピーリンクがクリップボードにコピーされました!
OVS サンプリングによる OVN-Kubernetes ネットワークトラフィックのチェックは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、以下のリンクを参照してください。
OVN-Kubernetes ネットワークトラフィックは、CLI を介した次のネットワーク API の OVS サンプリングで表示できます。
-
NetworkPolicy -
AdminNetworkPolicy -
BaselineNetworkPolicy -
UserDefinedNetwork分離 -
EgressFirewall - マルチキャスト ACL。
これらのネットワークイベントのスクリプトは、各 OVN-Kubernetes ノードの /usr/bin/ovnkube-observ パスにあります。
Network Observability Operator と OVS サンプリングによる OVN-Kubernetes ネットワークトラフィックのチェックは、どちらもデバッグに適していますが、Network Observability Operator はネットワークイベントの監視を目的としています。または、CLI を使用して OVS サンプリングで OVN-Kubernetes ネットワークトラフィックをチェックすると、パケットトレースに役立ちます。Network Observability Operator がインストールされている場合にも使用できますが、必須ではありません。
管理者は、--add-ovs-collect オプションを追加してノード全体のネットワークトラフィックを表示したり、追加のフラグを渡して特定の Pod の結果をフィルタリングしたりできます。追加のフラグは、「OVS サンプリングフラグを使用した OVN-Kubernetes ネットワークトラフィック」セクションを参照してください。
CLI を使用して OVN-Kubernetes ネットワークトラフィックを表示するには、次の手順に従います。
前提条件
-
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - ソース Pod と宛先 Pod を作成し、それらの間でトラフィックを実行した。
-
NetworkPolicy、AdminNetworkPolicy、BaselineNetworkPolicy、UserDefinedNetworkの分離、マルチキャスト、または Egress ファイアウォールのいずれかのネットワーク API を 1 つ以上作成した。
手順
OVS サンプリング機能を使用して
OVNObservabilityを有効にするには、次のコマンドを入力して、clusterという名前のFeatureGateCR でTechPreviewNoUpgrade機能セットを有効にします。$ oc patch --type=merge --patch '{"spec": {"featureSet": "TechPreviewNoUpgrade"}}' featuregate/cluster出力例
featuregate.config.openshift.io/cluster patched次のコマンドを入力して、
OVNObservability機能が有効になっていることを確認します。$ oc get featuregate cluster -o yaml出力例
featureGates: # ... enabled: - name: OVNObservability次のコマンドを入力して、関連するネットワーク API の 1 つを作成した namespace 内の Pod のリストを取得します。次の手順で使用するために、Pod の
NODE名をメモします。$ oc get pods -n <namespace> -o wide出力例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES destination-pod 1/1 Running 0 53s 10.131.0.23 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none> source-pod 1/1 Running 0 56s 10.131.0.22 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none>次のコマンドを入力して、OVN-Kubernetes Pod のリストを取得し、前の手順の Pod と同じ
NODEを共有する Pod を見つけます。$ oc get pods -n openshift-ovn-kubernetes -o wide出力例
NAME ... READY STATUS RESTARTS AGE IP NODE NOMINATED NODE ovnkube-node-jzn5b 8/8 Running 1 (34m ago) 37m 10.0.128.2 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> ...次のコマンドを入力して、
ovnkube-nodePod 内で bash シェルを開きます。$ oc exec -it <pod_name> -n openshift-ovn-kubernetes -- bashovnkube-nodePod 内では、ovnkube-observ -add-ovs-collectorスクリプトを実行し、OVS コレクターを使用してネットワークイベントを表示できます。以下に例を示します。# /usr/bin/ovnkube-observ -add-ovs-collector出力例
... 2024/12/02 19:41:41.327584 OVN-K message: Allowed by default allow from local node policy, direction ingress 2024/12/02 19:41:41.327593 src=10.131.0.2, dst=10.131.0.6 2024/12/02 19:41:41.327692 OVN-K message: Allowed by default allow from local node policy, direction ingress 2024/12/02 19:41:41.327715 src=10.131.0.6, dst=10.131.0.2 ...-filter-src-ipフラグと Pod の IP アドレスを指定して次のコマンドを入力すると、ソース Pod などのタイプ別にコンテンツをフィルタリングできます。以下に例を示します。# /usr/bin/ovnkube-observ -add-ovs-collector -filter-src-ip <pod_ip_address>出力例
... Found group packets, id 14 2024/12/10 16:27:12.456473 OVN-K message: Allowed by admin network policy allow-egress-group1, direction Egress 2024/12/10 16:27:12.456570 src=10.131.0.22, dst=10.131.0.23 2024/12/10 16:27:14.484421 OVN-K message: Allowed by admin network policy allow-egress-group1, direction Egress 2024/12/10 16:27:14.484428 src=10.131.0.22, dst=10.131.0.23 2024/12/10 16:27:12.457222 OVN-K message: Allowed by network policy test:allow-ingress-from-specific-pod, direction Ingress 2024/12/10 16:27:12.457228 src=10.131.0.22, dst=10.131.0.23 2024/12/10 16:27:12.457288 OVN-K message: Allowed by network policy test:allow-ingress-from-specific-pod, direction Ingress 2024/12/10 16:27:12.457299 src=10.131.0.22, dst=10.131.0.23 .../usr/bin/ovnkube-observで渡すことができるフラグの完全なリストは、「OVS サンプリングフラグを持つ OVN-Kubernetes ネットワークトラフィック」を参照してください。
3.7.1. OVS サンプリングフラグを持つ OVN-Kubernetes ネットワークトラフィック リンクのコピーリンクがクリップボードにコピーされました!
CLI を使用して OVN-Kubernetes ネットワークトラフィックを表示するには、次のフラグを使用できます。ovnkube-node Pod 内で bash シェルを開いた後、ターミナルで次の構文にこれらのフラグを追加します。
コマンド構文
# /usr/bin/ovnkube-observ <flag>
| フラグ | 説明 |
|---|---|
|
|
|
|
| サンプリングを有効にするために OVS コレクターを追加します。注意して使用してください。他のユーザーが可観測性を使用していないことを確認します。 |
|
|
NBDB データでサンプルを補完します。デフォルトは |
|
| 指定された宛先 IP へのパケットのみをフィルタリングします。 |
|
| 指定された送信元 IP からのパケットのみをフィルタリングします。 |
|
| psample group_id を使用して生のサンプル Cookie を出力します。 |
|
| サンプルの書き込み先となる出力ファイル。 |
|
| 受信したパケット全体を出力します。false の場合、すべてのサンプルで送信元 IP と宛先 IP のみが出力されます。 |
第4章 ovnkube-trace を使用した Openflow のトレース リンクのコピーリンクがクリップボードにコピーされました!
OVN と OVS のトラフィックフローは、ovnkube-trace という単一のユーティリティーでシミュレートできます。ovnkube-trace ユーティリティーは、ovn-trace、ovs-appctl ofproto/trace、および ovn-detrace を実行し、その情報を 1 つの出力に関連付けます。
専用コンテナーから ovnkube-trace バイナリーを実行できます。OpenShift Container Platform 4.7 以降のリリースでは、バイナリーをローカルホストにコピーして、そのホストから実行することもできます。
4.1. ローカルホストへの ovnkube-trace のインストール リンクのコピーリンクがクリップボードにコピーされました!
ovnkube-trace ツールは、OVN-Kubernetes で動作する OpenShift Container Platform クラスター内のポイント間における任意の UDP または TCP トラフィックのパケットシミュレーションをトレースします。ovnkube-trace バイナリーをローカルホストにコピーして、クラスターに対して実行できるようにします。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。
手順
次のコマンドを使用して Pod 変数を作成します。
$ POD=$(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-control-plane -o name | head -1 | awk -F '/' '{print $NF}')ローカルホストで次のコマンドを実行して、
ovnkube-control-planePod からバイナリーをコピーします。$ oc cp -n openshift-ovn-kubernetes $POD:/usr/bin/ovnkube-trace -c ovnkube-cluster-manager ovnkube-trace注記Red Hat Enterprise Linux (RHEL) 8 を使用して
ovnkube-traceツールを実行している場合は、/usr/lib/rhel8/ovnkube-traceファイルをローカルホストにコピーする必要があります。次のコマンドを実行して、
ovnkube-traceを実行可能にします。$ chmod +x ovnkube-trace次のコマンドを実行して、
ovnkube-traceで使用可能なオプションを表示します。$ ./ovnkube-trace -help予想される出力
Usage of ./ovnkube-trace: -addr-family string Address family (ip4 or ip6) to be used for tracing (default "ip4") -dst string dest: destination pod name -dst-ip string destination IP address (meant for tests to external targets) -dst-namespace string k8s namespace of dest pod (default "default") -dst-port string dst-port: destination port (default "80") -kubeconfig string absolute path to the kubeconfig file -loglevel string loglevel: klog level (default "0") -ovn-config-namespace string namespace used by ovn-config itself -service string service: destination service name -skip-detrace skip ovn-detrace command -src string src: source pod name -src-namespace string k8s namespace of source pod (default "default") -tcp use tcp transport protocol -udp use udp transport protocolサポートされているコマンドライン引数は、namespace、Pod、サービスなど、よく知られた Kubernetes コンストラクトであるため、MAC アドレス、宛先ノードの IP アドレス、または ICMP タイプを見つける必要はありません。
ログレベルは次のとおりです。
- 0 (最小出力)
- 2 (トレースコマンドの結果を示すより詳細な出力)
- 5 (デバッグ出力)
4.2. ovnkube-trace の実行 リンクのコピーリンクがクリップボードにコピーされました!
ovn-trace を実行して、OVN 論理ネットワーク内のパケット転送をシミュレートします。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 -
ローカルホストに
ovnkube-traceがインストールされている。
例: デプロイされた Pod からの DNS 解決が機能することをテストする
この例は、デプロイされた Pod からクラスターで実行されるコア DNS Pod への DNS 解決をテストする方法を示しています。
手順
次のコマンドを入力して、default namespace で Web サービスを開始します。
$ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80openshift-dnsnamespace で実行されている Pod を一覧表示します。oc get pods -n openshift-dns出力例
NAME READY STATUS RESTARTS AGE dns-default-8s42x 2/2 Running 0 5h8m dns-default-mdw6r 2/2 Running 0 4h58m dns-default-p8t5h 2/2 Running 0 4h58m dns-default-rl6nk 2/2 Running 0 5h8m dns-default-xbgqx 2/2 Running 0 5h8m dns-default-zv8f6 2/2 Running 0 4h58m node-resolver-62jjb 1/1 Running 0 5h8m node-resolver-8z4cj 1/1 Running 0 4h59m node-resolver-bq244 1/1 Running 0 5h8m node-resolver-hc58n 1/1 Running 0 4h59m node-resolver-lm6z4 1/1 Running 0 5h8m node-resolver-zfx5k 1/1 Running 0 5h次の
ovnkube-traceコマンドを実行して、DNS 解決が機能していることを確認します。$ ./ovnkube-trace \ -src-namespace default \1 -src web \2 -dst-namespace openshift-dns \3 -dst dns-default-p8t5h \4 -udp -dst-port 53 \5 -loglevel 06 src&dstPod が同じノードに配置された場合の出力例ovn-trace source pod to destination pod indicates success from web to dns-default-p8t5h ovn-trace destination pod to source pod indicates success from dns-default-p8t5h to web ovs-appctl ofproto/trace source pod to destination pod indicates success from web to dns-default-p8t5h ovs-appctl ofproto/trace destination pod to source pod indicates success from dns-default-p8t5h to web ovn-detrace source pod to destination pod indicates success from web to dns-default-p8t5h ovn-detrace destination pod to source pod indicates success from dns-default-p8t5h to websrc&dstPod が別のノードに配置された場合の出力例ovn-trace source pod to destination pod indicates success from web to dns-default-8s42x ovn-trace (remote) source pod to destination pod indicates success from web to dns-default-8s42x ovn-trace destination pod to source pod indicates success from dns-default-8s42x to web ovn-trace (remote) destination pod to source pod indicates success from dns-default-8s42x to web ovs-appctl ofproto/trace source pod to destination pod indicates success from web to dns-default-8s42x ovs-appctl ofproto/trace destination pod to source pod indicates success from dns-default-8s42x to web ovn-detrace source pod to destination pod indicates success from web to dns-default-8s42x ovn-detrace destination pod to source pod indicates success from dns-default-8s42x to webこの出力は、デプロイされた Pod から DNS ポートへの解決が成功し、その反対方向への解決も成功したことを示しています。つまり、Web Pod がコア DNS からの DNS 解決を行う場合に、UDP ポート 53 で双方向のトラフィックがサポートされていることがわかります。
たとえば、これが機能せず、ovn-trace を取得する必要がある場合は、proto/trace と ovn-detrace の ovs-appctl、およびデバッグのタイプ情報が、ログレベルを 2 に上げて、以下のようにコマンドを再度実行します。
$ ./ovnkube-trace \
-src-namespace default \
-src web \
-dst-namespace openshift-dns \
-dst dns-default-467qw \
-udp -dst-port 53 \
-loglevel 2
このログレベルの出力は多すぎるため、ここにはリストできません。障害状況では、このコマンドの出力は、どのフローがそのトラフィックを破棄しているかを示します。たとえば、Egress または Ingress ネットワークポリシーが、そのトラフィックを許可しないクラスターで設定されている場合などがあります。
例: デバッグ出力を使用して設定済みのデフォルトの拒否を確認する
この例は、デバッグ出力を使用して、デフォルトの Ingress 拒否ポリシーがトラフィックをブロックしていることを特定する方法を示しています。
手順
すべての namespace におけるすべての Pod からの Ingress を拒否する
deny-by-defaultポリシーを定義する次の YAML を作成します。YAML をdeny-by-default.yamlファイルに保存します。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default namespace: default spec: podSelector: {} ingress: []次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f deny-by-default.yaml出力例
networkpolicy.networking.k8s.io/deny-by-default created次のコマンドを入力して、
defaultnamespace で Web サービスを開始します。$ oc run web --namespace=default --image=quay.io/openshifttest/nginx --labels="app=web" --expose --port=80次のコマンドを実行して、
prodnamespace を作成します。$ oc create namespace prod次のコマンドを実行して、
prodnamespace にラベルを付けます。$ oc label namespace/prod purpose=production次のコマンドを実行して、
alpineイメージをprodnamespace にデプロイし、シェルを開始します。$ oc run test-6459 --namespace=prod --rm -i -t --image=alpine -- sh- 別のターミナルセッションを開きます。
この新しいターミナルセッションで
ovn-traceを実行して、namespaceprodで実行されているソース Podtest-6459とdefaultnamespace で実行されている宛先 Pod 間の通信の失敗を確認します。$ ./ovnkube-trace \ -src-namespace prod \ -src test-6459 \ -dst-namespace default \ -dst web \ -tcp -dst-port 80 \ -loglevel 0出力例
ovn-trace source pod to destination pod indicates failure from test-6459 to web次のコマンドを実行して、ログレベルを 2 に上げて、失敗の理由を明らかにします。
$ ./ovnkube-trace \ -src-namespace prod \ -src test-6459 \ -dst-namespace default \ -dst web \ -tcp -dst-port 80 \ -loglevel 2出力例
... ------------------------------------------------ 3. ls_out_acl_hint (northd.c:7454): !ct.new && ct.est && !ct.rpl && ct_mark.blocked == 0, priority 4, uuid 12efc456 reg0[8] = 1; reg0[10] = 1; next; 5. ls_out_acl_action (northd.c:7835): reg8[30..31] == 0, priority 500, uuid 69372c5d reg8[30..31] = 1; next(4); 5. ls_out_acl_action (northd.c:7835): reg8[30..31] == 1, priority 500, uuid 2fa0af89 reg8[30..31] = 2; next(4); 4. ls_out_acl_eval (northd.c:7691): reg8[30..31] == 2 && reg0[10] == 1 && (outport == @a16982411286042166782_ingressDefaultDeny), priority 2000, uuid 447d0dab reg8[17] = 1; ct_commit { ct_mark.blocked = 1; };1 next; ...- 1
- デフォルトの拒否ポリシーが設定されているため、Ingress トラフィックがブロックされています。
ラベルが
purpose=productionの特定の namespace 内にあるすべての Pod からのトラフィックを許可するポリシーを作成します。YAML をweb-allow-prod.yamlファイルに保存します。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-prod namespace: default spec: podSelector: matchLabels: app: web policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f web-allow-prod.yaml次のコマンドを入力して、
ovnkube-traceを実行し、トラフィックが許可されていることを確認します。$ ./ovnkube-trace \ -src-namespace prod \ -src test-6459 \ -dst-namespace default \ -dst web \ -tcp -dst-port 80 \ -loglevel 0予想される出力
ovn-trace source pod to destination pod indicates success from test-6459 to web ovn-trace destination pod to source pod indicates success from web to test-6459 ovs-appctl ofproto/trace source pod to destination pod indicates success from test-6459 to web ovs-appctl ofproto/trace destination pod to source pod indicates success from web to test-6459 ovn-detrace source pod to destination pod indicates success from test-6459 to web ovn-detrace destination pod to source pod indicates success from web to test-6459手順 6 で開いたシェルで次のコマンドを実行して、nginx を Web サーバーに接続します。
wget -qO- --timeout=2 http://web.default予想される出力
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
第5章 IPv4/IPv6 デュアルスタックネットワークへの変換 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、IPv4 および IPv6 アドレスファミリーをサポートするデュアルネットワーククラスターネットワークに、IPv4 の単一スタッククラスターを変換できます。デュアルスタックネットワークに変換すると、新しい Pod と既存の Pod でデュアルスタックネットワークが有効になります。
IPv6 を必要とするデュアルスタックネットワークを使用する場合、::FFFF:198.51.100.1 などの IPv4 にマッピングされた IPv6 アドレスは使用できません。
5.1. デュアルスタッククラスターネットワークへの変換 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、単一スタッククラスターネットワークをデュアルスタッククラスターネットワークに変換できます。
デュアルスタックネットワークを使用するようにクラスターを変換した後、Pod が IPv6 アドレスを受け取るように、既存の Pod を再作成する必要があります。IPv6 アドレスは、新しい Pod にのみ割り当てられるためです。
シングルスタッククラスターネットワークをデュアルスタッククラスターネットワークに変換するには、パッチを作成し、それをクラスターのネットワークとインフラストラクチャーに適用します。installer-provisioned infrastructure または user-provisioned infrastructure のいずれかで実行されるクラスターは、デュアルスタッククラスターネットワークに変換できます。
clusterNetwork、serviceNetwork、apiServerInternalIPs、および ingressIP オブジェクトを変更する各パッチ操作は、クラスターの再起動をトリガーします。MachineNetworks オブジェクトを変更しても、クラスターは再起動されません。
installer-provisioned infrastructure のみ、既存のデュアルスタック設定のクラスターに API および Ingress サービスの IPv6 仮想 IP (VIP) を追加する必要がある場合は、クラスターのネットワークではなく、インフラストラクチャーのみにパッチを適用する必要があります。
クラスターを OpenShift Container Platform 4.16 以降にすでにアップグレードしていて、シングルスタッククラスターネットワークをデュアルスタッククラスターネットワークに変換する必要がある場合は、YAML 設定パッチファイルで、API および Ingress サービスの install-config.yaml ファイルから既存の IPv4 machineNetwork ネットワーク設定を指定する必要があります。この設定により、IPv4 トラフィックがデフォルトゲートウェイと同じネットワークインターフェイスに存在させることができます。
machineNetwork ネットワーク用に IPv4 アドレスブロックが追加された YAML 設定ファイルの例
- op: add
path: /spec/platformSpec/baremetal/machineNetworks/-
value: 192.168.1.0/24
# ...
- 1
- マシンが動作する
machineNetworkネットワークのアドレスブロックを指定していることを確認してください。マシンネットワークの API および Ingress の両方の IP アドレスを選択する必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - クラスターは OVN-Kubernetes ネットワークプラグインを使用します。
- クラスターノードに IPv6 アドレスがある。
- インフラストラクチャーに基づいて IPv6 対応ルーターを設定している。
手順
クラスターおよびサービスネットワークの IPv6 アドレスブロックを指定するには、次の例のような設定を持つ YAML 設定パッチファイルを作成します。
- op: add path: /spec/clusterNetwork/- value:1 cidr: fd01::/48 hostPrefix: 64 - op: add path: /spec/serviceNetwork/- value: fd02::/1122 CLI で次のコマンドを入力して、クラスターネットワーク設定にパッチを適用します。
$ oc patch network.config.openshift.io cluster \1 --type='json' --patch-file <file>.yaml- 1
- ここで、
fileは作成した YAML ファイルの名前を指定します。
出力例
network.config.openshift.io/cluster patchedAPI および Ingress サービス用の IPv6 仮想 IP を追加した installer-provisioned infrastructure で、次の手順を実行します。
クラスターの API および Ingress サービスに IPv6 仮想 IP を指定します。次の例と同様の設定を含む YAML 設定パッチファイルを作成します。
- op: add path: /spec/platformSpec/baremetal/machineNetworks/-1 value: fd2e:6f44:5dd8::/64 - op: add path: /spec/platformSpec/baremetal/apiServerInternalIPs/-2 value: fd2e:6f44:5dd8::4 - op: add path: /spec/platformSpec/baremetal/ingressIPs/- value: fd2e:6f44:5dd8::5CLI で次のコマンドを入力してインフラストラクチャーにパッチを適用します。
$ oc patch infrastructure cluster \ --type='json' --patch-file <file>.yaml詳細は、以下のようになります。
- <file>
作成した YAML ファイルの名前を指定します。
出力例
infrastructure/cluster patched
検証
CLI で次のコマンドを入力して、クラスターネットワーク設定を表示します。
$ oc describe networkクラスターネットワーク設定が YAML ファイルで指定した IPv6 アドレスブロックを認識していることを確認し、ネットワーク設定へのパッチのインストールが正常に行われたことを確認します。
出力例
# ... Status: Cluster Network: Cidr: 10.128.0.0/14 Host Prefix: 23 Cidr: fd01::/48 Host Prefix: 64 Cluster Network MTU: 1400 Network Type: OVNKubernetes Service Network: 172.30.0.0/16 fd02::/112 # ...installer-provisioned infrastructure 上で実行されるクラスターに対して、次の追加タスクを完了します。
CLI で次のコマンドを入力して、クラスターインフラストラクチャー設定を表示します。
$ oc describe infrastructureYAML ファイルで指定した IPv6 アドレスブロックがインフラストラクチャーによって認識されるかどうかを確認して、クラスターインフラストラクチャーへのパッチのインストールが正常に行われたことを確認します。
出力例
# ... spec: # ... platformSpec: baremetal: apiServerInternalIPs: - 192.168.123.5 - fd2e:6f44:5dd8::4 ingressIPs: - 192.168.123.10 - fd2e:6f44:5dd8::5 status: # ... platformStatus: baremetal: apiServerInternalIP: 192.168.123.5 apiServerInternalIPs: - 192.168.123.5 - fd2e:6f44:5dd8::4 ingressIP: 192.168.123.10 ingressIPs: - 192.168.123.10 - fd2e:6f44:5dd8::5 # ...
5.2. 単一スタッククラスターネットワークへの変換 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、デュアルスタッククラスターネットワークを単一スタッククラスターネットワークに変換できます。
元々 IPv4 シングルスタッククラスターネットワークをデュアルスタッククラスターに変換していた場合は、IPv4 シングルスタッククラスターにのみ戻すことができます。IPv6 シングルスタッククラスターネットワークには戻すことができません。IPv6 シングルスタッククラスターネットワークに戻す場合も、同じ制限が適用されます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - クラスターは OVN-Kubernetes ネットワークプラグインを使用します。
- クラスターノードに IPv6 アドレスがある。
- デュアルスタックネットワークを有効にしている。
手順
以下のコマンドを実行して、
networks.config.openshift.ioカスタムリソース (CR) を編集します。$ oc edit networks.config.openshift.io-
「デュアルスタッククラスターネットワークへの変換」手順の実行時に
cidrおよびhostPrefixパラメーターに追加した IPv4 または IPv6 設定を削除します。
第6章 OVN-Kubernetes 内部 IP アドレスサブネットの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、OVN-Kubernetes ネットワークプラグインが結合および転送サブネットに使用する IP アドレス範囲を変更できます。
6.1. OVN-Kubernetes 参加サブネットの設定 リンクのコピーリンクがクリップボードにコピーされました!
環境内ですでに使用されている既存のサブネットとの競合を避けるために、OVN-Kubernetes で使用される参加サブネットを変更できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインする。 - クラスターが OVN-Kubernetes ネットワークプラグインを使用していることを確認します。
手順
OVN-Kubernetes 参加サブネットを変更するには、次のコマンドを入力します。
$ oc patch network.operator.openshift.io cluster --type='merge' \ -p='{"spec":{"defaultNetwork":{"ovnKubernetesConfig": {"ipv4":{"internalJoinSubnet": "<join_subnet>"}, "ipv6":{"internalJoinSubnet": "<join_subnet>"}}}}}'ここでは、以下のようになります。
<join_subnet>-
OVN-Kubernetes が内部で使用する IP アドレスサブネットを指定します。サブネットは、クラスター内のノード数よりも大きく、クラスター内のノードごとに 1 つの IP アドレスを収容できる大きさである必要があります。このサブネットは、OpenShift Container Platform またはホスト自体で使用される他のサブネットと重複することはできません。IPv4 のデフォルト値は
100.64.0.0/16で、IPv6 のデフォルト値はfd98::/64です。
出力例
network.operator.openshift.io/cluster patched
検証
設定がアクティブであることを確認するには、以下のコマンドを入力します。
$ oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.defaultNetwork}"このコマンド操作による変更が有効になるまでに最大 30 分かかる場合があります。
出力例
{ "ovnKubernetesConfig": { "ipv4": { "internalJoinSubnet": "100.64.1.0/16" }, }, "type": "OVNKubernetes" }
6.2. インストール後の操作として OVN-Kubernetes マスカレードサブネットを設定する リンクのコピーリンクがクリップボードにコピーされました!
環境内ですでに使用されている既存のサブネットとの競合を回避するために、インストール後の操作として、OVN-Kubernetes で使用されるマスカレードサブネットを変更できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。
手順
クラスターのマスカレードサブネットを変更します。
IPv6 を使用するデュアルスタッククラスターの場合は、次のコマンドを実行します。
$ oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipv4":{"internalMasqueradeSubnet": "<ipv4_masquerade_subnet>"},"ipv6":{"internalMasqueradeSubnet": "<ipv6_masquerade_subnet>"}}}}}}'ここでは、以下のようになります。
ipv4_masquerade_subnet-
IPv4 マスカレードサブネットとして使用する IP アドレスを指定します。この範囲は、OpenShift Container Platform またはホスト自体で使用される他のサブネットと重複できません。OpenShift Container Platform 4.17 より前のバージョンの場合、IPv4 のデフォルト値は
169.254.169.0/29で、バージョン 4.17 にアップグレードされたクラスターはこの値を維持します。バージョン 4.17 以降の新しいクラスターの場合、デフォルト値は169.254.0.0/17です。 ipv6_masquerade_subnet-
IPv6 マスカレードサブネットとして使用する IP アドレスを指定します。この範囲は、OpenShift Container Platform またはホスト自体で使用される他のサブネットと重複できません。IPv6 のデフォルト値は
fd69::/125です。
IPv4 を使用するクラスターの場合は、次のコマンドを実行します。
$ oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipv4":{"internalMasqueradeSubnet": "<ipv4_masquerade_subnet>"}}}}}}'ここでは、以下のようになります。
ipv4_masquerade_subnetでは、IPv4 マスカレードサブネットとして使用する IP アドレスを指定します。この範囲は、OpenShift Container Platform またはホスト自体で使用される他のサブネットと重複できません。OpenShift Container Platform 4.17 より前のバージョンの場合、IPv4 のデフォルト値は169.254.169.0/29で、バージョン 4.17 にアップグレードされたクラスターはこの値を維持します。バージョン 4.17 以降の新しいクラスターの場合、デフォルト値は169.254.0.0/17です。
6.3. OVN-Kubernetes 転送サブネットの設定 リンクのコピーリンクがクリップボードにコピーされました!
環境内ですでに使用されている既存のサブネットとの競合を避けるために、OVN-Kubernetes で使用されるトランジットサブネットを変更できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインする。 - クラスターが OVN-Kubernetes ネットワークプラグインを使用していることを確認します。
手順
OVN-Kubernetes 転送サブネットを変更するには、以下のコマンドを入力します。
$ oc patch network.operator.openshift.io cluster --type='merge' \ -p='{"spec":{"defaultNetwork":{"ovnKubernetesConfig": {"ipv4":{"internalTransitSwitchSubnet": "<transit_subnet>"}, "ipv6":{"internalTransitSwitchSubnet": "<transit_subnet>"}}}}}'ここでは、以下のようになります。
<transit_subnet>-
east-west トラフィックを有効にする分散トランジットスイッチの IP アドレスサブネットを指定します。このサブネットは、OVN-Kubernetes またはホスト自体で使用される他のサブネットと重複することはできません。IPv4 のデフォルト値は
100.88.0.0/16で、IPv6 のデフォルト値はfd97::/64です。
出力例
network.operator.openshift.io/cluster patched
検証
設定がアクティブであることを確認するには、以下のコマンドを入力します。
$ oc get network.operator.openshift.io \ -o jsonpath="{.items[0].spec.defaultNetwork}"この変更が有効になるまで、最大 30 分かかる場合があります。
出力例
{ "ovnKubernetesConfig": { "ipv4": { "internalTransitSwitchSubnet": "100.88.1.0/16" }, }, "type": "OVNKubernetes" }
第7章 ゲートウェイの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、gatewayConfig オブジェクトを設定して、外部トラフィックをクラスターからどのように送信するかを管理できます。これを行うには、routingViaHost パラメーターを次のいずれかの値に設定します。
-
trueは、Egress トラフィックが Pod をホストするノード上の特定のローカルゲートウェイを経由してルーティングされることを意味します。Egress トラフィックはホストを経由してルーティングされ、このトラフィックはホストのルーティングテーブルに適用されます。 -
falseは、Egress トラフィックが専用ノードを経由してルーティングされるが、ノードのグループが同じゲートウェイを共有することを意味します。Egress トラフィックは、ホストを経由してルーティングされません。Open vSwitch (OVS) はトラフィックをノード IP インターフェイスに直接出力します。
7.1. Egress ルーティングポリシーの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、Cluster Network Operator (CNO) の gatewayConfig 仕様を使用して、Egress ルーティングポリシーを設定できます。次の手順を使用して、routingViaHost フィールドを true または false に設定できます。
ノードのホストネットワークを OVN-Kubernetes に関連しないトラフィックのルーターとして機能させる必要がある場合は、手順のオプションのステップに従って、routingViaHost=true 設定とともに IP 転送を有効にできます。たとえば、ローカルゲートウェイと IP 転送を組み合わせた使用例としては、次のようなものが考えられます。
- すべての Pod Egress トラフィックをノードの IP 経由で転送するように設定する
- OVN-Kubernetes CNI と外部ネットワークアドレス変換 (NAT) デバイスを統合する
- カーネルルーティングテーブルを使用するように OVN-Kubernetes CNI を設定する
前提条件
- 管理者権限を持つユーザーとしてログインしている。
手順
次のコマンドを実行して、既存のネットワーク設定をバックアップします。
$ oc get network.operator cluster -o yaml > network-config-backup.yaml次のコマンドを入力して、
routingViaHostパラメーターをtrueに設定します。その後、Egress トラフィックは、ノードで設定されたルートに従って特定のゲートウェイを経由してルーティングされます。$ oc patch networks.operator.openshift.io cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"routingViaHost": true}}}}}'次のコマンドを実行して、
routingViaHost=true設定が正しく適用されていることを確認します。$ oc get networks.operator.openshift.io cluster -o yaml | grep -A 5 "gatewayConfig"出力例
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster # ... gatewayConfig: ipv4: {} ipv6: {} routingViaHost: true1 genevePort: 6081 ipsecConfig: # ...- 1
trueの値は、Egress トラフィックが Pod をホストするノード上の特定のローカルゲートウェイを経由してルーティングされることを意味します。パラメーターの値がfalseの場合、ノードのグループが単一のゲートウェイを共有するため、トラフィックは単一のホストを経由してルーティングされません。
オプション: 次のコマンドを実行して、IP 転送をグローバルに有効にします。
$ oc patch network.operator cluster --type=merge -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}'次のコマンドを実行して、
ipForwarding仕様がGlobalに設定されていることを確認します。$ oc get networks.operator.openshift.io cluster -o yaml | grep -A 5 "gatewayConfig"出力例
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster # ... gatewayConfig: ipForwarding: Global ipv4: {} ipv6: {} routingViaHost: true genevePort: 6081 # ...
第8章 デフォルトネットワークに外部ゲートウェイを設定する リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、デフォルトネットワークに外部ゲートウェイを設定できます。
この機能には次の利点があります。
- namespace ごとの Egress トラフィックの詳細制御
- 静的および動的外部ゲートウェイ IP アドレスの柔軟な設定
- IPv4 と IPv6 の両方のアドレスファミリーのサポート
8.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
- クラスターは OVN-Kubernetes ネットワークプラグインを使用します。
- インフラストラクチャーは、セカンダリー外部ゲートウェイからのトラフィックをルーティングするように設定されています。
8.2. OpenShift Container Platform が外部ゲートウェイ IP アドレスを決定する方法 リンクのコピーリンクがクリップボードにコピーされました!
k8s.ovn.org API グループの AdminPolicyBasedExternalRoute カスタムリソース (CR) を使用してセカンダリー外部ゲートウェイを設定します。この CR は、外部ゲートウェイの IP アドレスを指定するための静的アプローチと動的アプローチをサポートしています。
AdminPolicyBasedExternalRoute CR の対象となる各 namespace は、他の AdminPolicyBasedExternalRoute CR で選択できません。namespace には同時にセカンダリー外部ゲートウェイを含めることはできません。
ポリシーへの変更はコントローラー内で分離されます。あるポリシーの適用が失敗した場合に、他のポリシーを変更しても、他のポリシーの再試行はトリガーされません。ポリシーが再評価され、変更によって発生した可能性のある差分が適用されるのは、ポリシー自体またはポリシーに関連するオブジェクト (対象の namespace、Pod ゲートウェイ、または動的ホップからそれらをホストする namespace など) の更新が行われたときのみです。
- 静的割り当て
- IP アドレスを直接指定します。
- 動的割り当て
namespace と Pod セレクター、およびオプションのネットワーク割り当て定義を使用して、IP アドレスを間接的に指定します。
- ネットワーク割り当て定義の名前が指定されている場合は、ネットワーク割り当ての外部ゲートウェイ IP アドレスが使用されます。
-
ネットワーク割り当て定義の名前が指定されていない場合は、Pod 自体の外部ゲートウェイ IP アドレスが使用されます。ただし、このアプローチは、Pod が
hostNetworkをtrueに指定して設定されている場合にのみ機能します。
8.3. AdminPolicyBasedExternalRoute オブジェクトの設定 リンクのコピーリンクがクリップボードにコピーされました!
次のプロパティーを使用して、クラスタースコープの AdminPolicyBasedExternalRoute オブジェクトを定義できます。namespace は、一度に 1 つの AdminPolicyBasedExternalRoute CR でのみ選択できます。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
|
|
|
|
ルーティングポリシーを適用する namespace セレクターを指定します。外部トラフィックでは
namespace を対象にできるのは、1 つの |
|
|
|
パケットの転送先を指定します。 |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| 静的 IP アドレスの配列を指定します。 |
|
|
| 外部ゲートウェイターゲットとして使用するネットワーク割り当て定義で設定された Pod に対応する Pod セレクターの配列を指定します。 |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| 次の宛先ホップの IPv4 アドレスまたは IPv6 アドレスを指定します。 |
|
|
|
オプション: ネットワークで双方向転送検出 (BFD) がサポートされているかどうかを指定します。デフォルト値は |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| [set-based](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#set-based-requirement) ラベルセレクターを指定して、このネットワークに一致する namespace 内の Pod をフィルターします設定。 |
|
|
|
|
|
|
|
オプション: ネットワークで双方向転送検出 (BFD) がサポートされているかどうかを指定します。デフォルト値は |
|
|
| オプション: ネットワークアタッチメント定義の名前を指定します。名前は、Pod に関連付けられた論理ネットワークのリストと一致する必要があります。このフィールドが指定されていない場合は、Pod のホストネットワークが使用されます。ただし、ホストネットワークを使用するには、Pod をホストネットワーク Pod として設定する必要があります。 |
8.3.1. セカンダリー外部ゲートウェイ設定の例 リンクのコピーリンクがクリップボードにコピーされました!
次の例では、AdminPolicyBasedExternalRoute オブジェクトは、ラベルが kubernetes.io/metadata.name: novxlan-externalgw-ecmp-4059 の namespace 内にある Pod の外部ゲートウェイとして 2 つの静的 IP アドレスを設定します。
apiVersion: k8s.ovn.org/v1
kind: AdminPolicyBasedExternalRoute
metadata:
name: default-route-policy
spec:
from:
namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: novxlan-externalgw-ecmp-4059
nextHops:
static:
- ip: "172.18.0.8"
- ip: "172.18.0.9"
次の例では、AdminPolicyBasedExternalRoute オブジェクトが動的外部ゲートウェイを設定します。外部ゲートウェイに使用される IP アドレスは、選択した各 Pod に関連付けられた追加のネットワーク割り当てから派生します。
apiVersion: k8s.ovn.org/v1
kind: AdminPolicyBasedExternalRoute
metadata:
name: shadow-traffic-policy
spec:
from:
namespaceSelector:
matchLabels:
externalTraffic: ""
nextHops:
dynamic:
- podSelector:
matchLabels:
gatewayPod: ""
namespaceSelector:
matchLabels:
shadowTraffic: ""
networkAttachmentName: shadow-gateway
- podSelector:
matchLabels:
gigabyteGW: ""
namespaceSelector:
matchLabels:
gatewayNamespace: ""
networkAttachmentName: gateway
次の例では、AdminPolicyBasedExternalRoute オブジェクトは静的外部ゲートウェイと動的外部ゲートウェイの両方を設定します。
apiVersion: k8s.ovn.org/v1
kind: AdminPolicyBasedExternalRoute
metadata:
name: multi-hop-policy
spec:
from:
namespaceSelector:
matchLabels:
trafficType: "egress"
nextHops:
static:
- ip: "172.18.0.8"
- ip: "172.18.0.9"
dynamic:
- podSelector:
matchLabels:
gatewayPod: ""
namespaceSelector:
matchLabels:
egressTraffic: ""
networkAttachmentName: gigabyte
8.4. セカンダリー外部ゲートウェイの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター内の namespace のデフォルトネットワークに外部ゲートウェイを設定できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。
手順
-
AdminPolicyBasedExternalRouteオブジェクトを含む YAML ファイルを作成します。 管理ポリシーベースの外部ルートを作成するには、次のコマンドを入力します。
$ oc create -f <file>.yamlここでは、以下のようになります。
<file>- 前の手順で作成した YAML ファイルの名前を指定します。
出力例
adminpolicybasedexternalroute.k8s.ovn.org/default-route-policy created管理ポリシーベースの外部ルートが作成されたことを確認するには、次のコマンドを入力します。
$ oc describe apbexternalroute <name> | tail -n 6ここでは、以下のようになります。
<name>-
AdminPolicyBasedExternalRouteオブジェクトの名前を指定します。
出力例
Status: Last Transition Time: 2023-04-24T15:09:01Z Messages: Configured external gateway IPs: 172.18.0.8 Status: Success Events: <none>
8.5. 関連情報 リンクのコピーリンクがクリップボードにコピーされました!
- 追加のネットワークアタッチメントの詳細は、複数のネットワークについて を参照してください。
第9章 Egress IP アドレスの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、1 つ以上の Egress IP アドレスを、namespace または namespace 内の特定の Pod に割り当てるように、OVN-Kubernetes Container Network Interface (CNI) ネットワークプラグインを設定できます。
9.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 ネットワーク設定ファイルで設定することはできません。
9.1.1. プラットフォームサポート リンクのコピーリンクがクリップボードにコピーされました!
プライマリーホストネットワークで実行される Egress IP アドレス機能は、次のプラットフォームでサポートされています。
| プラットフォーム | サポート対象 |
|---|---|
| ベアメタル | はい |
| VMware vSphere | はい |
| Red Hat OpenStack Platform (RHOSP) | はい |
| Amazon Web Services (AWS) | はい |
| Google Cloud | はい |
| Microsoft Azure | はい |
| IBM Z® および IBM® LinuxONE | はい |
| IBM Z® および IBM® LinuxONE for Red Hat Enterprise Linux (RHEL) KVM | はい |
| IBM Power® | はい |
| Nutanix | はい |
セカンダリーホストネットワークで実行される Egress IP アドレス機能は、次のプラットフォームでサポートされています。
| プラットフォーム | サポート対象 |
|---|---|
| ベアメタル | はい |
EgressIP 機能を持つコントロールプレーンノードへの Egress IP アドレスの割り当ては、Amazon Web Services (AWS) でプロビジョニングされるクラスターではサポートされません。(BZ#2039656)。
9.1.2. パブリッククラウドプラットフォームに関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
通常、パブリッククラウドプロバイダーは Egress IP アドレスに制限を設けています。つまり、パブリッククラウドインフラストラクチャー上にプロビジョニングされたクラスターでは、ノードごとに割り当て可能な IP アドレスの絶対数に制約があります。ノードごとに割り当て可能な IP アドレスの最大数、つまり IP 容量 は、次の式で表すことができます。
IP capacity = public cloud default capacity - sum(current IP assignments)
Egress IP 機能はノードごとの IP アドレスの容量を管理しますが、デプロイメントでこの制約を計画することが重要です。たとえば、パブリッククラウドプロバイダーが IP アドレス容量をノードあたり 10 個に制限していて、ノードが 8 個ある場合、割り当て可能な IP アドレスの合計数は 80 個だけになります。IP アドレス容量を引き上げるには、追加のノードを割り当てる必要があります。たとえば、割り当て可能な IP アドレスが 150 個必要な場合は、7 つの追加のノードを割り当てる必要があります。
パブリッククラウド環境内の任意のノードの IP 容量とサブネットを確認するには、oc get node <node_name> -o yaml コマンドを入力します。cloud.network.openshift.io/egress-ipconfig アノテーションには、ノードの容量とサブネット情報が含まれています。
アノテーション値は、プライマリーネットワークインターフェイスに次の情報を提供するフィールドを持つ単一のオブジェクトを持つ配列です。
-
interface: AWS および Azure のインターフェイス ID と、Google Cloud のインターフェイス名を指定します。 -
ifaddr: 一方または両方の IP アドレスファミリーのサブネットマスクを指定します。 -
capacity: ノードの IP アドレス容量を指定します。AWS では、IP アドレス容量は IP アドレスファミリーごとに提供されます。Azure と Google Cloud では、IP アドレス容量に IPv4 アドレスと IPv6 アドレスの両方が含まれます。
ノード間のトラフィックの送信 IP アドレスの自動アタッチおよびデタッチが可能です。これにより、namespace 内の多くの Pod からのトラフィックが、クラスター外の場所への一貫した送信元 IP アドレスを持つことができます。これは、OpenShift Container Platform 4.19 の Red Hat OpenShift Networking におけるデフォルトのネットワーキングプラグインである OpenShift SDN および OVN-Kubernetes もサポートします。
RHOSP Egress IP アドレス機能は、egressip-<IP address> と呼ばれる Neutron 予約ポートを作成します。OpenShift Container Platform クラスターのインストールに使用したものと同じ RHOSP ユーザーを使用して、Floating IP アドレスをこの予約ポートに割り当て、Egress トラフィック用の予測可能な SNAT アドレスを指定できます。RHOSP ネットワーク上の Egress IP アドレスが、ノードのフェイルオーバーなどのためにあるノードから別のノードに移動されると、Neutron 予約ポートが削除され、再作成されます。これは、フローティング IP の関連付けが失われ、フローティング IP アドレスを新しい予約ポートに手動で再割り当てする必要があることを意味します。
RHOSP クラスター管理者が Floating IP を予約ポートに割り当てると、OpenShift Container Platform は予約ポートを削除できません。RHOSP クラスター管理者が予約ポートから Floating IP の割り当てを解除するまで、CloudPrivateIPConfig オブジェクトは削除および移動操作を実行できません。
次の例は、いくつかのパブリッククラウドプロバイダーのノードからのアノテーションを示しています。アノテーションは、読みやすくするためにインデントされています。
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}
}
]
Google Cloud の 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 アドレス容量を説明します。
9.1.2.1. Amazon Web Services (AWS) の IP アドレス容量の制限 リンクのコピーリンクがクリップボードにコピーされました!
AWS では、IP アドレスの割り当てに関する制約は、設定されているインスタンスタイプによって異なります。詳細は、IP addresses per network interface per instance type を参照してください。
9.1.2.2. Google Cloud の IP アドレスの容量制限 リンクのコピーリンクがクリップボードにコピーされました!
Google Cloud のネットワークモデルでは、IP アドレスの割り当てではなく、IP アドレスのエイリアシングによって追加のノード IP アドレスが実装されます。ただし、IP アドレスの容量は、IP エイリアシングの容量に直接マッピングされています。
IP エイリアシングの割り当てには、次の容量制限があります。
- ノードごとに、IPv4 と IPv6 の両方の IP エイリアスの最大数は 100 です。
- VPC ごとに、IP エイリアスの最大数は指定されていませんが、OpenShift Container Platform のスケーラビリティーテストでは、最大数が約 15,000 であることが明らかになっています。
詳細は、インスタンスごと のクォータと エイリアス IP 範囲の概要 を参照してください。
9.1.2.3. Microsoft Azure IP アドレスの容量制限 リンクのコピーリンクがクリップボードにコピーされました!
Azure では、IP アドレスの割り当てに次の容量制限があります。
- NIC ごとに、IPv4 と IPv6 の両方で割り当て可能な IP アドレスの最大数は 256 です。
- 仮想ネットワークごとに、割り当てられる IP アドレスの最大数は 65,536 を超えることはできません。
詳細は、ネットワークの制限 を参照してください。
9.1.3. 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 オブジェクト
apiVersion: v1
kind: Namespace
metadata:
name: namespace1
labels:
env: prod
---
apiVersion: v1
kind: Namespace
metadata:
name: namespace2
labels:
env: prod
図に基づき、次の 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 アドレスの割り当ての有無および割り当てられる場所を反映します。
9.1.4. 追加のネットワークインターフェイスで Egress IP アドレスを使用する際の考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform では、Egress IP アドレスは管理者にネットワークトラフィックを制御する方法として使用できます。Egress IP アドレスは、Open vSwitch (OVS) のブリッジインターフェイスである br-ex および IP 接続が有効な任意の物理インターフェイスで使用できます。
次のコマンドを実行して、ネットワークインターフェイスのタイプを検査できます。
$ ip -details link show
プライマリーネットワークインターフェイスには、サブネットマスクも含まれるノード IP アドレスが割り当てられます。このノードの IP アドレスの情報は、k8s.ovn.org/node-primary-ifaddr アノテーションを検査して、クラスター内の各ノードの Kubernetes ノードオブジェクトから取得できます。IPv4 クラスターでは、このアノテーションは "k8s.ovn.org/node-primary-ifaddr: {"ipv4":"192.168.111.23/24"}" の例に似ています。
Egress IP アドレスがプライマリーネットワークインターフェイスのサブネット内にない場合は、プライマリーネットワークインターフェイスタイプではない別の Linux ネットワークインターフェイスで Egress IP アドレスを使用できます。これにより、OpenShift Container Platform 管理者は、ルーティング、アドレス指定、セグメンテーション、セキュリティーポリシーなどのネットワーク側面をより高度に制御できるようになります。この機能は、トラフィックのセグメント化や特殊な要件への対応などの目的で、ワークロードトラフィックを特定のネットワークインターフェイス経由でルーティングするオプションもユーザーに提供します。
Egress IP アドレスがプライマリーネットワークインターフェイスのサブネット内にない場合、ノード上に Egress トラフィック用の別のネットワークインターフェイスが存在すると、そのネットワークインターフェイスが選択される可能性があります。
k8s.ovn.org/host-cidrs Kubernetes ノードのアノテーションを検査することで、他のどのネットワークインターフェイスが Egress IP アドレスをサポートしているかを判断できます。このアノテーションには、プライマリーネットワークインターフェイスで見つかったアドレスとサブネットマスクが含まれています。また、追加のネットワークインターフェイスアドレスとサブネットマスク情報も含まれます。これらのアドレスとサブネットマスクは、最長接頭辞マッチルーティング メカニズムを使用して、どのネットワークインターフェイスが Egress IP アドレスをサポートするかを決定するネットワークインターフェイスに割り当てられます。
OVN-Kubernetes は、特定の namespace および Pod からのアウトバウンドネットワークトラフィックを制御および送信するメカニズムを提供します。これにより、特定のネットワークインターフェイス経由で、特定の Egress IP アドレスを使用してクラスターからトラフィックが出ていきます。
egress IP アドレスとトラフィックをプライマリーネットワークインターフェイスではない特定のインターフェイスでルーティングする必要がある管理者は、以下の条件を満たす必要があります。
- OpenShift Container Platform がベアメタルクラスターにインストールされている。この機能は、クラウドまたはハイパーバイザー環境では無効になります。
- OpenShift Container Platform Pod が、ホストネットワークを使用する Pod として設定されていない。
- ネットワークインターフェイスが削除されるか、またはインターフェイスで egress IP アドレスをホストできる IP アドレスおよびサブネットマスクが削除される場合、egress IP アドレスの再設定が行われることを理解できます。そのため、egress IP アドレスが別のノードおよびインターフェイスに割り当てられる可能性があります。
- セカンダリーネットワークインターフェイスカード (NIC) で Egress IP アドレスを使用する場合は、Node Tuning Operator を使用してセカンダリー NIC で IP 転送を有効にする必要があります。
- ゲートウェイがメインのルーティングテーブルに存在することを確認して、ルートを使用して NIC を設定しました。インストール後のタスクとして、Red Hat は OVN-Kubernetes を使用するクラスターでの NIC の設定をサポートしていません。
- egress インターフェイスに関連付けられたルートは、メインのルーティングテーブルから Egress IP オブジェクトをサポートするために作成されたルーティングテーブルにコピーされます。
9.2. EgressIP オブジェクト リンクのコピーリンクがクリップボードにコピーされました!
ニーズに合わせて EgressIP オブジェクトを効果的に設定する方法をより深く理解するには、次の YAML ファイルを参照してください。
以下の YAML は、EgressIP オブジェクトの API を説明しています。オブジェクトの範囲はクラスター全体です。これは namespace では作成されません。
apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
name: <name>
spec:
egressIPs:
- <ip_address>
namespaceSelector:
...
podSelector:
...
ここでは、以下のようになります。
<name>-
EgressIPsオブジェクトの名前。 <egressIPs>- 1 つ以上の IP アドレスの配列。
<namespaceSelector>- Egress IP アドレスを関連付ける namespace の 1 つ以上のセレクター。
<podSelector>- オプションのパラメーター。Egress IP アドレスを関連付けるための指定された namespace の Pod の 1 つ以上のセレクター。これらのセレクターを適用すると、namespace 内の Pod のサブセットを選択できます。
以下の YAML は namespace セレクターのスタンザを説明しています。
namespace セレクタースタンザ
namespaceSelector:
matchLabels:
<label_name>: <label_value>
ここでは、以下のようになります。
<namespaceSelector>- namespace の 1 つ以上のマッチングルール。複数のマッチングルールを指定すると、一致するすべての namespace が選択されます。
以下の YAML は Pod セレクターのオプションのスタンザを説明しています。
Pod セレクタースタンザ
podSelector:
matchLabels:
<label_name>: <label_value>
ここでは、以下のようになります。
<podSelector>-
オプションのパラメーター。指定された
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
9.3. namespace、ノード、Pod への Egress IP の割り当て リンクのコピーリンクがクリップボードにコピーされました!
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 アドレスをホストする予定のノードにラベルを常に適用します。
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 会話にいずれかが使用される可能性があります。
9.4. Egress IP アドレスの namespace への割り当て リンクのコピーリンクがクリップボードにコピーされました!
1 つ以上の Egress IP アドレスを namespace または namespace の特定の Pod に割り当てることができます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - クラスター管理者としてクラスターにログインします。
- Egress IP アドレスをホストするように 1 つ以上のノードを設定します。
手順
EgressIPオブジェクトを作成します。-
<egressips_name>.yamlファイルを作成します。<egressips_name>はオブジェクトの名前になります。 作成したファイルで、以下の例のように
EgressIPオブジェクトを定義します。apiVersion: k8s.ovn.org/v1 kind: EgressIP metadata: name: egress-project1 spec: egressIPs: - 192.168.127.10 - 192.168.127.11 namespaceSelector: matchLabels: env: qa
-
オブジェクトを作成するには、以下のコマンドを入力します。
$ oc apply -f <egressips_name>.yamlここでは、以下のようになります。
<egressips_name>-
<egressips_name>をオブジェクトの名前に置き換えます。
出力例
egressips.k8s.ovn.org/<egressips_name> created-
オプション: 後に変更できるように
<egressips_name>.yamlファイルを保存します。 Egress IP アドレスを必要とする namespace にラベルを追加します。手順 1 で定義した
EgressIPオブジェクトの namespace にラベルを追加するには、以下のコマンドを実行します。$ oc label ns <namespace> env=qaここでは、以下のようになります。
<namespace>-
<namespace>は、Egress IP アドレスを必要とする namespace に置き換えてください。
検証
クラスターで使用されているすべての Egress IP アドレスを表示するには、次のコマンドを入力します。
$ oc get egressip -o yaml注記oc get egressipコマンドは、設定されている数に関係なく、1 つの Egress IP アドレスのみを返します。これはバグではなく、Kubernetes の制限です。回避策として、-o yamlまたは-o jsonフラグを渡して、使用中のすべての Egress IP アドレスを返すことができます。出力例
# ... spec: egressIPs: - 192.168.127.10 - 192.168.127.11 # ...
9.5. EgressIP フェイルオーバー制御について リンクのコピーリンクがクリップボードにコピーされました!
reachabilityTotalTimeoutSeconds パラメーターは、障害が発生した egressIP ノードをシステムが検出し、フェイルオーバーを開始するまでの時間を制御します。このパラメーターは、ノードが到達不能であると宣言する前にプラットフォームが待機する最大時間を直接決定します。
複数の Egress ノードで EgressIP を設定する場合、ノード障害から新しいノードでの回復までの完全なフェイルオーバー時間は、数秒以上になることが予想されます。これは、新しい IP の割り当ては、チェックが成功しないまま reachabilityTotalTimeoutSeconds 期間が完全に経過した後にのみ開始できるためです。
トラフィックが正しい外部パスを使用するように、ノード上の egressIP トラフィックは常に、egressIP アドレスが割り当てられたネットワークインターフェイスを介して出力されます。
9.5.1. EgressIP フェイルオーバー時間の制限を設定する リンクのコピーリンクがクリップボードにコピーされました!
次の手順に従って、reachabilityTotalTimeoutSeconds パラメーターを設定し、障害が発生した egressIP ノードをシステムが検出してフェイルオーバーを開始するまでの時間を制御します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - クラスター管理者としてクラスターにログインします。
手順
次のコマンドを実行して、
Networkカスタムリソースを編集します。$ oc edit network.operator cluster-
spec:defaultNetwork:ovnKubernetesConfig:のegressIPConfig: {}セクションに移動します。 ブロックを変更して、
reachabilityTotalTimeoutSecondsパラメーターに選択した値 (たとえば 5 秒) を指定します。正しいインデントを使用するようにしてください。defaultNetwork: ovnKubernetesConfig: egressIPConfig: reachabilityTotalTimeoutSeconds: 5注記値は 0 から 60 までの整数である必要があります。使用できる値の詳細は、「EgressIP フェイルオーバーの設定」セクションを参照してください。
- エディターを保存し、終了します。Operator が変更を自動的に適用します。
検証
次のコマンドを実行して、システムが
reachabilityTotalTimeoutSecondsパラメーターを正しく受け入れたことを確認します。$ oc get network.operator cluster -o yaml出力を調べて、
reachabilityTotalTimeoutSecondsパラメーターが意図した値でspec:defaultNetwork:ovnKubernetesConfig:egressIPConfig:の下に正しくネストされていることを確認します。# ... spec: # ... defaultNetwork: ovnKubernetesConfig: egressIPConfig: reachabilityTotalTimeoutSeconds: 5 gatewayConfig: # ...
9.5.2. EgressIP フェイルオーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
reachabilityTotalTimeoutSeconds パラメーターは、ノードがダウンしていると宣言されるまでの、プラットフォームのヘルスチェックプロセスの合計時間制限を秒単位で定義します。
次の表は、許容される値とその意味を示しています。
| パラメーター値 (秒) | 到達可能性チェックへの影響 | フェイルオーバーの影響とユースケース |
|---|---|---|
|
| 到達可能性チェックを無効にします。 | 自動フェイルオーバーはありません。外部システムがノードのヘルス監視とフェイルオーバーを処理する場合にのみ使用します。プラットフォームはノード障害に自動的に反応しません。 |
|
| 到達可能性プローブの合計時間制限を設定します。 | 検出時間を直接制御します。この値は、全体的なフェイルオーバー時間の下限を定義します。値が小さいほどフェイルオーバーが早くなりますが、ネットワークトラフィックが増加する可能性があります。デフォルト: 1 秒。受け入れられる整数値は最大で 60 です。 |
9.6. 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>
9.7. EgressIP オブジェクトのデュアルスタックネットワークの設定 リンクのコピーリンクがクリップボードにコピーされました!
デュアルスタックネットワーク用に設定されたクラスターの場合、単一の EgressIP オブジェクトにデュアルスタックネットワークを適用できます。EgressIP オブジェクトは、そのデュアルスタックネットワーク機能を Pod に拡張できます。
Red Hat は、デュアルスタックネットワーク機能を実現するために 2 つの EgressIP オブジェクトを作成することをサポートしていません。たとえば、1 つのオブジェクトで IPv4 アドレスを指定し、別のオブジェクトを使用して IPv6 アドレスを指定する設定です。この設定制限は、Pod へのアドレスタイプの割り当てに影響します。
前提条件
-
1 つの
EgressIPオブジェクトが 1 つのノードに IPv4 アドレスを割り当て、もう 1 つのノードに IPv6 アドレスを割り当てることができるように、2 つの出力ノードを作成した。詳細は、「ノードへの Egress IP アドレスの割り当て」を参照してください。
手順
EgressIPオブジェクトを作成し、そのオブジェクトの IPv4 および IPv6 アドレスを設定します。次のEgressIPオブジェクトの例では、セレクターを使用して、どの Pod が送信トラフィックに指定された Egress IP アドレスを使用するかを識別します。kind: EgressIP metadata: name: egressip-dual spec: egressIPs: - 192.168.118.30 - 2600:52:7:94::30 namespaceSelector: matchLabels: env: qa podSelector: matchLabels: egressip: ds # ...
検証
EgressIPオブジェクトをテストおよび検証するためのPodマニフェストファイルを作成します。Pod はクライアントワークロードとして機能し、EgressIPポリシーが期待どおりに機能することを確認するために送信トラフィックを送信します。apiVersion: v1 kind: Pod metadata: name: ubi-egressip-pod namespace: test labels: egressip: ds spec: containers: - name: fedora-curl image: registry.redhat.io/ubi9/ubi command: ["/bin/bash", "-c", "sleep infinity"] # ...ここでは、以下のようになります。
<labels>-
EgressIPオブジェクトがこれらのラベルを使用してターゲット Pod に Egress IP アドレスを適用できるように、カスタム識別子を設定します。
Pod 内から外部サーバーに
curlリクエストを実行します。このアクションは、送信トラフィックがEgressIPオブジェクトで指定したアドレスを正しく使用していることを確認します。$ curl <ipv_address>ここでは、以下のようになります。
<ipv_address>-
EgressIPオブジェクトに応じて、IPv4 アドレスまたは IPv6 アドレスを入力します。
第10章 出力サービスの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、Egress サービスを使用して、ロードバランサーサービスの背後にある Pod の Egress トラフィックを設定できます。
Egress サービスはテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、以下のリンクを参照してください。
EgressService カスタムリソース (CR) を使用して、次の方法で送信トラフィックを管理できます。
ロードバランサーサービスの IP アドレスを、ロードバランサーサービスの背後にある Pod の送信トラフィックの送信元 IP アドレスとして割り当てます。
このコンテキストでは、ロードバランサーの IP アドレスを送信元 IP アドレスとして割り当てると、単一の Egress と Ingress を提供するのに役立ちます。たとえば、一部のシナリオでは、ロードバランサーサービスの背後でアプリケーションと通信する外部システムは、アプリケーションの送信元 IP アドレスと宛先 IP アドレスが同じであると想定できます。
注記ロードバランサーサービスの IP アドレスをサービスの背後にある Pod の Egress トラフィックに割り当てると、OVN-Kubernetes は Ingress ポイントと Egress ポイントを単一のノードに制限します。これにより、MetalLB が通常提供するトラフィックのロードバランシングが制限されます。
ロードバランサーの背後にある Pod の Egress トラフィックを、デフォルトノードネットワークとは異なるネットワークに割り当てます。
これは、ロードバランサーの背後にあるアプリケーションの Egress トラフィックを、デフォルトネットワークとは異なるネットワークに割り当てる場合に便利です。通常、別のネットワークは、ネットワークインターフェイスに関連付けられた VRF インスタンスを使用して実装されます。
10.1. Egress サービスのカスタムリソース リンクのコピーリンクがクリップボードにコピーされました!
EgressService カスタムリソースで Egress サービスの設定を定義します。次の YAML は、egress サービスの設定のフィールドを説明します。
apiVersion: k8s.ovn.org/v1
kind: EgressService
metadata:
name: <egress_service_name>
namespace: <namespace>
spec:
sourceIPBy: <egress_traffic_ip>
nodeSelector:
matchLabels:
node-role.kubernetes.io/<role>: ""
network: <egress_traffic_network>
- 1
- Egress サービスの名前を指定します。
EgressServiceリソースの名前は、変更するロードバランサーサービスの名前と一致する必要があります。 - 2
- Egress サービスの namespace を指定します。
EgressServiceの namespace は、変更するロードバランサーサービスの namespace と一致する必要があります。Egress サービスは namespace スコープです。 - 3
- サービスの背後にある Pod の Egress トラフィックの送信元 IP アドレスを指定します。有効な値は、
LoadBalancerIPまたはNetworkです。LoadBalancerIP値を使用して、LoadBalancerサービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てます。Networkを指定して、ネットワークインターフェイスの IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てます。 - 4
- オプション:
sourceIPBy指定にLoadBalancerIP値を使用する場合、単一ノードがLoadBalancerサービストラフィックを処理します。このタスクを割り当て可能なノードを制限するには、nodeSelectorフィールドを使用します。サービストラフィックを処理するノードが選択されると、OVN-Kubernetes はそのノードにegress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: ""という形式でラベルを付けます。nodeSelectorフィールドが指定されていない場合、どのノードでもLoadBalancerサービストラフィックを管理できます。 - 5
- オプション: Egress トラフィックのルーティングテーブル ID を指定します。必ず
NodeNetworkConfigurationPolicyリソースで定義されているroute-table-idID と一致する値を指定してください。network仕様を含めない場合、Egress サービスはデフォルトのホストネットワークを使用します。
Egress サービス仕様の例
apiVersion: k8s.ovn.org/v1
kind: EgressService
metadata:
name: test-egress-service
namespace: test-namespace
spec:
sourceIPBy: "LoadBalancerIP"
nodeSelector:
matchLabels:
vrf: "true"
network: "2"
10.2. Egress サービスのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
Egress サービスをデプロイして、LoadBalancer サービスの背後にある Pod の Egress トラフィックを管理できます。
次の例では、LoadBalancer サービスの Ingress IP アドレスと同じ送信元 IP アドレスを持つように Egress トラフィックを設定します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 -
MetalLB
BGPPeerリソースを設定している。
手順
サービスに必要な IP を使用して
IPAddressPoolCR を作成します。次の例のような内容を含むファイル (
ip-addr-pool.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: example-pool namespace: metallb-system spec: addresses: - 172.19.0.100/32次のコマンドを実行して、IP アドレスプールの設定を適用します。
$ oc apply -f ip-addr-pool.yaml
ServiceCR およびEgressServiceCR を作成します。次の例のような内容を含むファイル (
service-egress-service.yamlなど) を作成します。apiVersion: v1 kind: Service metadata: name: example-service namespace: example-namespace annotations: metallb.io/address-pool: example-pool1 spec: selector: app: example ports: - name: http protocol: TCP port: 8080 targetPort: 8080 type: LoadBalancer --- apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: example-service namespace: example-namespace spec: sourceIPBy: "LoadBalancerIP"2 nodeSelector:3 matchLabels: node-role.kubernetes.io/worker: ""- 1
LoadBalancerサービスは、example-poolIP アドレスプールから MetalLB によって割り当てられた IP アドレスを使用します。- 2
- この例では、
LoadBalancerIP値を使用して、LoadBalancerサービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てます。 - 3
LoadBalancerIP値を指定すると、単一ノードがLoadBalancerサービスのトラフィックを処理します。この例では、トラフィックを処理する場合にworkerラベルが割り当てられたノードのみを選択できます。ノードが選択されると、OVN-Kubernetes はそのノードにegress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: ""という形式でラベルを付けます。
注記sourceIPBy: "LoadBalancerIP"設定を使用する場合は、BGPAdvertisementカスタムリソース (CR) でロードバランサーノードを指定する必要があります。次のコマンドを実行して、サービスと Egress サービスの設定を適用します。
$ oc apply -f service-egress-service.yaml
BGPAdvertisementCR を作成してサービスをアドバタイズします。次の例のような内容を含むファイル (
service-bgp-advertisement.yamlなど) を作成します。apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: example-bgp-adv namespace: metallb-system spec: ipAddressPools: - example-pool nodeSelectors: - matchLabels: egress-service.k8s.ovn.org/example-namespace-example-service: ""1 - 1
- この例では、
EgressServiceCR は、ロードバランサーサービス IP アドレスを使用するように、Egress トラフィックの送信元 IP アドレスを設定します。したがって、Pod から発信されるトラフィックに同じリターンパスを使用するには、リターントラフィックのロードバランサーノードを指定する必要があります。
検証
次のコマンドを実行して、MetalLB サービスの背後で実行されている Pod のアプリケーションエンドポイントにアクセスできることを確認します。
$ curl <external_ip_address>:<port_number>1 - 1
- アプリケーションのエンドポイントに合わせて外部 IP アドレスとポート番号を更新します。
-
LoadBalancerサービスの Ingress IP アドレスを Egress トラフィックの送信元 IP アドレスとして割り当てた場合は、tcpdumpなどのツールを使用して外部クライアントで受信したパケットを分析し、この設定を確認します。
第11章 Egress ルーター Pod の使用に関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
11.1. Egress ルーター Pod について リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform Egress ルーター Pod は、他の用途で使用されていないプライベートソース IP アドレスから指定されたリモートサーバーにトラフィックをリダイレクトします。Egress ルーター Pod により、特定の IP アドレスからのアクセスのみを許可するように設定されたサーバーにネットワークトラフィックを送信できます。
Egress ルーター Pod はすべての発信接続のために使用されることが意図されていません。多数の Egress ルーター Pod を作成することで、ネットワークハードウェアの制限を引き上げられる可能性があります。たとえば、すべてのプロジェクトまたはアプリケーションに Egress ルーター Pod を作成すると、ソフトウェアの MAC アドレスのフィルターに戻る前にネットワークインターフェイスが処理できるローカル MAC アドレス数の上限を超えてしまう可能性があります。
Egress ルーターイメージには Amazon AWS, Azure Cloud またはレイヤー 2 操作をサポートしないその他のクラウドプラットフォームとの互換性がありません。それらに macvlan トラフィックとの互換性がないためです。
11.1.1. Egress ルーターモード リンクのコピーリンクがクリップボードにコピーされました!
リダイレクトモード では、Egress ルーター Pod は、トラフィックを独自の IP アドレスから 1 つ以上の宛先 IP アドレスにリダイレクトするために iptables ルールをセットアップします。予約された送信元 IP アドレスを使用する必要があるクライアント Pod は、宛先 IP に直接接続するのではなく、スロールーターのサービスにアクセスするように設定する必要があります。curl コマンドを使用して、アプリケーション Pod から宛先サービスとポートにアクセスできます。以下に例を示します。
$ curl <router_service_IP> <port>
Egress ルーター CNI プラグインはリダイレクトモードのみをサポートします。Egress ルーター CNI プラグインは、HTTP プロキシーモードまたは DNS プロキシーモードをサポートしていません。
11.1.2. Egress ルーター Pod の実装 リンクのコピーリンクがクリップボードにコピーされました!
Egress ルーターの実装では、Egress ルーターの Container Network Interface (CNI) プラグインを使用します。プラグインはセカンダリーネットワークインターフェイスを Pod に追加します。
Egress ルーターは、2 つのネットワークインターフェイスを持つ Pod です。たとえば、Pod には、eth0 および net1 ネットワークインターフェイスを使用できます。eth0 インターフェイスはクラスターネットワークにあり、Pod は通常のクラスター関連のネットワークトラフィックにこのインターフェイスを引き続き使用します。net1 インターフェイスはセカンダリーネットワークにあり、そのネットワークの IP アドレスとゲートウェイを持ちます。OpenShift Container Platform クラスターの他の Pod は Egress ルーターサービスにアクセスでき、サービスにより Pod が外部サービスにアクセスできるようになります。Egress ルーターは、Pod と外部システム間のブリッジとして機能します。
Egress ルーターから出るトラフィックはノードで終了しますが、パケットには Egress ルーター Pod からの net1 インターフェイスの MAC アドレスがあります。
Egress ルーターのカスタムリソースを追加すると、Cluster Network Operator は以下のオブジェクトを作成します。
-
Pod の
net1セカンダリーネットワークインターフェイス用のネットワークアタッチメント定義。 - Egress ルーターのデプロイメント。
Egress ルーターカスタムリソースを削除する場合、Operator は Egress ルーターに関連付けられた直前のリストの 2 つのオブジェクトを削除します。
11.1.3. デプロイメントに関する考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
Egress ルーター Pod は追加の IP アドレスおよび MAC アドレスをノードのプライマリーネットワークインターフェイスに追加します。その結果、ハイパーバイザーまたはクラウドプロバイダーを、追加のアドレスを許可するように設定する必要がある場合があります。
- Red Hat OpenStack Platform (RHOSP)
OpenShift Container Platform を RHOSP にデプロイする場合、OpenStack 環境の Egress ルーター Pod の IP および MAC アドレスからのトラフィックを許可する必要があります。トラフィックを許可しないと、通信は失敗 します。
$ openstack port set --allowed-address \ ip_address=<ip_address>,mac_address=<mac_address> <neutron_port_uuid>- VMware vSphere
- VMware vSphere を使用している場合は、vSphere 標準スイッチのセキュリティー保護に関する VMware ドキュメント を参照してください。vSphere Web クライアントからホストの仮想スイッチを選択して、VMware vSphere デフォルト設定を表示し、変更します。
とくに、以下が有効にされていることを確認します。
11.1.4. フェイルオーバー設定 リンクのコピーリンクがクリップボードにコピーされました!
ダウンタイムを回避するにために、Cluster Network Operator は Egress ルーター Pod をデプロイメントリソースとしてデプロイします。デプロイメント名は egress-router-cni-deployment です。デプロイメントに対応する Pod には app=egress-router-cni のラベルがあります。
デプロイメントの新規サービスを作成するには、oc expose deployment/egress-router-cni-deployment --port <port_number> コマンドを使用するか、以下のようにファイルを作成します。
apiVersion: v1
kind: Service
metadata:
name: app-egress
spec:
ports:
- name: tcp-8080
protocol: TCP
port: 8080
- name: tcp-8443
protocol: TCP
port: 8443
- name: udp-80
protocol: UDP
port: 80
type: ClusterIP
selector:
app: egress-router-cni
第12章 リダイレクトモードでの Egress ルーター Pod のデプロイ リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、トラフィックを予約された送信元 IP アドレスから指定された宛先 IP アドレスにリダイレクトするように Egress ルーター Pod をデプロイできます。
Egress ルーターの実装では、Egress ルーターの Container Network Interface (CNI) プラグインを使用します。
12.1. Egress ルーターのカスタムリソース リンクのコピーリンクがクリップボードにコピーされました!
Egress ルーターのカスタムリソースで Egress ルーター Pod の設定を定義します。以下の YAML は、リダイレクトモードでの Egress ルーターの設定のフィールドを説明しています。
apiVersion: network.operator.openshift.io/v1
kind: EgressRouter
metadata:
name: <egress_router_name>
namespace: <namespace>
spec:
addresses: [
{
ip: "<egress_router>",
gateway: "<egress_gateway>"
}
]
mode: Redirect
redirect: {
redirectRules: [
{
destinationIP: "<egress_destination>",
port: <egress_router_port>,
targetPort: <target_port>,
protocol: <network_protocol>
},
...
],
fallbackIP: "<egress_destination>"
}
- 1
- オプション:
namespaceフィールドは、Egress ルーターを作成するための namespace を指定します。ファイルまたはコマンドラインで値を指定しない場合には、defaultnamespace が使用されます。 - 2
addressesフィールドは、セカンダリーネットワークインターフェイスに設定する IP アドレスを指定します。- 3
ipフィールドは、ノードが Egress ルーター Pod と使用する物理ネットワークからの予約済み送信元 IP アドレスとネットマスクを指定します。CIDR 表記を使用して IP アドレスとネットマスクを指定します。- 4
gatewayフィールドは、ネットワークゲートウェイの IP アドレスを指定します。- 5
- オプション:
redirectRulesフィールドは、Egress 宛先 IP アドレス、Egress ルーターポート、およびプロトコルの組み合わせを指定します。指定されたポートとプロトコルでの Egress ルーターへの着信接続は、宛先 IP アドレスにルーティングされます。 - 6
- オプション:
targetPortフィールドは、宛先 IP アドレスのネットワークポートを指定します。このフィールドが指定されていない場合、トラフィックは到達したネットワークポートと同じネットワークポートにルーティングされます。 - 7
protocolフィールドは TCP、UDP、または SCTP をサポートします。- 8
- オプション:
fallbackIPフィールドは、宛先 IP アドレスを指定します。リダイレクトルールを指定しない場合、Egress ルーターはすべてのトラフィックをこのフォールバック IP アドレスに送信します。リダイレクトルールを指定する場合、ルールに定義されていないネットワークポートへの接続は、Egress ルーターによってこのフォールバック IP アドレスに送信されます。このフィールドを指定しない場合、Egress ルーターはルールで定義されていないネットワークポートへの接続を拒否します。
Egress ルーター仕様の例
apiVersion: network.operator.openshift.io/v1
kind: EgressRouter
metadata:
name: egress-router-redirect
spec:
networkInterface: {
macvlan: {
mode: "Bridge"
}
}
addresses: [
{
ip: "192.168.12.99/24",
gateway: "192.168.12.1"
}
]
mode: Redirect
redirect: {
redirectRules: [
{
destinationIP: "10.0.0.99",
port: 80,
protocol: UDP
},
{
destinationIP: "203.0.113.26",
port: 8080,
targetPort: 80,
protocol: TCP
},
{
destinationIP: "203.0.113.27",
port: 8443,
targetPort: 443,
protocol: TCP
}
]
}
12.2. リダイレクトモードでの Egress ルーターのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
Egress ルーターをデプロイして、独自の予約済み送信元 IP アドレスから 1 つ以上の宛先 IP アドレスにトラフィックをリダイレクトできます。
Egress ルーターを追加した後に、予約済み送信元 IP アドレスを使用する必要のあるクライアント Pod は、宛先 IP に直接接続するのでなく、Egress ルーターに接続するように変更される必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
- Egress ルーター定義の作成
他の Pod が Egress ルーター Pod の IP アドレスを見つられるようにするには、以下の例のように、Egress ルーターを使用するサービスを作成します。
apiVersion: v1 kind: Service metadata: name: egress-1 spec: ports: - name: web-app protocol: TCP port: 8080 type: ClusterIP selector: app: egress-router-cni1 - 1
- Egress ルーターのラベルを指定します。表示されている値は Cluster Network Operator によって追加され、設定不可能です。
サービスの作成後に、Pod はサービスに接続できます。Egress ルーター Pod は、トラフィックを宛先 IP アドレスの対応するポートにリダイレクトします。接続は、予約された送信元 IP アドレスを起点とします。
検証
Cluster Network Operator が Egress ルーターを起動したことを確認するには、以下の手順を実行します。
Operator が Egress ルーター用に作成したネットワークアタッチメント定義を表示します。
$ oc get network-attachment-definition egress-router-cni-nadこのネットワークアタッチメント定義の名前は設定できません。
出力例
NAME AGE egress-router-cni-nad 18mEgress ルーター Pod のデプロイメントを表示します。
$ oc get deployment egress-router-cni-deploymentデプロイメントの名前は設定できません。
出力例
NAME READY UP-TO-DATE AVAILABLE AGE egress-router-cni-deployment 1/1 1 1 18mEgress ルーター Pod のステータスを表示します。
$ oc get pods -l app=egress-router-cni出力例
NAME READY STATUS RESTARTS AGE egress-router-cni-deployment-575465c75c-qkq6m 1/1 Running 0 18m- Egress ルーター Pod のログとルーティングテーブルを表示します。
Egress ルーター Pod のノード名を取得します。
$ POD_NODENAME=$(oc get pod -l app=egress-router-cni -o jsonpath="{.items[0].spec.nodeName}")ターゲットノードのデバッグセッションに入ります。この手順は、
<node_name>-debugというデバッグ Pod をインスタンス化します。$ oc debug node/$POD_NODENAME/hostをデバッグシェル内の root ディレクトリーとして設定します。デバッグ Pod は、Pod 内の/hostにホストのルートファイルシステムをマウントします。ルートディレクトリーを/hostに変更すると、ホストの実行可能パスに含まれるバイナリーを実行できます。# chroot /hostchroot環境コンソール内から、Egress ルーターログを表示します。# cat /tmp/egress-router-log出力例
2021-04-26T12:27:20Z [debug] Called CNI ADD 2021-04-26T12:27:20Z [debug] Gateway: 192.168.12.1 2021-04-26T12:27:20Z [debug] IP Source Addresses: [192.168.12.99/24] 2021-04-26T12:27:20Z [debug] IP Destinations: [80 UDP 10.0.0.99/30 8080 TCP 203.0.113.26/30 80 8443 TCP 203.0.113.27/30 443] 2021-04-26T12:27:20Z [debug] Created macvlan interface 2021-04-26T12:27:20Z [debug] Renamed macvlan to "net1" 2021-04-26T12:27:20Z [debug] Adding route to gateway 192.168.12.1 on macvlan interface 2021-04-26T12:27:20Z [debug] deleted default route {Ifindex: 3 Dst: <nil> Src: <nil> Gw: 10.128.10.1 Flags: [] Table: 254} 2021-04-26T12:27:20Z [debug] Added new default route with gateway 192.168.12.1 2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat PREROUTING -i eth0 -p UDP --dport 80 -j DNAT --to-destination 10.0.0.99 2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat PREROUTING -i eth0 -p TCP --dport 8080 -j DNAT --to-destination 203.0.113.26:80 2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat PREROUTING -i eth0 -p TCP --dport 8443 -j DNAT --to-destination 203.0.113.27:443 2021-04-26T12:27:20Z [debug] Added iptables rule: iptables -t nat -o net1 -j SNAT --to-source 192.168.12.99この手順で説明されているように、
EgressRouterオブジェクトを作成して Egress ルーターを起動する場合、ロギングファイルの場所とロギングレベルは設定できません。chroot環境コンソール内で、コンテナー ID を取得します。# crictl ps --name egress-router-cni-pod | awk '{print $1}'出力例
CONTAINER bac9fae69ddb6コンテナーのプロセス ID を判別します。この例では、コンテナー ID は
bac9fae69ddb6です。# crictl inspect -o yaml bac9fae69ddb6 | grep 'pid:' | awk '{print $2}'出力例
68857コンテナーのネットワーク namespace を入力します。
# nsenter -n -t 68857ルーティングテーブルを表示します。
# ip route以下の出力例では、
net1ネットワークインターフェイスはデフォルトのルートです。クラスターネットワークのトラフィックはeth0ネットワークインターフェイスを使用します。192.168.12.0/24ネットワークのトラフィックは、net1ネットワークインターフェイスを使用し、予約された送信元 IP アドレス192.168.12.99を起点とします。Pod は他のすべてのトラフィックを IP アドレス192.168.12.1のゲートウェイにルーティングします。サービスネットワークのルーティングは表示されません。出力例
default via 192.168.12.1 dev net1 10.128.10.0/23 dev eth0 proto kernel scope link src 10.128.10.18 192.168.12.0/24 dev net1 proto kernel scope link src 192.168.12.99 192.168.12.1 dev net1
第13章 プロジェクトのマルチキャストの有効化 リンクのコピーリンクがクリップボードにコピーされました!
13.1. マルチキャストについて リンクのコピーリンクがクリップボードにコピーされました!
IP マルチキャストを使用すると、データが多数の IP アドレスに同時に配信されます。
- 現時点で、マルチキャストは低帯域幅の調整またはサービスの検出での使用に最も適しており、高帯域幅のソリューションとしては適していません。
-
デフォルトでは、ネットワークポリシーは namespace 内のすべての接続に影響します。ただし、マルチキャストはネットワークポリシーの影響を受けません。マルチキャストがネットワークポリシーと同じ namespace で有効にされている場合、
deny-allネットワークポリシーがある場合でも、マルチキャストは常に許可されます。クラスター管理者は、これを有効にする前に、ネットワークポリシーからマルチキャストが除外されることの影響を考慮する必要があります。
OpenShift Container Platform の Pod 間のマルチキャストトラフィックはデフォルトで無効にされます。OVN-Kubernetes ネットワークプラグインを使用している場合は、プロジェクトごとにマルチキャストを有効にできます。
13.2. Pod 間のマルチキャストの有効化 リンクのコピーリンクがクリップボードにコピーされました!
プロジェクトの Pod でマルチキャストを有効にすることができます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-adminロールを持つユーザーとしてクラスターにログインする必要があります。
手順
以下のコマンドを実行し、プロジェクトのマルチキャストを有効にします。
<namespace>を、マルチキャストを有効にする必要のある namespace に置き換えます。$ oc annotate namespace <namespace> \ k8s.ovn.org/multicast-enabled=trueヒントまたは、以下の YAML を適用してアノテーションを追加できます。
apiVersion: v1 kind: Namespace metadata: name: <namespace> annotations: k8s.ovn.org/multicast-enabled: "true"
検証
プロジェクトでマルチキャストが有効になっていることを確認するには、次の手順を実行します。
現在のプロジェクトを、マルチキャストを有効にしたプロジェクトに切り替えます。
<project>をプロジェクト名に置き換えます。$ oc project <project>マルチキャストレシーバーとして機能する Pod を作成します。
$ cat <<EOF| oc create -f - apiVersion: v1 kind: Pod metadata: name: mlistener labels: app: multicast-verify spec: containers: - name: mlistener image: registry.access.redhat.com/ubi9 command: ["/bin/sh", "-c"] args: ["dnf -y install socat hostname && sleep inf"] ports: - containerPort: 30102 name: mlistener protocol: UDP EOFマルチキャストセンダーとして機能する Pod を作成します。
$ cat <<EOF| oc create -f - apiVersion: v1 kind: Pod metadata: name: msender labels: app: multicast-verify spec: containers: - name: msender image: registry.access.redhat.com/ubi9 command: ["/bin/sh", "-c"] args: ["dnf -y install socat && sleep inf"] EOF新しいターミナルウィンドウまたはタブで、マルチキャストリスナーを起動します。
Pod の IP アドレスを取得します。
$ POD_IP=$(oc get pods mlistener -o jsonpath='{.status.podIP}')次のコマンドを入力して、マルチキャストリスナーを起動します。
$ oc exec mlistener -i -t -- \ socat UDP4-RECVFROM:30102,ip-add-membership=224.1.0.1:$POD_IP,fork EXEC:hostname
マルチキャストトランスミッターを開始します。
Pod ネットワーク IP アドレス範囲を取得します。
$ CIDR=$(oc get Network.config.openshift.io cluster \ -o jsonpath='{.status.clusterNetwork[0].cidr}')マルチキャストメッセージを送信するには、以下のコマンドを入力します。
$ oc exec msender -i -t -- \ /bin/bash -c "echo | socat STDIO UDP4-DATAGRAM:224.1.0.1:30102,range=$CIDR,ip-multicast-ttl=64"マルチキャストが機能している場合、直前のコマンドは以下の出力を返します。
mlistener
第14章 プロジェクトのマルチキャストの無効化 リンクのコピーリンクがクリップボードにコピーされました!
14.1. Pod 間のマルチキャストの無効化 リンクのコピーリンクがクリップボードにコピーされました!
プロジェクトの Pod でマルチキャストを無効にすることができます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-adminロールを持つユーザーとしてクラスターにログインする必要があります。
手順
以下のコマンドを実行して、マルチキャストを無効にします。
$ oc annotate namespace <namespace> \1 k8s.ovn.org/multicast-enabled-- 1
- マルチキャストを無効にする必要のあるプロジェクトの
namespace。
ヒントまたは、以下の YAML を適用してアノテーションを削除できます。
apiVersion: v1 kind: Namespace metadata: name: <namespace> annotations: k8s.ovn.org/multicast-enabled: null
第15章 ネットワークフローの追跡 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、以下の領域をサポートする、クラスターからの Pod ネットワークフローに関する情報を収集できます。
- Pod ネットワークで Ingress および Egress トラフィックをモニターします。
- パフォーマンスに関する問題のトラブルシューティング
- 容量計画およびセキュリティー監査に関するデータを収集します。
ネットワークフローのコレクションを有効にすると、トラフィックに関するメタデータのみが収集されます。たとえば、パケットデータは収集されませんが、プロトコル、ソースアドレス、宛先アドレス、ポート番号、バイト数、その他のパケットレベルの情報を収集します。
データは、以下の 1 つ以上のレコード形式で収集されます。
- NetFlow
- sFlow
- IPFIX
1 つ以上のコレクター IP アドレスおよびポート番号を使用して Cluster Network Operator (CNO) を設定する場合、Operator は各ノードで Open vSwitch (OVS) を設定し、ネットワークフローレコードを各コレクターに送信します。
Operator を、複数のネットワークフローコレクターにレコードを送信するように設定できます。たとえば、レコードを NetFlow コレクターに送信し、レコードを sFlow コレクターに送信することもできます。
OVS がデータをコレクターに送信すると、それぞれのタイプのコレクターは同一レコードを受け取ります。たとえば、2 つの NetFlow コレクターを設定すると、ノード上の OVS は同じレコードを 2 つのコレクターに送信します。また、2 つの sFlow コレクターを設定した場合には、2 つの sFlow コレクターが同じレコードを受け取ります。ただし、各コレクタータイプには固有のレコード形式があります。
ネットワークフローデータを収集し、レコードをコレクターに送信すると、パフォーマンスに影響があります。ノードは低速でパケットを処理します。パフォーマンスへの影響が大きすぎる場合は、コレクターの宛先を削除し、ネットワークフローデータの収集を無効にしてパフォーマンスを回復できます。
ネットワークフローコレクターを有効にすると、クラスターネットワークの全体的なパフォーマンスに影響を与える可能性があります。
15.1. ネットワークフローを追跡するためのネットワークオブジェクト設定 リンクのコピーリンクがクリップボードにコピーされました!
Cluster Network Operator (CNO) でネットワークフローコレクターを設定するフィールドを以下の表に示します。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
CNO オブジェクトの名前。この名前は常に |
|
|
|
1 つ以上の |
|
|
| 最大 10 コレクターの IP アドレスとネットワークポートのペアのリスト。 |
|
|
| 最大 10 コレクターの IP アドレスとネットワークポートのペアのリスト。 |
|
|
| 最大 10 コレクターの IP アドレスとネットワークポートのペアのリスト。 |
以下のマニフェストを CNO に適用した後に、Operator は、192.168.1.99:2056 でリッスンする NetFlow コレクターにネットワークフローレコードを送信するようにクラスター内の各ノードで Open vSwitch (OVS) を設定します。
ネットワークフローを追跡するための設定例
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
exportNetworkFlows:
netFlow:
collectors:
- 192.168.1.99:2056
15.2. ネットワークフローコレクターの宛先の追加 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、Cluster Network Operator (CNO) を設定して、Pod ネットワークに関するネットワークフローメタデータのネットワークフローコレクターへの送信を停止することができます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - ネットワークフローコレクターがあり、リッスンする IP アドレスとポートを把握している。
手順
ネットワークフローコレクターのタイプおよびコレクターの IP アドレスとポート情報を指定するパッチファイルを作成します。
spec: exportNetworkFlows: netFlow: collectors: - 192.168.1.99:2056ネットワークフローコレクターで CNO を設定します。
$ oc patch network.operator cluster --type merge -p "$(cat <file_name>.yaml)"出力例
network.operator.openshift.io/cluster patched
検証
検証は通常必須ではありません。以下のコマンドを実行して、各ノードの Open vSwitch (OVS) がネットワークフローレコードを 1 つ以上のコレクターに送信するように設定されていることを確認できます。
Operator 設定を表示して、
exportNetworkFlowsフィールドが設定されていることを確認します。$ oc get network.operator cluster -o jsonpath="{.spec.exportNetworkFlows}"出力例
{"netFlow":{"collectors":["192.168.1.99:2056"]}}各ノードから OVS のネットワークフロー設定を表示します。
$ for pod in $(oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node -o jsonpath='{range@.items[*]}{.metadata.name}{"\n"}{end}'); do ; echo; echo $pod; oc -n openshift-ovn-kubernetes exec -c ovnkube-controller $pod \ -- bash -c 'for type in ipfix sflow netflow ; do ovs-vsctl find $type ; done'; done出力例
ovnkube-node-xrn4p _uuid : a4d2aaca-5023-4f3d-9400-7275f92611f9 active_timeout : 60 add_id_to_interface : false engine_id : [] engine_type : [] external_ids : {} targets : ["192.168.1.99:2056"] ovnkube-node-z4vq9 _uuid : 61d02fdb-9228-4993-8ff5-b27f01a29bd6 active_timeout : 60 add_id_to_interface : false engine_id : [] engine_type : [] external_ids : {} targets : ["192.168.1.99:2056"]- ...
15.3. ネットワークフローコレクターのすべての宛先の削除 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者として、Cluster Network Operator (CNO) を設定して、ネットワークフローメタデータのネットワークフローコレクターへの送信を停止することができます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。
手順
すべてのネットワークフローコレクターを削除します。
$ oc patch network.operator cluster --type='json' \ -p='[{"op":"remove", "path":"/spec/exportNetworkFlows"}]'出力例
network.operator.openshift.io/cluster patched
第16章 ハイブリッドネットワークの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、Red Hat OpenShift Networking OVN-Kubernetes ネットワークプラグインを設定して、Linux および Windows ノードがそれぞれ Linux および Windows ワークロードをホストできるようにすることができます。
16.1. OVN-Kubernetes を使用したハイブリッドネットワークの設定 リンクのコピーリンクがクリップボードにコピーされました!
OVN-Kubernetes ネットワークプラグインを使用してハイブリッドネットワークを使用するようにクラスターを設定できます。これにより、異なるノードのネットワーク設定をサポートするハイブリッドクラスターが可能になります。
この設定は、同じクラスター内で Linux ノードと Windows ノードの両方を実行するために必要です。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - クラスターが OVN-Kubernetes ネットワークプラグインを使用していることを確認します。
手順
OVN-Kubernetes ハイブリッドネットワークオーバーレイを設定するには、次のコマンドを入力します。
$ oc patch networks.operator.openshift.io cluster --type=merge \ -p '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "hybridOverlayConfig":{ "hybridClusterNetwork":[ { "cidr": "<cidr>", "hostPrefix": <prefix> } ], "hybridOverlayVXLANPort": <overlay_port> } } } } }'ここでは、以下のようになります。
cidr- 追加のオーバーレイネットワーク上のノードに使用される CIDR 設定を指定します。この CIDR は、クラスターネットワーク CIDR と重複させることはできません。
hostPrefix-
それぞれの個別ノードに割り当てるサブネット接頭辞の長さを指定します。たとえば、
hostPrefixが23に設定されている場合、各ノードに指定のcidrから/23サブネットが割り当てられます。これにより、510 (2^(32 - 23) - 2) Pod IP アドレスが許可されます。外部ネットワークからのノードへのアクセスを提供する必要がある場合には、ロードバランサーおよびルーターを、トラフィックを管理するように設定します。 hybridOverlayVXLANPort-
追加のオーバーレイネットワークのカスタム VXLAN ポートを指定します。これは、vSphere にインストールされたクラスターで Windows ノードを実行するために必要であり、その他のクラウドプロバイダー用に設定することはできません。カスタムポートには、デフォルトの
6081ポートを除くいずれかのオープンポートを使用できます。この要件の詳細は、Microsoft ドキュメントの Pod-to-pod connectivity between hosts is broken を参照してください。
注記Windows Server Long-Term Servicing Channel (LTSC): Windows Server 2019 は、カスタムの VXLAN ポートの選択をサポートしないため、カスタムの
hybridOverlayVXLANPort値を持つクラスターではサポートされません。出力例
network.operator.openshift.io/cluster patched設定がアクティブであることを確認するには、以下のコマンドを入力します。更新が適用されるまでに数分の時間がかかることがあります。
$ oc get network.operator.openshift.io -o jsonpath="{.items[0].spec.defaultNetwork.ovnKubernetesConfig}"
Legal Notice
リンクのコピーリンクがクリップボードにコピーされました!
Copyright © Red Hat
OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).
Modified versions must remove all Red Hat trademarks.
Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of the OpenJS Foundation.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.