【问题标题】:How can I fix MongoError: no mongos proxy available on GKE如何修复 MongoError:GKE 上没有可用的 mongos 代理
【发布时间】:2019-06-10 22:06:44
【问题描述】:

我正在尝试在 GKE 上部署 Express 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 应用程序,它运行良好,然后我使用上述 yaml 配置部署了 Mongo

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

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

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

{
 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 个副本。

【问题讨论】:

    标签: mongodb kubernetes google-kubernetes-engine


    【解决方案1】:

    与您的 Mongodb 数据库的连接无法正常工作有两个原因:

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

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

    解决方案:

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

    我建议您查看官方mongodb helm chart,了解需要什么样的清单文件才能满足您的情况。

    提示:使用 '--set service.type=LoadBalancer' 与此掌舵图

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2019-05-30
      • 2021-07-16
      • 2019-02-22
      相关资源
      最近更新 更多