【发布时间】:2019-04-29 16:46:26
【问题描述】:
这是关于 Swisscom 应用程序云的问题。
我已经实施了一个策略来重新启动已经部署的 CloudFoundry 应用程序没有使用cf restart APP_NAME。我希望能够:
- 无需访问应用清单即可重新启动正在运行的应用,并且
- 避免他们遭受任何停机时间。
一般概念如下所示:
-
cf scale APP_NAME -I 2- 将应用的实例数从 1 增加到 2
- 等待所有应用实例为
running
-
cf restart-app-instance APP_NAME 0- 重启“旧”应用实例
- 等待所有应用实例再次变为
running
-
cf scale easyasset-repower-staging -I 1- 将应用的实例数从 2 减少到 1
这通常有效,并且通常会按照我的预期进行。我遇到的问题发生在第 (3) 阶段,在该阶段 有时 而不是仅仅缩减实例计数,CloudFoundry 还将重新启动所有(剩余)实例。
我不明白:
- 为什么这种情况只是偶尔发生(缩小时所有应用都会重新启动)?
- CloudFoundry 不应该让剩余的实例保持正常运行吗?
- 如果
cf scale无法保持运行良好的应用程序实例处于活动状态 - 它什么时候有用?
请注意:
我非常了解用于在 CloudFoundry 中零停机时间部署应用程序的 Bluegreen / Autopilot 插件,我实际上将它们用于从我们的构建服务器进行部署,但它们需要我提供清单(和其他凭据),这在这种情况下,我无权访问(除非我可以通过 cf create-app-manifest 以某种方式从正在运行的应用程序中提取它?)。
更新 1:
再次查看插件,我发现了bg-restage,它显然可以满足我的要求,但我不知道它的可靠性如何。
更新 2:
我得出的结论是,这可能是 CloudFoundry 中的一个模糊问题(或错误),cf scale 不保证现有实例将继续运行。如上所述,我已经意识到确实很有可能动态生成应用程序清单 (cf create-app-manifest),即使我无法毫无错误地使用 bg-restage 插件,我还是回到了blue-green-deploy 插件,我现在可以使用新生成的清单来避免整个 cf scale 练习。
评论问题:
为什么需要重新启动应用程序的实例?
我们正在缓存一些来自持久存储的值在启动时。当检测到对该数据的更改时,将发生重新启动。
关于健康检查的信息
我们正在使用所有类型的运行状况检查,具体取决于要重新启动的应用程序(http、process 和 port). I have observed this issue only for apps with health checkhttp. I also have ahttp-endpoint` 为运行状况检查定义。
您是否也尝试使用 cf scale 更改内存?
不,我试图在此过程中保持所有应用配置相同。
【问题讨论】:
-
为什么需要重启应用实例?另外,您能否添加一些有关您当前使用的健康检查的信息?
-
您是否也尝试使用
cf scale更改内存?更改实例计数应该需要重新启动所有实例,但更改内存限制会。 -
我不确定这个故事的确切原因,但它可能指向问题所在。如果进程版本以某种方式发生变化,那将导致实例被杀死并重新创建 -> pivotaltracker.com/story/show/160207350。更改应用程序实例计数不应该这样做,但有一些关于其他操作可能的故事的注释。