部署B更改后,重新启动部署A中的Pod

时间:2019-10-12 16:18:49

标签: kubernetes kubernetes-pod

坚持将我无法控制的旧版应用程序部署到需要在命令行上列出IP地址列表的k8s,这些IP地址是部署B中的容器,例如:

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

(通过在pod启动过程中查询k8s API的.../pods端点来收集IP地址)

当部署B发生更改(横向扩展/扩展,pod重新启动等)时,IP列表也会更改,并且我需要重新启动部署A中的Pod,以便重新向API查询正确的IP列表。

理想情况下,如何使用标准的k8s基元来干净地实现这一目标?

到目前为止,我已经尝试过:

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

接下来我要尝试的内容:

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

  • 我可以在包含IP列表的部署A吊舱上更新configMap或标签,并以某种方式使用它来表示何时需要重启吗?

有更好的方法吗?进入k8时,我希望可以订阅某种挂钩/监视,并运行“重新启动部署中的所有Pod”类型命令,但是该功能似乎不存在。

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

AWS EKS上的k8s 1.14

1 个答案:

答案 0 :(得分:1)

我最终在部署A之前使用bash输入脚本解决了这个问题,更多的是伪代码:

#!/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运算符的实现细节,并查看它们是否可以提供比此更干净的修复程序。

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