本页面展示如何使用 kubectl port-forward 连接到运行在 Kubernetes 集群中的 MongoDB 服务器。这种连接方式对于数据库调试非常有用。
你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。
您的 Kubernetes 服务器版本必须在 v1.10 或更高版本。要检查版本,请输入 kubectl version。
创建一个运行 MongoDB 的 Deployment
kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-deployment.yaml
成功执行该命令的输出验证了部署已创建
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
创建一个 Service 以在网络上公开 MongoDB
kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-service.yaml
成功执行该命令的输出验证了 Service 已创建
service/mongo created
检查创建的 Service
kubectl get service mongo
输出显示了已创建的服务
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mongo ClusterIP 10.96.41.183 <none> 27017/TCP 11s
验证 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 端口。
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
kubectl port-forward 不会返回。要继续进行练习,您需要打开另一个终端。启动 MongoDB 命令行界面
mongosh --port 28015
在 MongoDB 命令行提示符下,输入 ping 命令
db.runCommand( { ping: 1 } )
成功的 ping 请求返回:
{ ok: 1 }
如果您不需要特定的本地端口,可以让 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 的信息。