使用埠轉發訪問叢集中的應用程式

本頁展示瞭如何使用 kubectl port-forward 連線到在 Kubernetes 叢集中執行的 MongoDB 伺服器。這類連線對於資料庫除錯很有用。

準備工作

  • 你必須擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具必須配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 遊樂場之一

    你的 Kubernetes 伺服器版本必須是 v1.10 或更高。

    要檢查版本,請輸入 kubectl version

  • 安裝 MongoDB Shell

建立 MongoDB Deployment 和 Service

  1. 建立執行 MongoDB 的 Deployment

    kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-deployment.yaml
    

    成功命令的輸出會驗證 Deployment 已建立

    deployment.apps/mongo created
    

    檢視 Pod 狀態以檢查它是否就緒

    kubectl get pods
    

    輸出顯示了已建立的 Pod

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

    檢視 Deployment 的狀態

    kubectl get deployment
    

    輸出顯示 Deployment 已建立

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

    Deployment 自動管理 ReplicaSet。使用以下命令檢視 ReplicaSet 狀態:

    kubectl get replicaset
    

    輸出顯示 ReplicaSet 已建立

    NAME               DESIRED   CURRENT   READY   AGE
    mongo-75f59d57f4   1         1         1       3m12s
    
  2. 建立一個 Service 以在網路上暴露 MongoDB

    kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-service.yaml
    

    成功命令的輸出會驗證 Service 已建立

    service/mongo created
    

    檢查已建立的 Service

    kubectl get service mongo
    

    輸出顯示已建立的 Service

    NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
    mongo   ClusterIP   10.96.41.183   <none>        27017/TCP   11s
    
  3. 驗證 MongoDB 伺服器是否在 Pod 中執行,並在 27017 埠上監聽

    # Change mongo-75f59d57f4-4nd6q to the name of the Pod
    kubectl get pod mongo-75f59d57f4-4nd6q --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    

    輸出顯示了該 Pod 中 MongoDB 的埠

    27017
    

    27017 是 MongoDB 的官方 TCP 埠。

將本地埠轉發到 Pod 上的埠

  1. kubectl port-forward 允許使用資源名稱(例如 Pod 名稱)選擇匹配的 Pod 進行埠轉發。

    # Change mongo-75f59d57f4-4nd6q to the name of the Pod
    kubectl port-forward mongo-75f59d57f4-4nd6q 28015:27017
    

    這與以下命令相同

    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
    
  2. 啟動 MongoDB 命令列介面

    mongosh --port 28015
    
  3. 在 MongoDB 命令列提示符下,輸入 ping 命令

    db.runCommand( { ping: 1 } )
    

    成功的 ping 請求會返回

    { ok: 1 }
    

(可選)讓 kubectl 選擇本地埠

如果你不需要特定的本地埠,可以允許 kubectl 選擇並分配本地埠,從而免去你管理本地埠衝突的麻煩,使用稍微簡單一點的語法:

kubectl port-forward deployment/mongo :27017

kubectl 工具會找到一個未被使用的本地埠號(避免低埠號,因為這些埠可能被其他應用程式使用)。輸出類似於:

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

討論

連線到本地埠 28015 的流量將被轉發到執行 MongoDB 伺服器的 Pod 的 27017 埠。建立此連線後,你可以使用本地工作站除錯在 Pod 中執行的資料庫。

下一步

瞭解更多關於 kubectl port-forward 的資訊。

最後修改於 2024 年 2 月 26 日太平洋標準時間下午 4:59:在文件中闡明 27017 是 MongoDB 的官方 TCP 埠 (ea6624ee62)