我有两个应用程序- app1 和 app2 ,其中 app1 是config server
,其中包含 app2的配置。我已经在 app1 中定义了/readiness
端点,需要等待它返回OK
状态才能启动 app2 的广告连播。
至关重要的是,部署 app2 直到kubernetes
从 app1 中的 / readiness 端点接收到Http Status OK
这是一台配置服务器,其中包含app2的关键配置。
是否可以进行这种部署依赖?
答案 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
答案 4 :(得分:1)
当前,kubernetes不支持该功能。而且我不认为(理想情况下)。这是我对此的想法:
如果kubernetes尝试同时调度两者,该怎么办? 一种。 app1首先出现,不用担心。 b。 app2首先启动,找不到app1,然后重新启动pod。同时,出现了app1,然后无需担心。
您可以尝试利用容器下的'lifecycle
'钩子来实现依赖行为。在那里,您可以执行命令/脚本,该命令/脚本可以阻止容器,直到出现app1。它们在https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
有一些在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']