Kubernetes 当部署B更改时,重新启动部署A中的POD
无法将我无法控制的遗留应用程序部署到k8s,该应用程序需要命令行上的IP地址列表,这些IP是部署B中的POD,例如:Kubernetes 当部署B更改时,重新启动部署A中的POD,kubernetes,kubernetes-pod,Kubernetes,Kubernetes Pod,无法将我无法控制的遗留应用程序部署到k8s,该应用程序需要命令行上的IP地址列表,这些IP是部署B中的POD,例如: /legacy\u app-s 10.1.0.1 10.1.0.2 10.2.0.2-将此应用程序称为部署 (在pod启动期间,通过查询k8s API的../pods端点收集IP地址) 当部署B发生变化(向外/向内扩展、POD重新启动等)时,IP列表会发生变化,我需要重新启动部署A中的POD,以便重新查询API以获得正确的IP列表 理想情况下,如何使用标准的k8s原语干净地实现这
/legacy\u app-s 10.1.0.1 10.1.0.2 10.2.0.2
-将此应用程序称为部署
(在pod启动期间,通过查询k8s API的../pods
端点收集IP地址)
当部署B发生变化(向外/向内扩展、POD重新启动等)时,IP列表会发生变化,我需要重新启动部署A中的POD,以便重新查询API以获得正确的IP列表
理想情况下,如何使用标准的k8s原语干净地实现这一点
到目前为止,我所尝试的:
- 在部署B上调用
的应用程序,在检测到watch
事件时,更新部署a上的标签,强制重新启动。这是可行的,但需要观察者在重新启动deploy a之前暂停几秒钟-如果没有暂停,IP列表通常在deploy a重新启动时不是最新的,从而导致列表不完整。但是,它暂停的时间越长,我丢失的数据就越多。这增加了比我喜欢的更多的操作复杂性李>MODIFIED
- 将部署A上的pid 1替换为一个监视循环,该循环在列表更改时使用新的IP列表(重新)启动旧应用程序
- 我是否可以在包含IP列表的pods上更新configMap或部署标签,并在需要重新启动时以某种方式使用它来发出信号
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操作符的实现细节,看看他们是否能提供比这更干净的修复
除非有更好的解决方案,否则请将此标记为我问题的答案 重构应用程序B以使用应用程序A的服务而不是原始IP,这样您就不必重新启动anything@EfratLevitan我想你的意思是重构应用程序A以使用应用程序B的服务,但不幸的是,应用程序A需要一个应用程序B的ip地址列表-仅指出它,服务ip在应用程序A的情况下不起作用,因此整个“重启应用程序A”我试图实现的设置:(如果它可以使用DNS名称,并且您知道需要多少,那么您可以将应用程序B转换为状态集,并且它的主机名是可预测的(
app-B-0.app-B.nsname.svc.cluster.local
,app-B-1….
)(但也存在一些不幸的DNS缓存实现。)kubectl卷展栏重新启动部署/app-a
将适用于CLI工具;它通过在部署中更改pod规范上的注释来工作,因此任何更改任何注释、标签、环境变量或其他设置的自动工具也将导致重新启动。@DanielleM。您成功使其工作了吗?