我们使用了许多基于反应的Web应用程序,这些Web应用程序“编译”为静态网站,只是一些html,js和css文件。
但是,这些应用程序的“构建”采用了许多启用/禁用功能标志,配置后端url等的变量。
这意味着我们不能“构建”传统意义上的二进制文件,而只能在部署时应用配置文件-“构建”本身需要设置这些特定于环境的变量,因此只有我们可以“构建”在部署时。
现在,我们通过将所需的环境变量注入Docker容器并沿着
npm build && nginx run
有两个缺点:
相对于容器的运行时要求,构建过程需要大量的cpu /内存。这意味着我们需要为构建过程而不是运行时要求扩展容器-感觉很不对
构建失败很难“追踪”。我们可以在Kubernetes中使用运行状况检查,但是如果构建需要2分钟,我们仍然必须等待3分钟(为了安全起见需要额外等待1分钟),然后才能开始测试容器的运行状况检查端点以查看其是否还活着。
部署可能会花费很长时间:如果我们配置Kubernetes进行“串行”部署,它将启动每个Pod,并等待2-3分钟的“ initialDelay”时间,然后再开始下一个。这意味着如果将部署扩展到3-4个Pod,我们很容易就能看到10分钟的部署时间。
这一切对我来说都不理想。我很想听听社区如何使用现代javascript webapps解决“部署时构建”难题。
我意识到,对于Kubernetes,我们可以使用“初始化容器”执行构建,将工件放置在持久性存储中,然后让应用程序容器在启动过程中简单地从持久性存储中拉出,但这仍然感觉更像是“绕过”问题,而不是解决根本问题。
#1 楼
从我的角度来看,最好的方法是:使用Jenkins进行单独的构建过程,该构建过程将NodeJS项目构建为发行版本并将其包装到Docker映像中。从Jenkins累积Docker映像(应该可以从Kubernetes集群访问此注册表) / yml定义,用于每个环境中的每个应用程序)
使用Jenkins,您可以基于通用管道配置连续交付系统。可能的流程如下:
开发人员完成与GitFlow对应的工作(最新的Pull Request合并到Release分支中)
Webhook触发Jenkins管道:
阶段1:收集环境定义
阶段2:使用npm构建NodeJS应用程序
阶段3:构建具有发行版的Nginx Docker映像
阶段4:将Docker映像推送到Docker注册表<第五步:使用标准定义在Kubernetes中部署/更新服务
关于结果的通知发送
使用Rancher可以可视化此过程。我可以通过聊天回答您的问题。
评论
因此,您建议在每个环境中使用一张图像?这是一种变通方法,只为一些变量占用了很多空间...
–滕西拜
18年2月2日在13:28
@Tensibai您在每种环境下谈论约15mb的图像。通过轮换和附加的管理员服务,1 Gb足以处理所有项目。
–马克西姆
18年2月2日在14:34
基于此解决方案,您将如何生成一个应用程序的多个“配置”,例如一个用于“ staging”,一个用于“ prod”? (例如,假装有一个称为“ BackendApi”的设置会有所不同。
–特隆德
18年2月2日在14:35
就像我说的@Trondh,我们使用Spring Cloud Config。它为每个应用程序执行的操作是获取基本配置并从配置文件应用其他配置。例如。如果您请求https://config/backend.yml,您将收到来自application.yml的配置以及来自backend.yml的其他属性。对于https://config/backend-stage.yml,它将以application.yml <-backend.yml <-backend-stage.yml应用的属性进行响应。
–马克西姆
18-2-2在14:41
@Maksim 15MB的文本空间只有几个字节,这是浪费,在某些情况下,具有各种版本的各种环境上的数百个微服务将在源头变成相同字节数的数据TB。如果我正确理解您的建议,那是一条错误的道路,因为您无法确保QA和prod中的映像与两个构建中的映像确实相同(即使使用相同的代码,它们也不会相同)。相同的ID和验证变得一团糟)。但是,也许我弄错了,如果您将Pod旋转起来,那么您只有一个图像和配置,如果这样的话,我就无法正确理解您的帖子。
–滕西拜
18年2月2日在14:55
评论
抱歉,我不明白-为什么您在运行时而不是在容器构建时运行npm build?@XiongChiamiov我假设前端配置是在构建过程中完成的,并且如果不进行重建就无法修改(我认为应该将其隔离在一个包含的文件中,在最坏的情况下,可以在容器启动时对其进行“ sed”)。
究竟。 npm build只是一个任意命令。可以是响应构建或健全构建,也可以是JS框架期望的任何构建。我们被迫在容器部署中这样做,因为那是我们知道要为其构建环境的时候。