如何使用Compass连接Kubernetes中的MongoDB副本集?

3

我使用Bitnami的Helm图表在我的K8s集群上安装了3副本的MongoDB副本集。

这样我就得到了以下这些Pod:

mongodb-0.mongodb-headless.mongodb.svc.cluster.local:27017
mongodb-1.mongodb-headless.mongodb.svc.cluster.local:27017
mongodb-2.mongodb-headless.mongodb.svc.cluster.local:27017

现在我想使用Mongodb Compass获取访问权限。 我设置了端口转发(在27017上运行本地mongodb)。
kubectl port-forward svc/mongodb-headless -n mongodb 27018:27017

并尝试将指南针与URI连接

mongodb://localhost:27018

但是这会导致我出现错误

getaddrinfo ENOTFOUND mongodb-0.mongodb-headless.mongodb.svc.cluster.local

我在使用Compass连接我的k8s集群的mongodb时出了什么问题?


更新

% kubectl get all -n mongodb

NAME                    READY   STATUS    RESTARTS   AGE
pod/mongodb-0           1/1     Running   0          25h
pod/mongodb-1           1/1     Running   0          25h
pod/mongodb-2           1/1     Running   0          25h
pod/mongodb-arbiter-0   1/1     Running   0          2d14h

NAME                               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
service/mongodb-arbiter-headless   ClusterIP   None         <none>        27017/TCP   2d14h
service/mongodb-headless           ClusterIP   None         <none>        27017/TCP   2d14h

NAME                               READY   AGE
statefulset.apps/mongodb           3/3     2d14h
statefulset.apps/mongodb-arbiter   1/1     2d14h

Bitnami Helm Chart 的 values.yaml

image:
  registry: docker.io
  repository: bitnami/mongodb
  digest: "sha256:916202d7af766dd88c2fff63bf711162c9d708ac7a3ffccd2aa812e3f03ae209" # tag: 4.4.15
  pullPolicy: IfNotPresent
architecture: replicaset
replicaCount: 2
updateStrategy:
  type: RollingUpdate
containerPorts:
  mongodb: 27017
auth:
  enabled: true
  rootUser: root
  rootPassword: "password"
  usernames: ["user"]
  passwords: ["userpass"]
  databases: ["db"]

service:
  portName: mongodb
  ports:
    mongodb: 27017

persistence:
  enabled: true
  accessModes:
    - ReadWriteOnce
  size: 8Gi

volumePermissions:
  enabled: true

livenessProbe:
  enabled: false
readinessProbe:
  enabled: false

请提供您的ns的所有输出,即kubectl get all 此外,展示svc YAML也是有用的。 - Konstantin Vustin
@KonstantinVustin 我已经将结果添加到帖子中。 - user3142695
端口转发在Mongo CLI命令行中工作。 - Mr_Thorynque
4个回答

2

我刚刚重新创建了你的设置,一切都正常工作。

$ k create ns mongo-test
namespace/mongo-test created

$ k -n mongo-test create -f mongo-svc-sts.yaml
statefulset.apps/mongo created
service/mongo-headless created

结果

$ k -n mongo-test get all
NAME          READY   STATUS    RESTARTS   AGE
pod/mongo-0   1/1     Running   0          44s
pod/mongo-1   1/1     Running   0          40s
pod/mongo-2   1/1     Running   0          27s

NAME                     TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
service/mongo-headless   ClusterIP   None         <none>        27017/TCP   13m

NAME                     READY   AGE
statefulset.apps/mongo   3/3     45s

端口转发
$ k -n mongo-test port-forward svc/mongo-headless 27018:27017
Forwarding from 127.0.0.1:27018 -> 27017
Forwarding from [::1]:27018 -> 27017
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018
Handling connection for 27018

compass enter image description here

mongo-svc-sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
spec:
  serviceName: "mongo"
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: mongo
      app.kubernetes.io/component: backend
  template:
    metadata:
      labels:
        app.kubernetes.io/name: mongo
        app.kubernetes.io/component: backend
    spec:
      tolerations:
        - operator: Exists
      containers:
      - name: mongo
        image: mongo:latest
        args:
          - --bind_ip
          - 0.0.0.0
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 27017
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: mongo
    service: logging
  name: mongo-headless
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - port: 27017
  selector:
    app.kubernetes.io/name: mongo
    app.kubernetes.io/component: backend

为了能够帮助您,请使用YAML并发布输出。如果不起作用,您应该调试k8s安装。


architecture: replicaset是错误的吗?我已经在我的帖子中添加了helm chart的values.yaml文件。 - user3142695
调试Helm图表参数不是一个话题,对吧? - Konstantin Vustin

1

它可以使用端口转发和指南针进行一些配置,并使用高级选项的直接连接功能: enter image description here 不要添加复制集选项。


它差不多可以工作了。我可以连接,但是我会收到“加载实例信息时发生错误:命令hostInfo需要身份验证”的错误。所以我只需要使用一个节点吗?不需要全部三个节点吗? - user3142695
如果您在Mongo连接字符串中使用标准配置,则可能需要添加/admin?authSource=admin。 - Mr_Thorynque
还应在高级选项卡中设置副本集名称。 - Gentle Song

0

您可以为任务创建3个节点端口服务,例如暴露mongodb-0 pod:

kind: Service 
apiVersion: v1 
metadata:
  name: mongodb-0
spec:
  type: NodePort
  selector:
    statefulset.kubernetes.io/pod-name: mongodb-0
  ports:
    - nodePort: 30117
      port: 27017
      targetPort: 27017
      protocol: TCP

您可以通过以下方式,使用 k8s 工作节点暴露的 nodePort 连接到 COMPASS:

  connect: mongodb://workernode:30117

假设您已经创建了3个NodePort -> 30117、30118、30119,用于三个Pod,并且您的Bitnami Helm Chart正在使用StatefulSet来管理这些Pod,因此Pod的名称为:mongodb-0、1、2。

1
它是否有效? - Alex Blex
工作节点是否等于mongodb-0.mongodb-headless.mongodb.svc.cluster.local? - user3142695

0
据我所知(并且我使用的方式),使用端口转发无法连接Mongo副本集和Compass(您不能多次使用本地端口...)
对我来说,这是因为Compass使用了副本集使用的拓扑结构。因此,您需要从客户端计算机遵守该拓扑结构。
因此,您可以使用Cluster IP公开Mongo Pod,管理您的主机文件以匹配Kubernetes节点。
并且像在Kubernetes中一样使用标准连接字符串: enter image description here 更新: 您可以配置Mongo Helm以进行集群https://artifacthub.io/packages/helm/bitnami/mongodb enter image description here 您的主机文件如下: external_IP1 mongodb-0.mongodb-headless.mongodb.svc.cluster.local

external_IP2 mongodb-1.mongodb-headless.mongodb.svc.cluster.local

外部IP2 mongodb-1.mongodb-headless.mongodb.svc.cluster.local


请问您能否解释一下...使用Cluster IP公开Mongo Pod,管理您的主机文件以匹配Kubernetes节点。的含义? - user3142695

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接