当前位置: 首页 > 知识库问答 >
问题:

如何从另一个集群 Pod 连接 kubernetes 集群上的 mongo 副本集

颜奇希
2023-03-14

我有一个在kubernetes集群(在AWS EKS上)上运行的mongo db副本集,比如集群-1。这在具有cidr的VPC-1中运行192.174.0.0/16.

我在一个单独的VPC中有另一个集群,比如VPC-2,在那里我将在mongo集群之上运行一些应用程序。该VPC cidr范围为192.176.0.0/16。所有VPC对等和安全组入口/出口规则都正常工作,我能够跨两个VPC ping集群节点。

我正在为mongo集群使用NodePort类型服务和StatefulSet:

apiVersion: v1
kind: Service
metadata:
  name: mongodb-service
  labels:
    name: mongodb
spec:
  selector:
    role: mongo
  type: NodePort
  ports:
  - port: 26017
    targetPort: 27017
    nodePort: 30017

这是节点

ubuntu@ip-192-174-5-253:/st_config/kubeobj$ kubectl get nodes -o wide
NAME                                             STATUS   ROLES    AGE   VERSION              INTERNAL-IP       EXTERNAL-IP      OS-IMAGE         KERNEL-VERSION                  CONTAINER-RUNTIME
ip-192-174-187-133.ap-south-1.compute.internal   Ready    <none>   19h   v1.16.8-eks-e16311   192.174.187.133   13.232.195.39    Amazon Linux 2   4.14.181-140.257.amzn2.x86_64   docker://19.3.6
ip-192-174-23-229.ap-south-1.compute.internal    Ready    <none>   19h   v1.16.8-eks-e16311   192.174.23.229    13.234.111.139   Amazon Linux 2   4.14.181-140.257.amzn2.x86_64   docker://19.3.6
ubuntu@ip-192-174-5-253:/st_config/kubeobj$


ubuntu@ip-192-174-5-253:/st_config/kubeobj$ kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP                NODE                                             NOMINATED NODE   READINESS GATES
mongod-0   1/1     Running   0          45m   192.174.8.10      ip-192-174-23-229.ap-south-1.compute.internal    <none>           <none>
mongod-1   1/1     Running   0          44m   192.174.133.136   ip-192-174-187-133.ap-south-1.compute.internal   <none>           <none>
ubuntu@ip-192-174-5-253:/st_config/kubeobj$

如果我尝试使用特定的节点地址或两个节点地址进行连接,kubernetes可能会以轮循机制方式进行负载平衡或旋转连接:

ubuntu@ip-192-176-42-206:~$ mongo mongodb://192.174.23.229:30017
MongoDB shell version v3.6.3
connecting to: mongodb://192.174.23.229:30017
MongoDB server version: 3.4.24
WARNING: shell and server versions do not match
test_rs0:PRIMARY>

ubuntu@ip-192-176-42-206:~$ mongo mongodb://192.174.23.229:30017
MongoDB shell version v3.6.3
connecting to: mongodb://192.174.23.229:30017
MongoDB server version: 3.4.24
WARNING: shell and server versions do not match
test_rs0:SECONDARY>

ubuntu@ip-192-176-42-206:~$ mongo mongodb://192.174.23.229:30017,192.174.187.133:30017
MongoDB shell version v3.6.3
connecting to: mongodb://192.174.23.229:30017,192.174.187.133:30017
MongoDB server version: 3.4.24
WARNING: shell and server versions do not match
test_rs0:PRIMARY>

我希望利用副本集功能。因此,当我使用连接字符串作为 - mongodb://192.174.23.229:30017,192.174.187.133:30017/?replicaSet=test_rs0时,它实际上正在获取 Pod 的 FQDN,这些 Pod 的 FQDN 不是从 VPC-2 中的 cluster-2 节点/pod 中的节点解析的。

ubuntu@ip-192-176-42-206:~$ mongo mongodb://192.174.23.229:30017,192.174.187.133:30017/?replicaSet=test_rs0
MongoDB shell version v3.6.3
connecting to: mongodb://192.174.23.229:30017,192.174.187.133:30017/?replicaSet=test_rs0
2020-06-23T15:59:07.407+0000 I NETWORK  [thread1] Starting new replica set monitor for test_rs0/192.174.23.229:30017,192.174.187.133:30017
2020-06-23T15:59:07.409+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor-0] Successfully connected to 192.174.23.229:30017 (1 connections now open to 192.174.23.229:30017 with a 5 second timeout)
2020-06-23T15:59:07.409+0000 I NETWORK  [thread1] Successfully connected to 192.174.187.133:30017 (1 connections now open to 192.174.187.133:30017 with a 5 second timeout)
2020-06-23T15:59:07.410+0000 I NETWORK  [thread1] changing hosts to test_rs0/mongod-0.mongodb-service.default.svc.cluster.local:27017,mongod-1.mongodb-service.default.svc.cluster.local:27017 from test_rs0/192.174.187.133:30017,192.174.23.229:30017
2020-06-23T15:59:07.415+0000 I NETWORK  [thread1] getaddrinfo("mongod-1.mongodb-service.default.svc.cluster.local") failed: Name or service not known
2020-06-23T15:59:07.415+0000 I NETWORK  [ReplicaSetMonitor-TaskExecutor-0] getaddrinfo("mongod-0.mongodb-service.default.svc.cluster.local") failed: Name or service not known
2020-06-23T15:59:07.917+0000 I NETWORK  [thread1] getaddrinfo("mongod-0.mongodb-service.default.svc.cluster.local") failed: Name or service not known
2020-06-23T15:59:07.918+0000 I NETWORK  [thread1] getaddrinfo("mongod-1.mongodb-service.default.svc.cluster.local") failed: Name or service not known
2020-06-23T15:59:07.918+0000 W NETWORK  [thread1] Unable to reach primary for set test_rs0
2020-06-23T15:59:07.918+0000 I NETWORK  [thread1] Cannot reach any nodes for set test_rs0. Please check network connectivity and the status of the set. This has happened for 1 checks in a row.

我是否需要一些额外的DNS服务,以便在VPC-2节点中解析域名?最好的方法是什么?

此外,如何使用连接字符串可以基于服务名,例如MongoDB://MongoDB-service . default . SVC . cluster . local:/?VPC-2中任意节点的replicaSet=test_rs0?它可以在VPC一号的任何一个舱里工作。但是我需要在VPC-2集群中的pod上实现这一点,这样我就不必在连接字符串中指定特定的pod/节点IP。我所有的kubernetes对象都在默认名称空间中。

非常感谢这里的一些帮助。**请注意:我不使用头盔**

共有1个答案

倪德业
2023-03-14

库伯内特斯有核心连接到每个pod。如果我没有错,你使用Stateful Set部署。

连接您的mongo集群的最佳方法是使用ClusterIP相互通信。

如果你在mongo中使用相同的命名空间,你可以连接使用:mongod-0.app_name:27017,mongod-1.app_name:27017

对于您的每个应用程序

注意:app_name=monmaster

以下是一些例子:

apiVersion: v1
kind: Service
metadata:
  namespace: mongo-cluster
  name: mongo
  labels:
    app: mongo
    name: mongo
spec:
  type: ClusterIP
  ports:
  - port: 27017
    targetPort: 27017
  selector:
    app: mongo
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: mongo-cluster
  name: mongo
spec:
  serviceName: "mongo"
  replicas: 3
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mongo
        image: mongo
        command:
          - "numactl"
          - "--interleave=all"
          - "mongod"
          - "--replSet"
          - "MainSetRep"
          - "--bind_ip"
          - "0.0.0.0"
          - "--auth"
          - "--clusterAuthMode" 
          - "keyFile" 
          - "--keyFile" 
          - "/etc/secrets-volume/mongodb-keyfile" 
          - "--setParameter" 
          - "authenticationMechanisms=SCRAM-SHA-1"
        ports:
          - containerPort: 27017
        volumeMounts:
          - name: data
            mountPath: /data/db
        volumeMounts:
          - name: mongo-key
            mountPath: "/etc/secrets-volume"
            readOnly: true
      volumes:
      - name: mongo-key
        secret:
          defaultMode: 0400
          secretName: mongo-key
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      storageClassName: openebs-hostpath
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20G
 类似资料:
  • 我在GKE负责詹金斯。构建的一个步骤是使用< code>kubectl部署另一个集群。我在jenkins容器中安装了gcloud-sdk。正在讨论的构建步骤是这样做的: 然而,我得到了这个错误(虽然它在本地正常工作): 注意:我注意到,在没有配置的情况下(~/.kube为空),我可以使用kubectl并访问pod当前运行的集群。我不知道它是如何做到的,它是否使用/var/run/secrets/k

  • 我已经使用以下指南成功地设置了一个密码保护的redis群集: 我使用ruby和下面的连接字符串…我做错了吗? 我得到的错误是:

  • 随着库伯内特斯集群的启动和运行,并且能够通过ssh键访问master并在那里运行kubectl命令;我想在我的本地机器上运行kubectl命令。所以我尝试按照kubectl配置设置配置: 激活上下文: 当我运行kubectl命令时: 它返回: 与服务器localhost:8080的连接被拒绝-是否指定了正确的主机或端口?

  • 我试图在我本地minikube集群上的一个简单示例中使用fabric8io/kubernetes-client,在这里我获得了一个pod的IP 是完成执行的pod的名称,如果执行则可见。 是一个kubernetes API主机,我从中获得该主机。 MiniKube只有1个节点。 Fabric8IO/Kubernetes-客户端版本为4.9.1 Java 11 我将此代码作为作业部署在的同一集群上。

  • 我有一个正在运行的elasticsearch集群,我正在尝试将kibana连接到这个集群(同一个节点)。目前,当我尝试使用:在浏览器中打开服务时,页面会挂起。.在我的kibana pod日志中,pod中的最后几条日志消息是: 我的kibana。装载到kibana吊舱中的yml文件具有以下配置: 还有我的弹性搜索。yml文件有以下配置设置(我有3个es POD) 我觉得问题目前与字段有关,但我不确定

  • 我正试图在我的kubernetes集群中安装Jenkins。当我探索的时候,我发现有两个方面。我理解的第一种方法是,安装詹金斯主从。在这里,我找到了在kubernetes集群上安装Jenkins主从代理的文档。第二种方法是我发现Kubernetes插件的用法。如果我们用这种方法,只需要安装master和配置插件。当创建一个部署时,从吊舱将自动工作。 在第一种方法中,我们需要定义安装主从机的工作机器