我正在尝试推迟在 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 的生命周期。




