tcpserver と netcat を使用して Kubernetes ポッドまたはコンテナーでトンネルを開く方法

ノート。 翻訳。: LayerCI の作成者によるこの実用的なメモは、Kubernetes (だけではありません) のいわゆるヒントとテクニックをわかりやすく説明しています。 ここで提案されている解決策は数​​少ない解決策の 8 つにすぎず、おそらく最も明白ではありません (場合によっては、コメントで既に言及されている KXNUMX の「ネイティブ」解決策が適している可能性があります) kubectl port-forward)。 ただし、これにより、少なくとも、古典的なユーティリティを使用し、それらをさらに組み合わせるという観点から問題を見ることができます。同時に、シンプルで柔軟かつ強力です (インスピレーションについては、最後の「その他のアイデア」を参照してください)。

tcpserver と netcat を使用して Kubernetes ポッドまたはコンテナーでトンネルを開く方法

典型的な状況を想像してください。ローカル マシン上のポートから魔法のようにトラフィックをポッド/コンテナに転送したいとします (またはその逆)。

考えられる使用例

  1. HTTP エンドポイントが何を返すかを確認する /healthz 実稼働クラスター内のポッド。
  2. TCP デバッガーをローカル マシン上のポッドに接続します。
  3. 認証を気にせずに、ローカル データベース ツールから運用データベースにアクセスできます (通常、localhost には root 権限があります)。
  4. コンテナーを作成せずに、ステージング クラスター内のデータに対して XNUMX 回限りの移行スクリプトを実行します。
  5. VNC セッションを仮想デスクトップを実行しているポッドに接続します (XVFB を参照)。

必要なツールについて一言

TCPサーバー — ほとんどの Linux パッケージ リポジトリで利用できるオープン ソース ユーティリティ。 これにより、ローカル ポートを開いて、指定されたコマンドから stdin/stdout 経由で受信したトラフィックをそのポートにリダイレクトできます。

colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OKrnContent-Length: 19rnrn<body>hello!</body>'&
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>hello!</body>colin@colin-work:~$

(asciinema.org)

Netcat はその逆を行います。 これにより、開いているポートに接続し、そこから受信した I/O を stdin/stdout に渡すことができます。

colin@colin-work:~$ nc -C httpstat.us 80
GET /200 HTTP/1.0
Host: httpstat.us
HTTP/1.1 200 OK
Cache-Control: private
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.1
Access-Control-Allow-Origin: *
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=93fdbab9d364704de8ef77182b4d13811344b7dd1ec45d3a9682bbd6fa154ead;Path=/;HttpOnly;Domain=httpstat.us
Date: Fri, 01 Nov 2019 17:53:04 GMT
Connection: close
Content-Length: 0

^C
colin@colin-work:~$

(asciinema.org)

上の例では、netcat は HTTP 経由でページをリクエストします。 フラグ -C 行の末尾に CRLF を追加します。

kubectl との接続: ホストでリッスンし、ポッドに接続します。

上記のツールと kubectl を組み合わせると、次のようなコマンドが得られます。

tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080

類推すると、ポッド内のポート 80 にアクセスするには、次のことを行うだけで十分です。 curl "127.0.0.1:80":

colin@colin-work:~$ sanic kubectl exec -it web-54dfb667b6-28n85 bash
root@web-54dfb667b6-28n85:/web# apt-get -y install netcat-openbsd
Reading package lists... Done
Building dependency tree
Reading state information... Done
netcat-openbsd is already the newest version (1.195-2).
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
root@web-54dfb667b6-28n85:/web# exit
colin@colin-work:~$ tcpserver 127.0.0.1 8000 sanic kubectl exec -i web-54dfb667b6-28n85 nc 127.0.0.1 8080&
[1] 3232
colin@colin-work:~$ curl localhost:8000/healthz
{"status":"ok"}colin@colin-work:~$ exit

(asciinema.org)

tcpserver と netcat を使用して Kubernetes ポッドまたはコンテナーでトンネルを開く方法
ユーティリティ相互作用図

逆方向: ポッドでリッスンし、ホストに接続します。

nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat

このコマンドにより、ポッドがローカル マシンのポート 8000 にアクセスできるようになります。

Bash スクリプト

Kubernetes 運用クラスターを管理できるようにする Bash 用の特別なスクリプトを作成しました LayerCI上記の方法を使用して:

kubetunnel() {
    POD="$1"
    DESTPORT="$2"
    if [ -z "$POD" -o -z "$DESTPORT" ]; then
        echo "Usage: kubetunnel [pod name] [destination port]"
        return 1
    fi
    pkill -f 'tcpserver 127.0.0.1 6666'
    tcpserver 127.0.0.1 6666 kubectl exec -i "$POD" nc 127.0.0.1 "$DESTPORT"&
    echo "Connect to 127.0.0.1:6666 to access $POD:$DESTPORT"
}

この機能を追加すると、 ~/.bashrc、コマンドを使用してポッド内にトンネルを簡単に開くことができます。 kubetunnel web-pod 8080 そして、やります curl localhost:6666.

  • 中のトンネルについては、 デッカー 主行を次のように置き換えることができます。
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • トンネル内用 K3s - 次のように変更します。
    tcpserver 127.0.0.1 6666 k3s kubectl exec …

その他のアイデア

  • 次のコマンドを使用して UDP トラフィックをリダイレクトできます。 netcat -l -u -c 代わりに tcpserver и netcat -u 代わりに netcat それぞれ。
  • パイプ ビューア経由で I/O を表示します。

    nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat

  • 次を使用して、両端でトラフィックを圧縮および解凍できます。 gzip.
  • 対応するファイルを使用して SSH 経由で別のコンピュータに接続します kubeconfig:

    tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80"

  • 次を使用して、異なるクラスター内の XNUMX つのポッドを接続できます。 mkfifo XNUMX つの別々のコマンドを実行します kubectl.

可能性は無限大!

翻訳者からの追伸

私たちのブログもお読みください:

出所: habr.com

コメントを追加します