【问题标题】:Why am I losing my connection to my MongoDB after my GKE node gets preempted?为什么我的 GKE 节点被抢占后,我失去了与 MongoDB 的连接?
【发布时间】:2021-03-12 16:15:52
【问题描述】:

我在 GKE 集群中运行 Mongo、Express、Node、React 应用程序,该集群设置有可抢占式 VM(以节省资金)。我正在使用 mongoose 连接到托管在 Mongo Cloud Atlas 上的 MongoDB。当 pod 首次启动时,一切正常。但是,当我的节点被抢占时,我失去了与我的 mongoDB 实例的连接。然后我必须进入并手动将部署缩小到 0 个副本,然后将其扩大备份并恢复与 mongoDB 的连接。下面是我得到的错误和我的 mongo 连接的代码。这只是使用可抢占实例的预期效果吗?有什么办法可以处理它,比如抢占后自动扩展部署?我正在运行一个 GKE 自动驾驶仪集群,没有任何问题,但这对我来说有点贵。谢谢

mongoose
    .connect(process.env.MONGODB_URL, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useFindAndModify: false,
    })
    .then(() => console.log('mongoDB connected...'));
(node: 24) UnhandledPromiseRejectionWarning: Error: querySrv ECONNREFUSED _mongodb._tcp.clusterx.xxxxx.azure.mongodb.net at QueryReqWrap.onresolve (dns.js:203)

【问题讨论】:

  • 节点被抢占时POD的状态是什么?

标签: mongodb express kubernetes google-kubernetes-engine


【解决方案1】:

VM 抢占可以在 Compute Engine -> Instance groups -> Restart/Replace VMS 中重现,然后选择选项:Replace。重新启动 VM 后,容器也将重新创建,但不幸的是,如上所述出现了网络问题。

我的解决方案是通过/health URL 向 Kubernetes Pods/Deployment 添加 liveness 和 readiness 探针,该 URL 检查 MongoDB 是否可用,如果不可用则返回状态代码 500。有关如何在 Kubernetes 中定义 liveness 和 readiness 探针的详细信息是 here。 Kubernetes 将重新启动不活跃的 Pod。之后创建的 pod 不会出现网络问题。

我项目中的 yaml 规范块如下所示:

spec:
  containers:
  - env:
    - name: MONGO_URL
      value: "$MONGO_URL"
    - name: NODE_ENV
      value: "$NODE_ENV"
    image: gcr.io/$GCP_PROJECT/$APP_NAME:$APP_VERSION
    imagePullPolicy: IfNotPresent
    name: my-container
    # the readiness probe details
    readinessProbe:
      httpGet: # make an HTTP request
        port: 3200 # port to use
        path: /health # endpoint to hit
        scheme: HTTP # or HTTPS
      initialDelaySeconds: 5 # how long to wait before checking
      periodSeconds: 5 # how long to wait between checks
      successThreshold: 1 # how many successes to hit before accepting
      failureThreshold: 1 # how many failures to accept before failing
      timeoutSeconds: 3 # how long to wait for a response
    # the livenessProbe probe details
    livenessProbe:
      httpGet: # make an HTTP request
        port: 3200 # port to use
        path: /health # endpoint to hit
        scheme: HTTP # or HTTPS
      initialDelaySeconds: 15 # how long to wait before checking
      periodSeconds: 5 # how long to wait between checks
      successThreshold: 1 # how many successes to hit before accepting
      failureThreshold: 2 # how many failures to accept before failing
      timeoutSeconds: 3 # how long to wait for a response

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多