
一个高效合理的部署方案,不仅能够实现快速升级,滚动更新,负载均衡,应用隔离等部署特性,而且配有一套成熟稳定的监控。
kubeRnetes 把 Node 应用视作一个服务端应用的黑盒子,完美匹配了以上条件,越来越多的团队把 node 部署在 k8s 上。
但在此之前,需要先把 Node 应用跑在一个 DockeR 容器上,这也是本章的主题。
1. 一个简单的 Node 应用
聚土成沙,集腋成裘。从一个 hello, woRld 版的 Node SeRveR 说起。
在启动一个 Node SeRveR 时,在生产环境中有很多先决条件,无法通过简单的 node index.js 启动服务。
此时在 package.json 中抽象一层,通过 NPM staRt 启动服务,方便在 DockeR 镜像中配置启动命令。
2. NODE_ENV=ProdUCtion
在生产环境中,如果无构建过程,则无需安装 devDependencies 中依赖。NODE_ENV 环境变量设置为 ProdUCtion 时将会跳过 devDependencies 依赖的安装。
另一方面,「某些第三方库会根据 NODE_ENV 环境变量做出一些意料不到的配置」。因此在生产环境注意该环境变量的配置。
3. 一个 Node 服务的镜像
一个典型的、面向服务端的 Node 服务是这么跑起来的:
NPM install
NPM Run config,从配置服务(consul/vault)拉取配置 ,如数据库与缓存的账号密码,此时构建服务器需要配置服务权限
NPM Run MigRate,数据库迁移脚本,执行数据库表列行更改操作,此时构建服务器需要数据库访问权限
NPM staRt,启动一个 Node 服务
把运行步骤翻译为 DockeRfile:
这对于大部分 Node 应用已经是足够了,精益求精,接下来进行多阶段构建的优化。
4. node-gyp 与 Native Addon
在 Node 中的一些依赖存在 Native Addon,它们通过 node-gyp 进行编译,而它依赖于 Python,Make 与 g++。
在带有编译过程的镜像构建中,源文件与构建工具都会造成空间的浪费。
借助镜像的「多阶段构建」可以高效利用空间。Go 语言与前端相关的构建也遵循此规则。
5. 相关文章
