当部署 B 更改时,在部署 A 中重新启动 pods
Restart pods in deployment A when deployment B changes
部署一个遗留应用程序我无法控制到 k8s,它需要命令行上的 IP 地址列表,这些 IP 是部署 B 中的 pods,例如:
./legacy_app -s 10.1.0.1 10.1.0.2 10.2.0.2
- 将此应用程序部署称为 A
(IP 地址是通过在 pod 启动期间查询 k8s API 的 .../pods
端点收集的)
当部署B发生变化时(横向扩展/缩减,pods重启等),IP列表发生变化,我需要部署A中的pods重启,以便重新-查询 API 以获得正确的 IP 列表。
我怎样才能干净地实现这一点,理想情况下使用标准的 k8s 原语?
到目前为止我尝试过的:
- 在部署 B 上调用
watch
并检测到 MODIFIED
事件的应用会更新部署 A 上的标签,从而强制重启。这有点有效,但需要观察者在重新启动部署 A 之前暂停几秒钟 - 如果没有暂停,IP 列表通常在部署 A 重新启动时不是最新的,导致列表不完整。但是,它暂停的时间越长,我丢失的数据就越多。这增加了比我喜欢的更多的操作复杂性。
接下来我要尝试的是:
用一个监视循环替换部署 A 上的 pid 1,当列表更改时,该监视循环使用新的 IP 列表(重新)启动旧版应用程序。
我可以更新包含 IP 列表的部署 A pods 上的 configMap 或标签,并以某种方式在需要重新启动时使用它来发出信号吗?
有没有更好的方法?进入 k8s 我希望有某种我可以订阅的钩子/手表,以及 运行 一个 "restart all pods in deployment" 类型的命令,但该功能似乎不存在。
我显然是 k8s 的新手,非常感谢任何输入。
AWS EKS 上的 k8s 1.14
我最终在部署 A 之前使用 bash 入口脚本解决了这个问题,p 许多伪代码:
#!/bin/bash
get_deployment_B_ips() {
echo $(curl https://$K8S_API/api/v1/namespaces/my_namespace/pods/ | \
jq -r '[.items[] | select(.metadata.labels.app=="deployment-B") | select(.status.phase=="Running")] | map(.status.podIP + ":9125") | join(" ")')
}
while true; do
CURRENT_LIST=$(get_deployment_B_ips)
if [[ "$IP_LIST" == "$CURRENT_LIST" ]]; then
sleep 5
else
# restart the process with new IP LIST
fi
done
这目前效果很好,但展望未来,我将阅读有关 k8s Operators 的实现细节,看看他们是否可以提供比这更清晰的修复。
将此标记为我的问题的答案,除非出现更好的解决方案。
部署一个遗留应用程序我无法控制到 k8s,它需要命令行上的 IP 地址列表,这些 IP 是部署 B 中的 pods,例如:
./legacy_app -s 10.1.0.1 10.1.0.2 10.2.0.2
- 将此应用程序部署称为 A
(IP 地址是通过在 pod 启动期间查询 k8s API 的 .../pods
端点收集的)
当部署B发生变化时(横向扩展/缩减,pods重启等),IP列表发生变化,我需要部署A中的pods重启,以便重新-查询 API 以获得正确的 IP 列表。
我怎样才能干净地实现这一点,理想情况下使用标准的 k8s 原语?
到目前为止我尝试过的:
- 在部署 B 上调用
watch
并检测到MODIFIED
事件的应用会更新部署 A 上的标签,从而强制重启。这有点有效,但需要观察者在重新启动部署 A 之前暂停几秒钟 - 如果没有暂停,IP 列表通常在部署 A 重新启动时不是最新的,导致列表不完整。但是,它暂停的时间越长,我丢失的数据就越多。这增加了比我喜欢的更多的操作复杂性。
接下来我要尝试的是:
用一个监视循环替换部署 A 上的 pid 1,当列表更改时,该监视循环使用新的 IP 列表(重新)启动旧版应用程序。
我可以更新包含 IP 列表的部署 A pods 上的 configMap 或标签,并以某种方式在需要重新启动时使用它来发出信号吗?
有没有更好的方法?进入 k8s 我希望有某种我可以订阅的钩子/手表,以及 运行 一个 "restart all pods in deployment" 类型的命令,但该功能似乎不存在。
我显然是 k8s 的新手,非常感谢任何输入。
AWS EKS 上的 k8s 1.14
我最终在部署 A 之前使用 bash 入口脚本解决了这个问题,p 许多伪代码:
#!/bin/bash
get_deployment_B_ips() {
echo $(curl https://$K8S_API/api/v1/namespaces/my_namespace/pods/ | \
jq -r '[.items[] | select(.metadata.labels.app=="deployment-B") | select(.status.phase=="Running")] | map(.status.podIP + ":9125") | join(" ")')
}
while true; do
CURRENT_LIST=$(get_deployment_B_ips)
if [[ "$IP_LIST" == "$CURRENT_LIST" ]]; then
sleep 5
else
# restart the process with new IP LIST
fi
done
这目前效果很好,但展望未来,我将阅读有关 k8s Operators 的实现细节,看看他们是否可以提供比这更清晰的修复。
将此标记为我的问题的答案,除非出现更好的解决方案。