如果我将 kubernetes 部署扩展到 3,前端应用程序会显示空白页面

Frontend App shows a blank page if I scale up kubernetes deployment to 3

我有一个前端应用程序,当我在 kubernetes 集群中只有一个应用程序实例 运行 时,它工作得非常好。但是当我将部署扩展到有 3 个副本时,它在第一次加载时显示空白页面,然后在刷新后加载该页面。一旦我将应用程序缩小到 1,它就会再次开始正常加载。 这是控制台在浏览器中打印的内容。

hub.xxxxx.me/:1 Refused to execute script from 'https://hub.xxxxxx.me/static/js/main.5a4e61df.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

同时添加屏幕截图。任何想法可能是什么情况。我知道这是一个基础设施问题,因为它只在我扩展应用程序时发生。

我注意到的一件事是 2 pods 有一个与另一个 pod 不同的 js 文件。

2 pods have this file - build/static/js/main.b6aff941.js

The other pod has this file - build/static/js/main.5a4e61df.js

我认为不匹配是导致问题的原因。知道如何解决这个不匹配问题,以便 pods 始终具有相同的构建吗?

I think the mismatch is causing the problem. Any Idea how to fix this mismatch issue so that the pods always have the same build?

是的,这在那些资源如此变化的构建中实际上很常见。您实际上不想使用传统的滚动更新机制,因为您的部署更接近于蓝绿部署:一次 Pods 中只有一个 "family" 应该处于服务状态,否则来自 Pod 1 的 html 得到服务,但来自 Pod 2 的 javascript 的后续请求是 404

浏览器拥有 HTML 的缓存副本也存在相当大的风险,但 kubernetes 本身无法帮助您。

一个相当合理的解决方案是将 Deployment 扩展到一个副本,进行图像修补,等待 a-ok,然后将它们重新扩展,因此应用程序只有一个真实来源 运行 一次在集群中。回滚看起来非常相似:规模 1,回滚部署,扩大规模

另一种机制是使用标签修补,以原子方式一次性将 Service(因此可能是 Ingress)切换到新的 Pods,但是将需要在集群中同时拥有多个应用程序副本,对于前端应用程序来说,这可能比它的价值更麻烦。