本文档涵盖了 Gumroad 基础设施中用于容器部署和服务管理的 HashiCorp Nomad 编排系统。Nomad 负责在预发布和生产环境中部署 Docker 容器,并与 CI/CD 流水线集成,实现应用程序部署自动化。
有关 Docker 镜像构建和管理,请参阅Docker 配置。有关环境特定配置管理,请参阅配置管理。
系统使用 HashiCorp Nomad 0.8.3 版本进行容器编排。安装过程通过 install_nomad 函数自动化,该函数会在二进制文件不存在时下载并安装它。
Nomad 安装遵循标准化方法
| 组件 | 详情 |
|---|---|
| 版本 | 0.8.3 |
| 架构 | linux_amd64 |
| 安装路径 | /usr/local/bin/nomad |
| 下载来源 | HashiCorp 发布 |
安装过程包括版本检查以避免重复安装,并为二进制文件设置正确的权限。
Nomad 安装工作流
来源:.buildkite/scripts/install_nomad.sh10-23
Nomad 编排与 CI/CD 流水线集成,以管理跨不同环境的部署。系统支持基于分支的预发布部署和生产部署,并具有不同的工作流和安全措施。
Nomad 部署架构
来源:.buildkite/scripts/deploy_branch.sh60-62 .buildkite/scripts/deploy_production.sh30-32 .buildkite/scripts/install_nomad.sh10-23
分支部署针对预发布环境,并包括为 Nginx 配置额外构建 Docker 镜像。该过程处理 Web 应用程序镜像和专用的分支应用 Nginx 镜像。
分支部署过程遵循以下关键步骤:
分支部署流程
| 组件 | 目的 | 位置 |
|---|---|---|
generate_nginx_tag | 根据 Git 提交生成 Docker 标签 | .buildkite/scripts/deploy_branch.sh14-26 |
BRANCH_APP_NGINX_TAG | 分支特有 Nginx 镜像的标签 | .buildkite/scripts/deploy_branch.sh28 |
DEPLOY_TAG | 预发布部署标签格式 | .buildkite/scripts/deploy_branch.sh69 |
来源:.buildkite/scripts/deploy_branch.sh10-84
生产部署包括额外的安全措施,例如支付窗口检查和强制镜像验证。该过程更具限制性,并包含业务逻辑约束。
生产部署包含一项关键业务逻辑检查,可防止在支付处理窗口期间进行部署
生产部署流程
| 设置 | 值 | 目的 |
|---|---|---|
PRODUCTION_TAG | production-${WEB_TAG} | 生产镜像标签格式 |
DEPLOYMENT_FROM_CI | true | 指示 CI 触发部署的标志 |
| 支付窗口 | UTC 10:00-12:00 | 受限部署时间 |
来源:.buildkite/scripts/deploy_production.sh1-52
Nomad 编排需要特定的目录结构和权限配置,以便在不同环境中正常运行。
nomad/
├── staging/
│ ├── certs/
│ └── deploy_branch/
│ └── deploy.sh
├── production/
│ └── certs/
└── certs/
部署脚本确保正确的属主和权限:
buildkite-agent:buildkite-agentnomad/staging/certs, nomad/production/certs, nomad/certssudo mkdir -psudo chown -R目录权限流程
来源:.buildkite/scripts/deploy_branch.sh74-77 .buildkite/scripts/deploy_production.sh39-42
Nomad 编排与 Buildkite CI/CD 流水线紧密集成,作为预发布和生产环境的最终部署机制。
| 集成点 | 脚本 | 环境 | 触发器 |
|---|---|---|---|
| 分支部署 | deploy_branch.sh | 预发布 | 分支推送 |
| 生产部署 | deploy_production.sh | 生产 | 主分支 |
| Nomad 安装 | install_nomad.sh | 两者 | 预部署 |
部署脚本利用以下几个环境变量进行配置:
BUILDKITE_COMMIT:用于标记的源提交哈希BUILDKITE_BRANCH:用于部署识别的分支名称ECR_REGISTRY:Docker 注册表端点DEPLOYMENT_FROM_CI:CI 触发部署的标志CI/CD 到 Nomad 的集成
来源:.buildkite/scripts/deploy_branch.sh60-83 .buildkite/scripts/deploy_production.sh30-49