金丝雀部署
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
金丝雀部署是一种流行的持续部署策略,其中一小部分服务器群组会更新到你的应用程序的新版本。
在采用持续交付时,组织需要决定使用哪种类型的部署策略。最受欢迎的策略之一是金丝雀部署,其中一小部分服务器群组首先更新到新版本。这个子集,即金丝雀,然后充当着众所周知的煤矿里的金丝雀的角色。
如果新版本的应用程序出现问题,只有一小部分用户会受到影响,并且可以修复或快速回滚更改。
使用场景
当你只想将功能发布到部分 Pod 群组,并观察当一部分用户访问临时部署的功能时它们的行为时,可以使用金丝雀部署。如果一切正常,你可以将功能部署到生产环境,知道它不会造成任何问题。
金丝雀部署对于后端重构、性能改进或其他用户界面不变但你想确保性能保持或提高的更改特别重要。开发人员在使用金丝雀部署处理面向用户的更改时需要小心,因为默认情况下,来自同一用户的请求会随机分配到金丝雀和非金丝雀 Pod,这可能导致混淆甚至错误。如果需要,你可能需要考虑在 Kubernetes 服务定义中将 service.spec.sessionAffinity 设置为 ClientIP,但这超出了本文档的范围。
使用 Canary Ingress 进行高级流量控制
使用Canary Ingress,金丝雀部署可以更加战略性,这是一个高级流量路由服务,根据权重、会话、cookies 等因素控制稳定部署和金丝雀部署之间的传入 HTTP 请求。GitLab 在其自动部署架构中使用此服务,让用户能够快速、安全地推出新的部署。
如何在金丝雀部署中设置 Canary Ingress
如果你的自动 DevOps 管道使用 auto-deploy-image 的 v2.0.0+,则会默认安装 Canary Ingress。当你创建新的金丝雀部署时,Canary Ingress 可用,当金丝雀部署升级到生产环境时,它会被销毁。
以下是从零开始的设置流程示例:
- 准备一个启用 Auto DevOps 的项目。
- 在你的项目中设置一个Kubernetes 集群。
- 在你的集群中安装NGINX Ingress。
- 根据上面分配的 Ingress 端点设置基础域名。
- 检查你的自动 DevOps 管道是否使用了
auto-deploy-image的v2.0.0+。如果没有,请按照文档指定镜像版本。 - 运行一个新的自动 DevOps 管道,并确保
production作业成功并创建生产环境。 - 为自动 DevOps 管道配置一个
canary部署作业。 - 运行一个新的自动 DevOps 管道,并确保
canary作业成功并创建带有 Canary Ingress 的金丝雀部署。
在部署板上显示 Canary Ingress 部署(已弃用)
此功能在 GitLab 14.5 中已弃用。
要查看金丝雀部署,你必须正确配置部署板:
- 按照启用部署板的步骤操作。
- 要跟踪金丝雀部署,你必须用
track: canary标记你的 Kubernetes 部署和 Pod。为了快速开始,你可以使用 GitLab 提供的自动部署模板进行金丝雀部署。
根据部署的不同,标签应该是 stable 或 canary。如果标签为空或缺失,GitLab 假设跟踪标签是 stable。任何其他跟踪标签都被视为 canary(临时)。这允许 GitLab 发现部署是稳定的还是金丝雀(临时)。
配置部署板后,管道至少运行一次,转到 Pipelines > Environments 下的环境页面。当管道执行时,部署板会清楚地标记金丝雀 Pod,让你能够快速、清晰地了解每个环境和部署的状态。
金丝雀部署在部署板上用黄点标记,以便你能快速注意到它们。
如何检查 Canary Ingress 上的当前流量权重(已弃用)
此功能在 GitLab 14.5 中已弃用。
-
访问部署板。
-
查看右侧的当前权重。
如何更改 Canary Ingress 上的流量权重(已弃用)
此功能在 GitLab 14.5 中已弃用。
你可以使用GraphiQL或向GraphQL API发送请求来更改环境中部署板的流量权重。
要使用你的部署板:
- 转到项目的 Operate > Environments。
- 使用右侧的下拉列表设置新权重。
- 确认你的选择。
以下是使用GraphiQL的示例:
-
执行
environmentsCanaryIngressUpdateGraphQL 变异:mutation { environmentsCanaryIngressUpdate(input:{ id: "gid://gitlab/Environment/29", # 你的环境 ID。你可以从环境页面的 URL 获取 ID。 weight: 45 # 新的流量权重。例如,如果你设置 `45`,则 45% 的流量流向金丝雀部署,55% 的流量流向稳定部署。 }) { errors } } -
如果请求成功,
errors响应将包含一个空数组。GitLab 会向你的 Kubernetes 集群发送一个PATCH请求,以更新 Canary Ingress 上的权重参数。