部署在 ECS 实例后应用仅仅处于「可用」的状态,还面临着如下问题和隐患:
迭代能力不足,无法优雅终止和快速启动应用 —— 每次重新部署都将会造成应用不可用; 健壮性不足,物理或系统出现的问题将可能导致应用不可用; 并发性不足,虽然在网站前期不会是瓶颈,但单机的模式扩容有其上限。 很容易就能想到使用容器化技术和集群模式。
这就可以应用 Docker 和 Kubernetes(以下简称 k8s),阿里云提供了容器服务 Kubernetes 版。此时应用的架构是这样:
- 首次部署:
- 创建 k8s 集群,将集群控制权授予 EDAS;
- 创建镜像仓库,通过发布 git 标签触发构建镜像;
- 创建 EDAS 应用,关联镜像,部署应用:;
- 添加负载均衡,允许公网访问 EDAS 应用。
- 往后迭代:
- 通过发布 git 标签触发构建镜像;
- 访问 EDAS 应用,访问新版本镜像进行重新部署。
参考:
- 什么是 Docker? (opens new window)
- 什么是 Kubernetes? (opens new window)
- 什么是阿里云容器服务 Kubernetes 版? (opens new window)
以下是通过 EDAS 部署 NodeBB 的指引教程。
2.1 创建 Kubernetes 集群 首先我们需要一个 k8s 集群用于部署我们的应用。访问创建 Kubernetes 集群: (opens new window)
- 地域选择“华东 1”;
- 可用区选择“可用区 G”;
- 专有网络选择和上一步“ECS 部署”的一致(因为接下来将需要连接 MongoDB)。
参考:
- 如何创建 Kubernetes 集群? (opens new window):
- 如何创建 Kubernetes 托管版集群? (opens new window) > 相比于默认的 Kubernetes 集群,托管版本会主动替您运维一套高可用的 Master 组件,免去了默认版本集群中三个 Master ECS 节点,从而节约所需的资金成本及维护时的人力成本。-- 《使用 Terraform 创建托管版 Kubernetes》 (opens new window)
- 如何创建多可用区 Kubernetes 集群? (opens new window) > 为了保证业务应用的高可用,有些客户会要求关键应用部署到多个机房,一个机房一旦出问题,其他机房正常工作,从而让应用保持不间断连续运行。阿里云支持多 Region(地域),每个 Region 下又有不同的可用区。可用区是指在同一地域内,电力和网络互相独立的物理区域。多可用区能够实现跨区域的容灾能力。同时也会带来额外的网络延时。
2.2 创建 Docker 镜像 紧接着,我们需要构建出应用的 Docker 镜像。访问容器镜像服务控制台:
创建镜像仓库:
- 代码仓库选择上一步“ECS 部署”中的仓库;
- 勾选“代码变更时自动构建镜像”。
构建镜像:
在代码仓库的根目录下创建配置文件 config.json:
{
"url": "http://xxx.taobao.com",
"secret": "xxx",
"database": "mongo",
"mongo": {
"uri": "mongodb://xxxx"
},
"port": "4567"
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Dockerfile 中使用配置文件启动 NodeBB:
FROM node:8.15.0
RUN mkdir -p /usr/src/app WORKDIR /usr/src/app
ARG NODE_ENV ENV NODE_ENV $NODE_ENV COPY install/package.json /usr/src/app/package.json RUN npm install && npm cache clean --force COPY . /usr/src/app
ENV NODE_ENV=production \ daemon=false \ silent=false
RUN ./nobebb build CMD ./nodebb start
EXPOSE 4567
1
2
3
4
5
6
2
3
4
5
6
通过发布标签触发镜像构建:release-v$version
2.3 创建 EDAS 应用
然后我们创建一个 EDAS 应用,并使用刚创建的镜像部署该应用。访问 EDAS 控制台:
- 访问“EDAS - 资源管理 - 集群”:导入刚创建的 K8S 集群;
- 访问“EDAS - 应用管理 - 应用列表”:创建新应用:
- 集群类型:选择“容器服务K8S集群” - 选择刚导入的 K8S 集群;
- 镜像:选择上一步构建的镜像和版本。
- 配置应用:
- 添加负载均衡(公网):
- 通过负载均衡IP验证应用部署是否成功。
2.4 配置负载均衡
最后,我们在负载均衡层强制启用HTTPS,并将域名解析道负载均衡的公网IP。
访问负载均衡控制台 (opens new window)操作:
创建证书:
- 访问“负载均衡-实例-证书管理”
- 点击创建证书
- 选择“上传第三方签发证书”
- 上传“ECS部署”章节中下载的证书
负载均衡配置
- 通过IP找到对应的负载均衡实例
- 添加HTTPS监听(参考《如何添加HTTPS监听》 (opens new window))
- 协议选择HTTPS
- 监听端口输入“443”
- 高级配置中,开启会话保持
- SSL证书选择上一步创建的证书
- 后端服务器选择“虚拟服务器组”
- 删除原TCP 80的监听;
- 添加HTTP监听
- 协议选择“HTTP”
- 监听端口输入“80”
- 高级配置开启“监听转发”
- 目的监听选择“HTTPS 443”
- 通过HTTPS访问IP验证负载均衡配置成功;
- 域名映射:通过IDNS将xxx.taobao.com (opens new window)A到负载均衡公网IP