如何使用 tcpserver 和 netcat 在 Kubernetes Pod 或容器中開啟隧道

筆記。 翻譯。:LayerCI 創作者的這篇實用說明很好地說明了 Kubernetes(以及更多)的所謂提示和技巧。 這裡提出的解決方案只是少數幾個,也許不是最明顯的(對於某些情況,評論中已經提到的 K8s 的「原生」解決方案可能是合適的) kubectl port-forward)。 然而,它至少可以讓你從使用經典實用程式並進一步結合它們的角度來看待問題——同時簡單、靈活和強大(請參閱最後的「其他想法」以獲得靈感)。

如何使用 tcpserver 和 netcat 在 Kubernetes Pod 或容器中開啟隧道

想像一個典型的情況:您希望本機電腦上的連接埠能夠神奇地將流量轉送到 Pod/容器(反之亦然)。

可能的用例

  1. 檢查 HTTP 端點傳回的內容 /healthz 生產集群中的 pod。
  2. 將 TCP 偵錯器連接到本機上的 pod。
  3. 從本機資料庫工具存取生產資料庫,而無需費心進行身份驗證(通常 localhost 具有 root 權限)。
  4. 為臨時叢集中的資料執行一次性遷移腳本,而無需為其建立容器。
  5. 將 VNC 會話連接到執行虛擬桌面的 Pod(請參閱 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 連線:在主機上監聽並連線到 pod

如果我們將上述工具與 kubectl 結合起來,我們會得到以下命令:

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

以此類推,要存取 pod 內的連接埠 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 Pod 或容器中開啟隧道
實用程式互動圖

相反方向:在 pod 中監聽並連接到主機

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

此指令允許 pod 存取本機的 8000 連接埠。

bash腳本

我為 Bash 編寫了一個特殊的腳本,讓您可以管理 Kubernetes 生產集群 層CI使用上述方法:

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,您可以使用以下命令輕鬆地在 Pod 中開啟隧道 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"

  • 您可以使用以下命令連接不同集群中的兩個 Pod mkfifo 並運行兩個單獨的命令 kubectl.

可能性是無止境!

譯者PS

另請閱讀我們的博客:

來源: www.habr.com

添加評論