当部署 B 发生更改时,重新启动部署 A 中的 Pod



卡住了部署一个我无法控制的遗留应用程序到 k8s,它需要在命令行上列出 IP 地址,这些 IP 是部署 B 中的 pod,例如:

./legacy_app -s 10.1.0.1 10.1.0.2 10.2.0.2- 将此应用部署称为 A

(IP 地址是在 Pod 启动期间通过查询 k8s API 的.../pods端点来收集的(

当部署 B 发生更改(横向扩展/缩减、Pod 重新启动等(时,IP 列表会发生变化,我需要部署 A 中的 Pod 重新启动,以便重新查询 API 以获取正确的 IP 列表。

我怎样才能干净利落地实现这一点,理想情况下使用标准 k8s 原语?

到目前为止我尝试过:

  • 部署 B 上调用watch并在检测到MODIFIED事件时更新部署 A 上的标签,强制重启。这有点工作,但需要观察程序在重新启动部署 A 之前暂停几秒钟 - 如果没有暂停,则在部署 A 重新启动时 IP 列表通常不是最新的,从而导致列表不完整。但是,它暂停的时间越长,我丢失的数据就越多。这增加了比我喜欢的更多的操作复杂性。

我接下来要尝试什么:

  • 将部署 A 上的 PID 1 替换为监视循环,当列表更改时,该循环(重新(使用新的 IP 列表启动旧版应用。

  • 我可以在包含 IP 列表的部署 A Pod 上更新 configMap 或标签,并以某种方式使用它来发出需要重新启动的信号吗?

有没有更好的方法?进入 k8s,我希望有某种我可以订阅的钩子/手表,并运行"重新启动部署中的所有 pod"类型的命令,但该功能似乎不存在。

我显然是k8s的新手,非常感谢任何输入。

k8s 1.14 on AWS EKS

我最终在部署 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 运算符的实现细节,看看他们是否可以提供比这更干净的修复。

将此标记为我问题的答案,除非出现更好的解决方案。

最新更新