首页 > 解决方案 > 如何修复 MongoError:GKE 上没有可用的 mongos 代理

问题描述

我正在尝试Express在 GKE 上部署和 api,使用Mongo StatefulSet.

googlecloud_ssd.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: fast
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd

mongo-statefulset.yaml

apiVersion: v1
kind: Service
metadata:
  name: mongo
  labels:
    name: mongo
spec:
  ports:
  - port: 27017
    targetPort: 27017
  clusterIP: None
  selector:
    role: mongo
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: mongo
spec:
  serviceName: "mongo"
  replicas: 2
  template:
    metadata:
      labels:
        role: mongo
        environment: test
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: mongo
          image: mongo
          command:
            - mongod
            - "--replSet"
            - rs0
            - "--smallfiles"
            - "--noprealloc"
          ports:
            - containerPort: 27017
          volumeMounts:
            - name: mongo-persistent-storage
              mountPath: /data/db
        - name: mongo-sidecar
          image: cvallance/mongo-k8s-sidecar
          env:
            - name: MONGO_SIDECAR_POD_LABELS
              value: "role=mongo,environment=test"
  volumeClaimTemplates:
  - metadata:
      name: mongo-persistent-storage
      annotations:
        volume.beta.kubernetes.io/storage-class: "fast"
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

我部署了我的Express应用程序,它运行良好,然后我Mongo使用上面的 yaml 配置进行了部署。

将连接字符串设置为:“mongodb://mongo-0.mongo,mongo-1.mongo:27017/”

我可以看到更新的 pod(s) 没有启动。

查看我看到的那个容器的日志

{
 insertId:  "a9tu83g211w2a6"  
 labels: {…}  
 logName:  "projects/<my-project-id>/logs/express"  
 receiveTimestamp:  "2019-06-03T14:19:14.142238836Z"  
 resource: {…}  
 severity:  "ERROR"  
 textPayload:  "[ ERROR ] MongoError: no mongos proxy available
"  
 timestamp:  "2019-06-03T14:18:56.132989616Z"  
}

在此处输入图像描述

我不确定如何调试/修复MongoError: no mongos proxy available

编辑 所以我将每个副本缩小到 1 个,现在它正在工作。

我很困惑为什么这不会超过 1 个副本。

在此处输入图像描述

标签: mongodbkubernetesgoogle-kubernetes-engine

解决方案


与您的 Mongodb 数据库的连接不起作用有两个原因:

  1. 您无法使用 Pod DNS 名称连接到在 Kubernetes 集群内运行的高可用性 MongoDB 部署。这些唯一的 POD 名称:mongo-0.mongo, mongo-1.mongo,对应的 FQDN 为mongo-0.mongo.default.svc.cluster.local, mongo-1.mongo.default.svc.cluster.local,只能在 K8S 集群内访问。您有一个在客户端(Web 浏览器)上运行的 Express Web 应用程序,需要从集群外部连接到您的 mongodb。

  2. 连接字符串:您应该通过 Kubernetes 服务名称连接到主节点,它抽象了对副本集后面的 Pod 的访问。

解决方案:

为您的主副本集创建一个单独的 LoadBalancer 或 NodePort 类型的 Kubernetes 服务,并<ExternalIP_of_LoadBalancer>:27017在您的连接字符串中使用。

我鼓励你看一下官方的mongodb helm chart,看看需要什么样的清单文件来满足你的情况。

提示:使用 '--set service.type=LoadBalancer' 和这个舵图


推荐阅读