【发布时间】:2019-10-12 16:18:49
【问题描述】:
卡住了将我无法控制的遗留应用程序部署到 k8s,它需要在命令行上列出 IP 地址,这些 IP 是部署 B 中的 pod,例如:
./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 之前暂停几秒钟 - 如果没有暂停,IP 列表通常在部署 A 重新启动时不是最新的,导致列表不完整。但是,它暂停的时间越长,我丢失的数据就越多。这比我喜欢的增加了更多的操作复杂性。
接下来我要尝试什么:
将部署 A 上的 pid 1 替换为监视循环,当列表更改时(重新)使用新的 IP 列表启动旧版应用程序。
我能否在部署 A pod 上更新 configMap 或标签,其中包含 IP 列表,并以某种方式在需要重启时使用它来发出信号?
有没有更好的方法?进入 k8s,我希望有某种钩子/监视我可以订阅,并运行“重新启动部署中的所有 pod”类型命令,但该功能似乎不存在。
我显然是 k8s 的新手,非常感谢任何输入。
AWS EKS 上的 k8s 1.14
【问题讨论】:
-
重构应用 B 以使用应用 A 的 服务 而不是原始 IP,这样您就不必重新启动任何东西
-
@EfratLevitan 我认为您的意思是重构应用程序 A 以使用应用程序 B 的服务,但不幸的是应用程序 A 需要应用程序 B 的 IP 地址列表 - 只需指出服务 IP 在应用程序中不起作用A的情况,因此我试图实现的整个“重新启动应用程序A”设置:(
-
如果它可以使用 DNS 名称,并且您知道预期有多少,那么您可以将应用 B 转换为 StatefulSet,并且它的主机名是可预测的(
app-b-0.app-b.nsname.svc.cluster.local、app-b-1....)。 (但也有一些不幸的 DNS 缓存实现。) -
kubectl rollout restart deployment/app-a适用于 CLI 工具;它通过更改部署中 pod 规范上的注释来工作,因此任何更改任何注释或标签或环境变量或其他设置的自动化工具也会导致重启。 -
@DanielleM。你成功了吗?