我正在尝试推迟在 pod-0 上执行某些命令(mongo 复制集初始化)。基本上我想等待其他 Pod 启动。我正在使用的 postStart 钩子(Hook)如下所示:

- /bin/bash 
- -c 
- > 
  if [ ! -f /xyz/mongo/data/init.lock ]; 
  then 
    if [ "$HOSTNAME" = "mongod-0" ]; 
    then 
      MONGO_CMD="rs.initiate({ _id : \"my_mdb_rs0\", members: [ { _id: 0, host : \"mongod-0.mongodb-service.default.svc.cluster.local:27017\" }, { _id: 1, host : \"mongod-1.mongodb-service.default.svc.cluster.local:27017\" } ] });"; 
 
      **/xyz/mongo/config/doinit.sh \""$MONGO_CMD\"" 120 \& ;** 
 
    fi; 
  else 
    echo "Replicaset appears to be initialized" >> /xyz/mongo/log/init-log.log; 
  fi; 

我尝试为“doinit.sh”创建一个子进程,该进程在执行initializaiton命令之前在内部休眠“120”秒。

但是 pod-0 继续在“ContainerCreating”中等待 120 秒,然后继续安排下一个 pod。

NAME       READY   STATUS              RESTARTS   AGE 
mongod-0   0/1     ContainerCreating   0          2m16s 
 
NAME       READY   STATUS              RESTARTS   AGE 
mongod-0   1/1     Running             0          2m49s 
mongod-1   0/1     ContainerCreating   0          5s 

有没有办法解锁 pod-0 上的调度程序,以便立即调度所有 pod,并且第一个 pod 上的“doinit.sh”在后台等待?

请您参考如下方法:

对于类似的用例,我们创建一个 kubernetes job ,它将

  • 等待 3 个 mongo 副本开始运行。这可以通过调用 kubernetes api (或)简单等待 120 秒并尝试运行命令来完成。如果失败,作业将创建另一个 pod 来运行该命令。我们可以配置作业的重试次数。

如果你不使用 helm,你可以将 mongo-sts + init-job 放在同一个 yaml 文件中,这样应用时会很容易(kubectl apply -f mongo- db.yaml)。

如果您使用 helm,则可以将其作为安装后 作业。

启动后与工作:
  • 作业中可以重试
  • 您可以轻松查看 Pod(由作业创建)的日志,以了解作业中出现了什么问题。
  • 如果 PostStart Hook 运行时间过长或挂起,容器将无法达到运行状态。我同意,你正试图将其置于后台。作业将独立于 Pod 的生命周期。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!