Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 当部署B更改时,重新启动部署A中的POD_Kubernetes_Kubernetes Pod - Fatal编程技术网

Kubernetes 当部署B更改时,重新启动部署A中的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原语干净地实现这

无法将我无法控制的遗留应用程序部署到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原语干净地实现这一点

到目前为止,我所尝试的:

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

  • 将部署A上的pid 1替换为一个监视循环,该循环在列表更改时使用新的IP列表(重新)启动旧应用程序

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

有更好的办法吗?进入k8s后,我希望可以订阅某种hook/watch,并运行“restartallpodsindeployment”类型的命令,但该功能似乎不存在

我显然是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操作符的实现细节,看看他们是否能提供比这更干净的修复


除非有更好的解决方案,否则请将此标记为我问题的答案

重构应用程序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。您成功使其工作了吗?