如何等待直到另一个Pod开始使用init容器运行?

时间:2020-04-17 06:26:07

标签: docker kubernetes docker-compose

  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice; do echo waiting for myservice; sleep 2; done"]

我正在使用nslookup等到另一个服务出现。但是,这不能解决我的问题。随着服务的出现,但相应的应用程序-pod可能尚未就绪。在这种情况下,服务依赖项将无法处理。

如何在启动app2之前确保一个app1正在运行?

1 个答案:

答案 0 :(得分:1)

我过去在docker-compose上遇到过类似的问题。我曾经用两种方法来解决它们。他们两个都假设服务将公开一个端口以供监听。

  1. 简单:等待应用程序的特定端口通过超时命令进行监听。这与您已经在做的事情非常相似。因此,您的command类似于:
    initContainers:
    - name: init-myservice
        image: busybox:1.28
        command: ['sh', '-c', "until timeout 2 bash -c \"</dev/tcp/myservice/${MY_SERVICE_TCP_PORT}\"; do echo waiting for myservice; sleep 2; done"]
    
  2. 功能多样,但具有额外的依赖性:使用出色的dockerize工具。一个轻量级的二进制文件,它将控制容器之间的依赖关系。它还执行许多其他操作,例如从日志文件控制日志或执行配置模板。唯一的缺点是您在容器中引入了新的依赖关系,但我认为这是完全值得的。在这种情况下,您可以对服务的活动性进行tcp和http检查,甚至可以在http中引入标头(对于经过身份验证的端点非常有用)。