首页 > 解决方案 > 如何从 mongo statefulset yaml 文件运行 rs.init?

问题描述

我正在 kubernetes 集群(GKE)上部署一个 mongodb statefulset。

每次我第一次部署 statefulset 时,我都必须在 mongo statefulset 上手动运行以下命令。

我的步骤:

  1. 部署yaml文件

  2. 通过“ kubectl exec -it mongo-0 /bin/bash ”进入 mongo pod

  3. 运行“ mongo

  4. rs.initiate({_id:“rs0”,成员:[{_id:0,主机:“mongo-0.mongo:27017”},{_id:1,主机:“mongo-1.mongo:27017”}] })

启动

我可以将此命令放入 mongo-statefulset.yml 文件或其他自动处理它的方式吗?

mongo-statefulset.yml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
spec:
  selector:
     matchLabels:
       role: mongo
  serviceName: "mongo"
  replicas: 1
  template:
    metadata:
      labels:
        role: mongo
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: mongo
          image: mongo:4.0
          command:
            - mongod
            - "--replSet"
            - rs0
            - "--bind_ip"
            - 0.0.0.0
          ports:
            - containerPort: 27017

还有另一个关键问题:

有时我不知道为什么我的集群中的所有 pod 都会突然重启,从重启开始一切正常并继续运行,除了这个 mongo 状态集。mongo 的副本集状态变为“ OTHER ”而不是“Primary/Secondary”。因此,mongo 服务无法使用,直到我键入以下命令来恢复它:

rsconf = rs.conf()
rsconf.members = [
      { _id: 0, host: "mongo-0.mongo:27017", priority: 1 },
      { _id: 1, host: "mongo-1.mongo:27017", priority: 0.5 }
   ]
rs.reconfig(rsconf, {force: true})

如何自动恢复?

标签: mongodbkuberneteskubernetes-statefulset

解决方案


这里有两个选项:

  • 使用 Kubernetes生命周期挂钩PostStart钩子适合您的用例。但是,请确保在运行配置调用之前构建一个检查以验证您的 mongo 是否已启动。当 K8s 决定重启 Pod 时,也会执行该钩子。

  • 使用Helm 图表挂钩。这增加了区分安装后和升级后的选项。但是,这些钩子只会在 Helm 安装升级图表后触发,而不是在 K8s 重新启动 Pod 时触发。


推荐阅读