mongodb - 如何修复 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 个副本。
解决方案
与您的 Mongodb 数据库的连接不起作用有两个原因:
您无法使用 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。连接字符串:您应该通过 Kubernetes 服务名称连接到主节点,它抽象了对副本集后面的 Pod 的访问。
解决方案:
为您的主副本集创建一个单独的 LoadBalancer 或 NodePort 类型的 Kubernetes 服务,并<ExternalIP_of_LoadBalancer>:27017
在您的连接字符串中使用。
我鼓励你看一下官方的mongodb helm chart,看看需要什么样的清单文件来满足你的情况。
提示:使用 '--set service.type=LoadBalancer' 和这个舵图
推荐阅读
- javascript - 已解决:React Material UI 在等待数据时在表格中显示进度
- makefile - 当两个模块使用相同的目标文件时缺少 MODULE_LICENSE()
- angular - 如何为 AOT 编译配置 NGRX/Data
- android - MaterialDatePicker 日历编号未在中心对齐
- javascript - 在根据用户是否登录网站显示文本或链接的表格中,您是否只能使用 CSS 隐藏文本?
- python-3.x - Python TimeSeries 假期的绘图问题(没有行日期和时间)
- ios - Xamarin.iOS 状态栏在更改它和 iPad 上的方向时保持角落的颜色
- javascript - 如何将图片定位到不同的地方
- python - 遍历数组多线程
- listview - 如何修复 ListView 生成的错误?