Kubernetes - 等待其他pod准备就绪

ohw*_*ppp 9 kubernetes

我有两个应用程序 - app1app2,其中app1app2的config server配置.我在app1中定义了端点,需要等到它返回状态才能启动app2的 pod ./readinessOK

至关重要的是app2的部署要等到app1中的/ readyiness端点kubernetes接收Http Status OK,因为它是配置服务器,并且为app2保留了重要的配置.

是否可以执行此类部署依赖性?

Vis*_*ant 23

您需要使用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.<your_pod_health_check_end_point>.com" -o /dev/null) -ne 200 ]; do
      sleep 15;
    done
Run Code Online (Sandbox Code Playgroud)

我曾经使用curl过健康检查端点,您可以使用任何其他 UNIX 命令来检查其他 pod 是否准备就绪。

  • 对于“docker.some.image”,可以使用 Docker Hub 中的“k8s.gcr.io/busybox”或“busybox”。 (2认同)

Mic*_*las 9

是的,可以使用Init Containers(也可以参考此博客文章了解一些后台重新计时),但更好的,更多Kubernetes本地模式是使用重试和超时,而不是以这种方式硬编码依赖项.

  • 我知道“使用重试和超时”* 是 Kubernetes 中的方法,但它会因失败而严重阻塞我的日志记录。它产生了一个新问题;过滤由于这种设计模式而导致的“正常”故障。像“在 &lt;pod/deployment/replicaset/...&gt; 准备好之前不要调度”这样的“简单”依赖管理对于减少这个问题非常有帮助,并且在监控集群方面比查看“initContainer”更明显。运行时你不知道它实际上是在初始化还是只是在等待。 (11认同)

sha*_*359 9

就我而言,应用程序没有 /readiness 端点。我们有主 Pod 和工作 Pod,我们希望工作 Pod 仅在主 Pod 启动并运行后启动。主 Pod 运行一个在 TCP 端口 80 上侦听的应用程序。我最终在工作 Pod 的 init 容器中使用了 netcat。

nc -z <host> <port>
Run Code Online (Sandbox Code Playgroud)

nc将检查端口是否打开,成功时返回 0,失败时返回 1。

initContainers:
- name: wait-for-master-before-starup
  image: busybox
  command:  ["sh", "-c", "until nc -z master-service 80 > /dev/null; do echo Waiting for master.; sleep 2; done;"]
Run Code Online (Sandbox Code Playgroud)

如果您已经有了健康/准备端点,那么最好像此处其他答案中提到的那样使用它。


Saj*_*azy 6

initContainers:
    - name: wait-for-dependent-service
      image: stefanevinance/wait-for-200
      env:
        - name: URL
          value: http://dependent-service.{{.Release.Namespace}}.svc.cluster.local:3000
Run Code Online (Sandbox Code Playgroud)

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


Jav*_*les 5

使用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
Run Code Online (Sandbox Code Playgroud)

当然,重试和超时是可行的方法,但这作为一种解决方法非常有效。