Kubernetes 使用端口轉(zhuǎn)發(fā)來訪問集群中的應(yīng)用

2022-06-15 11:11 更新

使用端口轉(zhuǎn)發(fā)來訪問集群中的應(yīng)用

本文展示如何使用 ?kubectl port-forward? 連接到在 Kubernetes 集群中 運(yùn)行的 MongoDB 服務(wù)。這種類型的連接對數(shù)據(jù)庫調(diào)試很有用。

在開始之前

  • 你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:
    • Katacoda
    • 玩轉(zhuǎn) Kubernetes

    要獲知版本信息,請輸入 ?kubectl version?。

創(chuàng)建 MongoDB deployment 和服務(wù)

  1. 創(chuàng)建一個(gè)運(yùn)行 MongoDB 的 deployment:
  2. kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-deployment.yaml
    

    成功執(zhí)行的命令的輸出可以證明創(chuàng)建了 Deployment:

    deployment.apps/mongo created
    

    查看 pod 狀態(tài),檢查其是否準(zhǔn)備就緒:

    kubectl get pods
    

    輸出顯示創(chuàng)建的 pod:

    NAME                     READY   STATUS    RESTARTS   AGE
    mongo-75f59d57f4-4nd6q   1/1     Running   0          2m4s

    查看 Deployment 狀態(tài):

    kubectl get deployment
    

    輸出顯示創(chuàng)建的 Deployment:

    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    mongo   1/1     1            1           2m21s

    該 Deployment 自動(dòng)管理一個(gè) ReplicaSet。查看該 ReplicaSet 的狀態(tài):

    kubectl get replicaset
    

    輸出顯示 ReplicaSet 已被創(chuàng)建:

    NAME               DESIRED   CURRENT   READY   AGE
    mongo-75f59d57f4   1         1         1       3m12s
  3. 創(chuàng)建一個(gè)在網(wǎng)絡(luò)上公開的 MongoDB 服務(wù):
  4. kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-service.yaml
    

    成功執(zhí)行的命令的輸出可以證明 Service 已經(jīng)被創(chuàng)建:

    service/mongo created
    

    檢查所創(chuàng)建的 Service:

    kubectl get service mongo
    

    輸出顯示已被創(chuàng)建的 Service:

    NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
    mongo   ClusterIP   10.96.41.183   <none>        27017/TCP   11s
  5. 驗(yàn)證 MongoDB 服務(wù)是否運(yùn)行在 Pod 中并且在 27017 端口上監(jiān)聽:
  6. # 將 mongo-75f59d57f4-4nd6q 改為 Pod 的名稱
    kubectl get pod mongo-75f59d57f4-4nd6q --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'

    輸出應(yīng)該顯示對應(yīng) Pod 中 MongoDB 的端口:

    27017
    

    27017 是分配給 MongoDB 的互聯(lián)網(wǎng) TCP 端口。

轉(zhuǎn)發(fā)一個(gè)本地端口到 Pod 端口

  1. ?kubectl port-forward? 允許使用資源名稱 (例如 pod 名稱)來選擇匹配的 pod 來進(jìn)行端口轉(zhuǎn)發(fā)。
  2. # 將 mongo-75f59d57f4-4nd6q 改為 Pod 的名稱
    kubectl port-forward mongo-75f59d57f4-4nd6q 28015:27017

    這相當(dāng)于

    kubectl port-forward pods/mongo-75f59d57f4-4nd6q 28015:27017
    

    或者

    kubectl port-forward deployment/mongo 28015:27017
    

    或者

    kubectl port-forward replicaset/mongo-75f59d57f4 28015:27017
    

    或者

    kubectl port-forward service/mongo 28015:27017
    

    以上所有命令都有效。輸出類似于:

    Forwarding from 127.0.0.1:28015 -> 27017
    Forwarding from [::1]:28015 -> 27017
    說明:
    ?kubectl port-forward? 不會返回。你需要打開另一個(gè)終端來繼續(xù)這個(gè)練習(xí)。
  3. 啟動(dòng) MongoDB 命令行接口:
  4. mongosh --port 28015
    
  5. 在 MongoDB 命令行提示符下,輸入 ?ping ?命令:
  6. db.runCommand( { ping: 1 } )
    

    成功的 ping 請求應(yīng)該返回:

    { ok: 1 }
    

(可選操作)讓 kubectl 來選擇本地端口

如果你不需要指定特定的本地端口,你可以讓 ?kubectl ?來選擇和分配本地端口, 這樣你就不需要管理本地端口沖突。該命令使用稍微不同的語法:

kubectl port-forward deployment/mongo :27017

?kubectl ?工具會找到一個(gè)未被使用的本地端口號(避免使用低段位的端口號, 因?yàn)樗麄兛赡軙黄渌麘?yīng)用程序使用)。輸出類似于:

Forwarding from 127.0.0.1:63753 -> 27017
Forwarding from [::1]:63753 -> 27017

討論 

與本地 28015 端口建立的連接將被轉(zhuǎn)發(fā)到運(yùn)行 MongoDB 服務(wù)器的 Pod 的 27017 端口。 通過此連接,你可以使用本地工作站來調(diào)試在 Pod 中運(yùn)行的數(shù)據(jù)庫。

說明:
?kubectl port-forward? 僅實(shí)現(xiàn)了 TCP 端口 支持。 在 issue 47862 中跟蹤了對 UDP 協(xié)議的支持。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號