如何使用 Kubectl 埠轉發訪問遠程 Kubernetes 應用程序

帶有 Kubernetes 徽標的圖形

需要調試在 Kubernetes 集群中運行的應用程序? 埠轉發是一種連接到不可公開訪問的 Pod 的方法。 您可以使用此技術來檢查資料庫、監控工具和其他您希望在沒有公共路由的情況下在內部部署的應用程序。

埠轉發內置在 Kubectl 中。 CLI 可以啟動隧道會話,將本地埠上的流量重定向到 Kubernetes 集群中的 Pod。 這是設置它的方法。

埠轉發的工作原理

埠轉發是一種網路地址轉換 (NAT) 規則,可將流量從一個網路路由到另一個網路。 在 Kubernetes 的上下文中,看似被 localhost 終止的請求被重定向到集群的內部網路。

埠轉發僅在埠級別運行。 您將特定埠(如 33060)定向到目標網路中的目標埠(如 3306)。 當您將流量發送到本地埠 33060 時,它將自動轉發到遠程端的埠 3306。

此技術允許您訪問未由 NodePort、Ingress 或 LoadBalancer 公開的私有 Kubernetes 工作負載。 您可以將本地流量直接引導至集群,無需為內部工作負載創建 Kubernetes 服務。 這有助於減少您的攻擊面。

部署示例應用程序

現在讓我們看看 Kubernetes 埠轉發的實際應用。 首先創建一個基本部署,您將在下一節中使用埠轉發連接到該部署。

我們使用 MySQL 資料庫 Pod 作為您可能需要使用此技術的實際示例。 資料庫通常不會公開公開,因此 Kubernetes 管理員經常使用埠轉發來打開直接連接。

為您的部署創建一個 YAML 文件:

apiVersion:apps/v1 種類:部署元數據:名稱:mysql 規格:選擇器:matchLabels:app:mysql 模板:元數據:標籤:app:mysql 規格:容器:-圖像:mysql:8.0 名稱:mysql env:-名稱:MYSQL_ROOT_PASSWORD值:mysql

確保在生產中使用此清單之前更改 MYSQL_ROOT_PASSWORD 環境變數的值。 運行 kubectl apply 以創建您的 MySQL 部署:

$kubectl apply -f mysql.yaml deployment.apps/mysql created

接下來使用 get pods 命令檢查工作負載是否已成功啟動:

$kubectl get pods NAME READY STATUS RESTARTS AGE mysql-5f54dd5789-t5fzc 1/1 Running 0 2s Using Kubectl to Port Forward to Kubernetes

儘管 MySQL 現在在您的集群中運行,但您無法從外部訪問它。 接下來設置一個埠轉發會話,以便您可以使用本地安裝的工具(如 mysql CLI)連接到您的資料庫。

這是一個簡單的例子:

$kubectl port-forward deployment/mysql 33060:3306 Forwarding from 127.0.0.1:33060 -> 3306 Forwarding from [::1]:33060 -> 3306

到埠 33060 的連接將針對運行 MySQL 部署的 Pod 定向到埠 3306。 您現在可以在 Kubernetes 中啟動一個針對您的資料庫的 MySQL shell 會話:

$mysql –host 127.0.0.1 –port 33060 -u root -p 輸入密碼:歡迎使用 MySQL 監視器。 命令以 ; 結尾或\g。 您的 MySQL 連接 ID 是 10 伺服器版本:8.0.29 MySQL Community Server – GPL

在調試會話期間保持運行 kubectl port-forward 命令的 shell 窗口打開。 當您按下 Ctrl+C 或關閉窗口時,埠轉發將終止。

更改本地和遠程埠號

埠號綁定的語法是 local:remote。 上面顯示的 33060:3306 示例將 localhost 上的埠 33060 映射到目標 Pod 中的 3306。

只指定一個數字,不帶冒號,將把它解釋為本地和遠程埠:

$kubectl 埠轉發部署/mysql 3306

您可以將本地埠留空以自動分配隨機埠:

$kubectl port-forward deployment/mysql :3306 轉發自 127.0.0.1:34923 -> 3306 轉發自 [::1]:34923 -> 3306

在這裡,您將在本地 MySQL 客戶端中使用隨機生成的埠號 34923。

更改收聽地址

Kubectl 默認將本地埠綁定在 127.0.0.1 (IPv4) 和 ::1 (IPv6) 地址上。 您可以通過在運行 port-forward 命令時提供 –address 標誌來指定自己的 IP 集:

# 監聽兩個 IPv4 地址 $kubectl port-forward deployment/mysql :3306 –address 127.0.0.1,192.168.0.1

該標誌只接受 IP 地址和 localhost 關鍵字。 後者被解釋為包括 127.0.0.1 和 ::1,當 –address 被省略時匹配命令的默認值。

概括

埠轉發是訪問 Kubernetes 集群內的私有應用程序的有用技術。 Kubectl 將流量從本地網路傳輸到特定 Pod 上的特定埠。 它是一種相對底層的機制,可以處理任何 TCP 連接。 尚不支持 UDP 埠轉發。

使用 ad-hoc 埠轉發會話是一種安全的方式來調試不需要暴露在外部的工作負載。 為每個新部署創建服務可能允許入侵者和攻擊者發現本應受到保護的端點。 Kubectl 中的埠轉發讓您可以安全地直接連接到您的應用程序,而無需確定它們在哪些節點上運行。

資訊來源:由0x資訊編譯自HOWTOGEEK。版權歸作者James Walker所有,未經許可,不得轉載
提示:投資有風險,入市需謹慎,本資訊不作為投資理財建議。請理性投資,切實提高風險防範意識;如有發現的違法犯罪線索,可積極向有關部門舉報反映。
你可能還喜歡