我通过 Helm 包在 Kubernetes 集群中部署了多个 MongoDB 实例。 它们作为服务在 NodePort 中运行。
如何通过 MongoDB Compass 和 RoboMongo 等 UI 工具从集群外部连接到这些 MongoDB 实例?
您可以使用
kubectl port-forward
从集群外部连接到 MongoDB。
运行
kubectl port-forward name-of-a-mongodb-pod --namespace mongodb-namespace 27017:27017
。
现在将您的 UI 工具指向
localhost:27017
,kubectl
会将所有连接转发到集群内的 Pod/服务。
从 Kubernetes 1.10+ 开始,您还可以使用此语法连接到服务(不必先找到 pod 名称):
kubectl port-forward svc/mongodb-service-name 27017:27017 --namespace mongodb-namespace
示例:
如果您的连接字符串如下所示:
mongodb://username:[email protected]:27017,mongodb-1.mongodb-svc.mongodb.svc.cluster.local:27017,mongodb-2.mongodb-svc.mongodb.svc.cluster.local:27017/admin?replicaSet=mongodb&ssl=false
127.0.0.1 mongodb-0.mongodb-svc.mongodb.svc.cluster.local
127.0.0.1 mongodb-1.mongodb-svc.mongodb.svc.cluster.local
127.0.0.1 mongodb-2.mongodb-svc.mongodb.svc.cluster.local
mongodb://username:[email protected]:27017,mongodb-1.mongodb-svc.mongodb.svc.cluster.local:27017,mongodb-2.mongodb-svc.mongodb.svc.cluster.local:27017/admin?replicaSet=mongodb&ssl=false
获取与 MongoDB 关联的服务:
kubectl get services -n <namespace>
端口转发使用:
kubectl port-forward service/<service_name> -n <namespace> 27018:27017
在
localhost:27018
上打开 Robomongo。
如果它不是您的生产数据库,您可以通过 NodePort 服务公开它:
# find mongo pod name
kubectl get pods
kubectl expose pod <<pod name>> --type=NodePort
# find new mongo service
kubectl get services
最后一个命令将输出类似的内容
mongodb-0 10.0.0.45 <nodes> 27017:32151/TCP 30s
现在您可以使用
mongo <<node-ip>>:32151
访问您的 mongo 实例
如果未解决,请将您的 mongo 工作负载公开为负载均衡器并使用该服务提供的 IP 地址。复制LB IP地址并在robo3T中使用相同的IP地址。如果需要身份验证,请检查下面我的 YAML 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb
labels:
app: mongodb
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo
volumeMounts:
- name: data
mountPath: "/data/db"
subPath: "mongodb_data"
ports:
- containerPort: 27017
protocol: TCP
env:
- name: MONGO_INITDB_ROOT_USERNAME
value: xxxx
- name: MONGO_INITDB_ROOT_PASSWORD
value: xxxx
imagePullSecrets:
- name: xxxx
volumes:
- name: data
persistentVolumeClaim:
claimName: xxx
在 ROBO3T 的身份验证选项卡中设置相同的值
注意: 我没有在 YAML 中提到服务部分,因为我直接在 GCP UI 本身中公开为 LB。