如何修复MongoError:GKE上没有mongos代理

时间:2019-06-03 14:31:03

标签: mongodb kubernetes google-kubernetes-engine

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

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

已将express中的连接字符串设置为: “ 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"  
}

enter image description here

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

修改 因此,我将每个副本的比例缩小到1,现在可以正常使用了。

我很困惑为什么它不能工作超过1个副本。

enter image description here

1 个答案:

答案 0 :(得分:0)

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

  1. 您无法使用Pods 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的访问。

解决方案:

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

我鼓励您查看正式的mongodb舵表,以了解满足您的情况所需的清单文件。

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