Kubernetes-等待其他Pod准备就绪

时间:2018-06-28 09:53:34

标签: kubernetes

我有两个应用程序- app1 app2 ,其中 app1 config server,其中包含 app2的配置。我已经在 app1 中定义了/readiness端点,需要等待它返回OK状态才能启动 app2 的广告连播。

至关重要的是,部署 app2 直到kubernetes app1 中的 / readiness 端点接收到Http Status OK这是一台配置服务器,其中包含app2的关键配置。

是否可以进行这种部署依赖?

6 个答案:

答案 0 :(得分:7)

是的,可以使用Init Containers(另请参见blog post以获得一些背景重新计时),但是更好的Kubernetes本机模式是使用重试和超时而不是硬编码依赖项这样。

答案 1 :(得分:4)

使用wait-for-it.sh实际上很容易:

  initContainers:
  - name: wait-for-app1
    image: image-docker-containing-sh
    args:
    - /bin/sh
    - -c
    - /usr/app/wait-for-it.sh app1:<portapp1> -t 0

当然,重试和超时是解决的办法,但这可以很好地解决。

答案 2 :(得分:2)

您需要使用initContainers。以下是如何在YAML文件中进行操作的示例

initContainers:
- name: wait-for-other-pod
  image: docker.some.image
  args:
  - /bin/sh
  - -c
  - >
    set -x;
    while [ $(curl -sw '%{http_code}' "http://www.google.com" -o /dev/null) -ne 200]; do
      sleep 15;
    done

请注意YAML空格。我使用了curl,您可以使用任何其他UNIX命令来检查其他Pod是否准备就绪,例如ping,如果您知道主机名。

要注意的地方:您需要根据业务需求决定是要在initcontainer还是containers(在args中等待),如下所示:

containers:
- name: <container_name>
  image: "<image_name>"
  imagePullPolicy: Always
  args:
  - /bin/sh
  - -c
  - >
    <write your wait code here>

答案 3 :(得分:2)

initContainers:
    - name: wait-for-dependent-service
      image: stefanevinance/wait-for-200
      env:
        - name: URL
          value: http://dependent-service.{{.Release.Namespace}}.svc.cluster.local:3000

使用https://hub.docker.com/r/stefanevinance/wait-for-200/

答案 4 :(得分:1)

当前,kubernetes不支持该功能。而且我不认为(理想情况下)。这是我对此的想法:

  1. 如果kubernetes尝试同时调度两者,该怎么办? 一种。 app1首先出现,不用担心。 b。 app2首先启动,找不到app1,然后重新启动pod。同时,出现了app1,然后无需担心。

  2. 您可以尝试利用容器下的'lifecycle'钩子来实现依赖行为。在那里,您可以执行命令/脚本,该命令/脚本可以阻止容器,直到出现app1。它们在https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

  3. 中有解释
  4. 有一些在kubernetes之上构建的插件,它们试图实现相同的目的。您可以在github上找到它们。

答案 5 :(得分:0)

与@Vishrant 答案相同... 在 YAML 文件中以单行形式编写 bash 命令的另一种方式

  initContainers:
  - name: wait-for-some-pod
    image: yourDockerImage
    command: ["/bin/sh","-c"]
    args: ['while [ $(curl -ksw "%{http_code}" "https://<pod_health_check_end_point>" -o /dev/null) -ne 200 ]; do sleep 5; echo "health check failed . Waiting for the service..."; done']