7.8. コンテナー内のアプリケーションにアクセスするためのポート転送の使用
OpenShift Container Platform は、Pod へのポート転送をサポートします。
7.8.1. ポート転送について
CLI を使用して 1 つ以上のローカルポートを Pod に転送できます。これにより、指定されたポートまたはランダムのポートでローカルにリッスンでき、Pod の所定ポートへ/からデータを転送できます。
ポート転送のサポートは、CLI に組み込まれています。
$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]
CLI はユーザーによって指定されたそれぞれのローカルポートでリッスンし、以下で説明されているプロトコルで転送を実行します。
ポートは以下の形式を使用して指定できます。
| クライアントはポート 5000 でローカルにリッスンし、Pod の 5000 に転送します。 |
| クライアントはポート 6000 でローカルにリッスンし、Pod の 5000 に転送します。 |
| クライアントは空きのローカルポートを選択し、Pod の 5000 に転送します。 |
OpenShift Container Platform は、クライアントからのポート転送要求を処理します。要求を受信すると、OpenShift Container Platform は応答をアップグレードし、クライアントがポート転送ストリームを作成するまで待機します。OpenShift Container Platform が新規ストリームを受信したら、ストリームと Pod のポート間でデータをコピーします。
アーキテクチャーの観点では、Pod のポートに転送するためのいくつかのオプションがあります。サポートされている OpenShift Container Platform 実装はノードホストで直接 nsenter
を直接呼び出して、Pod ネットワークの namespace に入ってから、socat
を呼び出してストリームと Pod のポート間でデータをコピーします。ただし、カスタムの実装には、nsenter
および socat
を実行する helper Pod の実行を含めることができ、その場合は、それらのバイナリーをホストにインストールする必要はありません。
7.8.2. ポート転送の使用
CLI を使用して、1 つ以上のローカルポートの Pod へのポート転送を実行できます。
手順
以下のコマンドを使用して、Pod 内の指定されたポートでリッスンします。
$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]
以下に例を示します。
以下のコマンドを使用して、ポート
5000
および6000
でローカルにリッスンし、Pod のポート5000
および6000
との間でデータを転送します。$ oc port-forward <pod> 5000 6000
出力例
Forwarding from 127.0.0.1:5000 -> 5000 Forwarding from [::1]:5000 -> 5000 Forwarding from 127.0.0.1:6000 -> 6000 Forwarding from [::1]:6000 -> 6000
以下のコマンドを使用して、ポート
8888
でローカルにリッスンし、Pod の5000
に転送します。$ oc port-forward <pod> 8888:5000
出力例
Forwarding from 127.0.0.1:8888 -> 5000 Forwarding from [::1]:8888 -> 5000
以下のコマンドを使用して、空きポートでローカルにリッスンし、Pod の
5000
に転送します。$ oc port-forward <pod> :5000
出力例
Forwarding from 127.0.0.1:42390 -> 5000 Forwarding from [::1]:42390 -> 5000
または、以下を実行します。
$ oc port-forward <pod> 0:5000
7.8.3. クライアントからのポート転送を開始するためのプロトコル
クライアントは Kubernetes API サーバーに対して要求を実行して Pod へのポート転送を実行します。
/proxy/nodes/<node_name>/portForward/<namespace>/<pod>
上記の URL には以下が含まれます。
-
<node_name>
はノードの FQDN です。 -
<namespace>
はターゲット Pod の namespace です。 -
<pod>
はターゲット Pod の名前です。
以下に例を示します。
/proxy/nodes/node123.openshift.com/portForward/myns/mypod
ポート転送要求を API サーバーに送信した後に、クライアントは多重化ストリームをサポートするものに接続をアップグレードします。現在の実装では Hyptertext Transfer Protocol Version 2 (HTTP/2) を使用しています。
クライアントは Pod のターゲットポートを含む port
ヘッダーでストリームを作成します。ストリームに書き込まれるすべてのデータは kubelet 経由でターゲット Pod およびポートに送信されます。同様に、転送された接続で Pod から送信されるすべてのデータはクライアントの同じストリームに送信されます。
クライアントは、ポート転送要求が終了するとすべてのストリーム、アップグレードされた接続および基礎となる接続を閉じます。