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

问题描述 投票:1回答:3

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

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

可以有两种可能的方法来解决这个问题。

  1. 我在创建mongodb部署后延迟了一段时间,并递归调用API来检查它的状态是否正在运行。
  2. 就像我们在docker-compose中进行更改一样,使用key,依赖于告诉docker-compose应该首先启动所有依赖项,然后再依赖于依赖容器。

有没有什么方法可以在openshift中实现?

mongodb docker kubernetes docker-compose openshift
3个回答
5
投票

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

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


1
投票

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

  • 您可能希望查看依赖容器的Init Containers。它们在容器实际启动之前运行完成。以下摘录摘自可能适用于您的问题的用例的参考文档(如下所示): 它们在任何应用程序容器启动之前运行完成,而应用程序容器并行运行,因此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/

0
投票

亚历克斯已指出正确的做法跟随kubernetes。但如果你仍然想直接依赖其他pod phase你可以使用我已经构建的这个pod-dependency-init-container。这将检查在启动pod之前是否有任何具有给定labels的pod正在运行。

© www.soinside.com 2019 - 2024. All rights reserved.