等待其他部署开始运行,然后才能创建其他部署?

时间:2018-05-14 07:00:45

标签: mongodb docker kubernetes docker-compose openshift

我正在使用REST API创建部署/服务。我发送POST请求与包含在Openshift上创建应用程序的JSON对象的主体。在我调用所有API之后,这些对象就会被实例化。

我有2个部署依赖于mongodb部署但是这个mongodb需要更长的时间才能开始运行,而依赖于mongodb的两个部署开始运行更早。这会破坏2个部署中的代码,因为mongodb连接失败(因为它还没有启动)。

我可以通过两种方式解决这个问题。

  1. 我在创建mongodb部署后延迟了一段时间,并递归调用API以检查它是否正在运行时的状态。

  2. 就像我们在docker-compose中进行更改一样,使用key,依赖于告诉docker-compose应首先启动所有依赖项,然后再依赖于依赖容器。

  3. 在openshift中有什么办法可以实现吗?

3 个答案:

答案 0 :(得分:5)

使用Kubernetes的健康检查机制,而不是实现依赖性处理的复杂逻辑。如果您的应用程序启动但没有看到Mongo DB,请让它崩溃。 Kubernetes将继续重新启动它,直到Mongo DB上线,您的应用程序变得健康并且也可以正常运行。 Kubernetes不会向尚未健康的实例发送流量。

文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

答案 1 :(得分:1)

  

就像我们在docker-compose中进行更改一样,使用key,depend-on告诉docker-compose应首先启动所有依赖项,然后再依赖于依赖容器。

  • 您可能希望查看依赖容器的Init容器。它们在容器实际启动之前运行完成。以下摘录摘自可能适用于您的问题的用例的参考文档(如下所示):

    • 它们在任何应用容器启动之前运行完成,而应用容器并行运行,因此初始容器提供了一种简单的方法来阻止或延迟应用容器的启动,直到满足一组前置条件。

      实施例

      以下是有关如何使用Init Containers的一些想法:

      • 等待使用shell命令创建服务,如:

        for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; done; exit 1
        
      • 使用以下命令从下行API向远程服务器注册此Pod:

        curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d ‘instance=$()&ip=$()’
        
      • 在使用sleep 60之类的命令启动app Container之前等待一段时间。

  • 参考文件:
    https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

答案 2 :(得分:0)

Alex指出了kubernetes的正确做法。但是,如果您仍然想直接依赖其他Pod phase,则可以使用我构建的pod-dependency-init-container。这将在启动您的pod之前检查具有给定labels的pod是否正在运行。

相关问题