坚持将我无法控制的旧版应用程序部署到需要在命令行上列出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基元来干净地实现这一目标?
到目前为止,我已经尝试过:
watch
并检测到MODIFIED
事件的应用,将更新部署A上的标签,并强制重新启动。这种方法是可行的,但是要求观察者在重新启动部署A之前暂停几秒钟-如果没有暂停,到部署A重新启动时IP列表通常不是最新的,从而导致列表不完整。但是,暂停时间越长,丢失的数据就越多。这增加了我所不喜欢的操作复杂性。 接下来我要尝试的内容:
用监视循环替换部署A上的pid 1,当列表更改时,该监视循环使用新的IP列表(重新)启动旧版应用。
我可以在包含IP列表的部署A吊舱上更新configMap或标签,并以某种方式使用它来表示何时需要重启吗?
有更好的方法吗?进入k8时,我希望可以订阅某种挂钩/监视,并运行“重新启动部署中的所有Pod”类型命令,但是该功能似乎不存在。
我显然是k8s的新手,非常感谢任何输入。
AWS EKS上的k8s 1.14
答案 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运算符的实现细节,并查看它们是否可以提供比此更干净的修复程序。
除非有更好的解决方案,否则将此标记为我的问题的答案。