蓝/绿部署 VS 金丝雀部署

这篇具有很好参考价值的文章主要介绍了蓝/绿部署 VS 金丝雀部署。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

蓝/绿部署 VS 金丝雀部署

在云端或数据中心部署新版本的最佳方式

在生产环境中更新和配置应用程序通常是件令人望而生畏的事。面对如此多的可用选项,应如何选择最适合你的用例的部署策略?

部署策略用于升级或配置正在运行的应用程序。在下文中,我们将讨论三种部署策略:

  • 重建部署:在部署新版本之前,终止当前版本。
  • 蓝/绿部署:当前版本和新版本并行运行,然后将所有流量切换到新版本。
  • 金丝雀部署:新版本逐步向一小部分用户推出,之后发布供所有用户使用。

值得注意的是,还可通过许多其他方式来发布应用程序的新版本。你可点击此处,查看针对其中一部分方式进行的讨论。

在整篇文章中,我们将使用本地 Kubernetes 环境来演示所讨论的各种部署策略。

如果可以的话,你也可以使用云环境。

下文提到了演示所需的所有文件和命令,也可以在该项目的 Github 存储库中找到。

顺带一提,Ori Hoch 撰写的一篇博文已探讨了使用 Kubernetes 来支持 CI 构建(见第 1 部分和第 2 部分)。在这篇文章中,我们将更多地关注 CI/CD 的 CD 部分,也就是部署。

来看看我们的 Kubernetes YAML 文件:

version1-deployment.yml
——部署 6 个副本,运行一个简单的 Web 应用程序,呈现“版本 1

# version2-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-2
spec:
  selector:
      matchLabels:
      app: nginx 
      version: 'v1.1'
  replicas: 6
  template:
      metadata:
      labels:
      app: nginx
      version: 'v1.1'
      spec:
      containers:
      - name: nginx
      image: my_project/web-app:version2
      ports:
      - containerPort: 80

version2-deployment.yml
部署
——部署 6 个副本,运行一个简单的 Web 应用程序,呈现“版本 2”

# version2-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-2
spec:
  selector:
      matchLabels:
      app: nginx 
      version: 'v1.1'
  replicas: 6
  template:
      metadata:
      labels:
      app: nginx
      version: 'v1.1'
      spec:
      containers:
      - name: nginx
      image: my_project/web-app:version2
      ports:
      - containerPort: 80

production-service.yml
——我们应用程序的生产服务。用户将使用该服务访问应用程序的第一版本(version1)。

# production-service.yml

apiVersion: v1
kind: Service
metadata:
  name: production-service
spec:
  type: LoadBalancer
  selector:
      app: nginx
      version: 'v1.0'
  ports:
      - protocol: TCP
      port: 80
      targetPort: 80

重建部署(基本部署)

你有没有问过自己:“要部署我的应用程序,最糟糕的方式是什么?”

如果有,那么答案就是重建部署。

玩笑归玩笑,针对这种方法也有一些有效的用例。
例如,在并行运行多个版本的同时,升级基于微服务的复杂应用程序,可能会导致数据丢失或引发严重的网络问题。

采用这种方法后,在部署新版本之前必须完全关闭当前版本。在关闭当前版本直至完全部署好新版本期间,用户将经历停机时间。

在我们所讨论的所有部署策略中,重建部署是最易实现且成本最低的,但也是风险最大的。万一新版本出现严重 bug,所有用户都会注意到它,而且任何必要的回滚都将导致停机时间变得更长。

为何要使用这种部署策略?

  • 我的应用程序的数据很重要,我无法承担数据丢失或严重的网络问题后果
  • 我必须在启动新的应用程序之前运行迁移
  • 我的应用程序不支持多个版本并行运行
  • 我正在一个测试环境中工作
  • 用户只在特定时间段内使用我的应用程序(比如工作时间为 9:00-17:00 的客户服务应用程序)
  • 我的预算很低

优点:

  • 价格低廉
  • 易于实现
  • 增加用例

缺点:

  • 将发生停机
  • 生产风险高
  • 回滚速度慢

蓝/绿部署 VS 金丝雀部署
如需实现重建部署:

1.部署应用程序的第一版本

kubectl apply -f version1-deployment.yml && kubectl rollout status -f version1-deployment.yml

2.应用生产服务

kubectl apply -f production-service.yml

3.删除应用程序的第一版本

kubectl delete -f version1-deployment.yml

4.彻底删除第一版本后,部署应用程序的新版本

kubectl apply -f version2-deployment.yml && kubectl rollout status -f version2-deployment.yml

5.现在,剩下的工作就是更改服务以指向新版本

kubectl patch service production-service --patch '{"spec": {"selector": {"version": "v1.1"}}}'

如果你最大的担忧是停机时间,则考虑使用下一种方法。

蓝/绿部署

蓝绿部署,也称为“红黑部署”(如果你猜到是谁嵌入了这个术语,加一分*),是一种零停机时间部署策略,应用程序的当前版本(“蓝色”实例)和新版本(“绿色”实例)在生产环境中并行运行。两个版本同时运行,但公开的应用程序的服务仅指向当前版本。

在用户可以访问新版本之前,需要在环境中对其进行测试。当确定其满足所有要求后,剩下的工作就是更改应用程序的服务以指向绿色实例。

*(还没有猜到吗?答案是 Netflix!你可以点击此处查看更多相关信息。)

从此时起,旧版本作为新版本的备份,与其一起运行。万一发生故障,回滚很容易——只需将流量从绿色实例切换到蓝色实例。

部署成功并删除蓝色实例后,绿色实例将在下一次更新中充当蓝色实例。

蓝/绿部署 VS 金丝雀部署
应该何时使用这种部署策略?

  • 我不希望我的用户经历任何停机时间
  • 我可以快速、轻松地回滚到之前的版本
  • 我的基础设施是可扩展的,而且我可以把握同时运行两个应用程序的成本
  • 我想保存之前的版本,以供今后进行开发时使用

优点:

  • 零停机时间
  • 轻松、快速地回滚
  • 所有用户都体验同一版本(防止出现版本控制问题)
  • 允许对新、旧版本进行对比测试

缺点:

  • 基础设施成本可能会增加,因其需要两倍的资源
  • 可能不适合小的版本变更
  • 在将绿色实例发布到生产之前,需要对其进行测试和监控

如需实现蓝绿部署:

1.应用蓝色实例的部署

kubectl apply -f version1-deployment.yml && kubectl rollout status -f version1-deployment.yml

2.应用绿色实例的部署

kubectl apply -f version2-deployment.yml && kubectl rollout status -f version2-deployment.yml

3.应用生产服务

kubectl apply -f production-service.yml

4.就绿色实例运行测试

1.如果测试期间在新版本中发现了问题,删除新版本的部署,

kubectl delete -f version2-deployment.yml

并在重新部署之前修复应用程序的代码。

2.如果新版本测试成功,且该版本已准备就绪可用于生产,则更改服务以指向绿色实例

kubectl patch service production-service --patch '{"spec": {"selector": {"version": "v1.1"}}}' 

即可!

金丝雀部署

若采用金丝雀部署这种方法,在将应用程序新版本发布给所有用户之前,逐步向一小部分用户推出,以进行初始测试。此方法的目的是针对少量用户收集性能度量指标,并预测对用户的影响,以便进行全面部署。在这组用户使用了应用程序的新版本后,将收集和分析度量指标,以确定该版本是否已准备就绪可用于生产,是否需要推广到环境的其他部分(或到下一阶段),或者是否需要回滚以进一步排除故障。
这种策略最适用于测试结果不明确、不可靠或流量大小可能影响应用程序性能的情况。

蓝/绿部署 VS 金丝雀部署
金丝雀部署可以分两步或小阶段实现(例如,5% 的用户,到 25%,再到 50%……),当部署一个新的应用程序代码后,它将公开给多个用户。

与其他策略相比,这种方法带来的风险最低,因为它提供了控制。

你可以定义在每个阶段将转发到新版本的请求的确切百分比,因此,如果发生错误,只有少数用户会受到影响,并且你可以快速、毫不费力地执行回滚。

为了成功实现金丝雀部署,性能度量指标应该是明确的,并且两个版本应该在相同的条件下部署在同一环境中。

采用这种方法,可以选择针对自定义客户群部署新版本。你可以按用户的应用程序体验层级、所处地理位置或使用频率对用户进行排序。

做一个更好的应用程序,这一目标始终不变,但重要的是要考虑你希望通过金丝雀部署获得哪些信息,比如选择一个信任度高的子网,还是丧失客户信任的影响很小的子网。

使用金丝雀部署的一个缺点是,你必须同时管理应用程序的多个版本。甚至还可以在生产中同时运行两个以上的版本。但是,最好将同时运行的版本数量控制在最低限度。

你可以读一读 LaunchDarkly(一家专注于部署解决方案的公司)撰写的这篇博文,了解更多关于针对不同客户群推出不同版本这一做法的信息。

为何要使用这种部署策略?

  • 我不希望我的用户经历任何停机时间
  • 在我看来,用户的体验极其重要,我希望将他们在使用应用程序期间遇到 bug 的可能性降到最低。即使发现了 bug,也只有少数用户会受到影响
  • 应用程序的流量可能会影响应用程序的性能
  • 我当前的基础设施成本很高,无法使用更多资源
  • 我需要一些时间来监测新版本的效果

优点:

  • 零停机时间
  • 快速回滚
  • 基于真实的用户和用例进行测试
  • Bug 只会影响到少数用户
  • 无需额外的基础设施成本

缺点:

  • 推出速度慢
  • 需要对每个阶段进行测试和监控
  • 不易实现
  • 并非所有用户都能立即体验到新版本的功能

如需实现金丝雀部署:

实现金丝雀部署可采用的方法和工具有很多。下文提供了最简单的一种,无需任何附加工具即可使用。

1.部署应用程序第一版本的三个实例

kubectl apply -f version1-deployment.yml && kubectl rollout status -f version1-deployment.yml

2.应用生产服务

kubectl apply -f production-service.yml

3.将当前版本的实例数减少到 3

kubectl scale --replicas=3 -f version1-deployment.yml && kubectl rollout status -f version1-deployment.yml

4.就 3 个实例部署应用程序的新版本

kubectl apply -f version2-deployment.yml && kubectl scale --replicas=3 -f version2-deployment.yml && kubectl rollout status -f version2-deployment.yml

5.当 3 个实例为当前版本,3 个实例为新版本时,更改服务以指向两个版本。换言之,50% 的用户将访问新版本,50% 的用户将访问当前版本

kubectl patch service production-service --patch '{"spec": {"selector": {"version": null}}}'

6.对新版本的实例运行测试

1.如果在测试过程中发现新版本有问题,则回滚到之前的版本(删除新版本的部署,并将之前版本的实例数增加到原来的数目)

kubectl delete -f version2-deployment.yml && kubectl scale --replicas=6 -f version1-deployment.yml && kubectl rollout status -f version1-deployment.yml

2.如果该版本运行良好,则删除当前版本的部署,并将新版本的实例数增加到原来的数目,从而完成推出

kubectl delete -f version1-deployment.yml && kubectl scale --replicas=6 -f version2-deployment.yml && kubectl rollout status -f version2-deployment.yml 

金丝雀部署也带来了挑战。最大的障碍之一是管理服务和不同版本的组件之间的依赖关系。在某些情况下,有些旧版本组件仍然是应用程序的一部分,但新版本组件无法与此类组件很好地交互,反之亦然。因此,实现新旧版本间通信兼容并非易事。针对这一挑战,有几个不错的解决方案,但我们不会在此进行讨论,因为这将超出本文的范围。

结语

无论你是想在本地 Kubernetes 集群还是云环境中部署应用程序的新版本,都有多种部署方式可供选择,而最佳方式取决于你的需求和基础设施成本。

在将某个版本发布到开发/模拟环境时,或者当并行运行多个版本期间可能会出现应用程序性能问题时,重建部署是一个不错的选择。

对于生产环境,若基础设施成本不成问题(因为要求具备可提供双倍资源的能力),蓝/绿部署可能是你的最佳解决方案,但需要针对新应用程序运行适当的测试。

如果对软件的影响/稳定性没什么信心,对用户体验感到担忧,或者你的应用程序需要在某个可进行筛选(例如地理位置或体验层级)的特定客户群中测试某项新功能,那么你可能要使用金丝雀部署。

相关文章:

软件发布管理流程技巧

如何成功实现功能发布控制

点击了解 Incredibuild 的 CI/CD 加速的解决方案!
同时,Incredibuild 还有纯云 / 混合云的编译加速解决方案!

点击获取Incredibuild试用!
蓝/绿部署 VS 金丝雀部署文章来源地址https://www.toymoban.com/news/detail-460327.html

到了这里,关于蓝/绿部署 VS 金丝雀部署的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • KubeSphere实现金丝雀发布(Canary Release)

    KubeSphere 基于 [Istio] 向用户提供金丝雀发布功能,即: 引入服务的新版本,并向其发送一小部分流量来进行测试 同时,旧版本负责处理其余的流量 如果一切顺利,就可逐渐增加向新版本发送的流量,同时逐步停用旧版本 如出现任何问题,可用 KubeSphere 更改流量比例来回滚至

    2024年02月02日
    浏览(35)
  • K8S Nginx Ingress实现金丝雀发布

    通过给 Ingress 资源指定 Nginx Ingress 所支持的 annotation 可实现金丝雀发布。 需给服务创建2个 Ingress,其中 1个常规 Ingress , 另1个为带  nginx.ingress.kubernetes.io/canary: \\\"true\\\"  固定的 annotation 的 Ingress,称为 Canary Ingress。 Canary Ingress 一般代表新版本的服务,结合另外针对流量切分策

    2024年02月11日
    浏览(32)
  • 【K8s】¹版本回退升级&金丝雀发布

    为了更好的解决服务编排的问题, 我们可以使用Deployment控制器。这种控制器不直接管理pod,他通过ReplicaSet来管理pod。 目录 1.使用yaml文件形式,创建deployment 2.扩缩容 3.镜像更新 4.版本回退 5.金丝雀发布 金丝雀发布的优点 金丝雀发布的缺点 Deployment主要功能: 支持ReplicaSet的

    2024年02月03日
    浏览(31)
  • 1W字长文:蓝绿发布、金丝雀发布、滚动发布、A/B测试 原理和实操

    蓝绿发布、金丝雀发布、滚动发布、A/B测试 ,是大家日常常见的发布工作。所以 发布的原理和实操 是一个 非常、非常核心的面试知识点 。 在40岁老架构师 尼恩的 读者交流群 (50+)中,其相关面试题是一个非常、非常高频的交流话题。 只要一面试,基本就会问: 对灰度发布

    2024年02月04日
    浏览(38)
  • 数据放在云端和本地数据中心哪个安全?

    大数据时代,数据一定是最重要的。随着云计算技术和平台的广泛应用,开始有越来越多的用户挑选把数据存储在云平台上。那么关于用户来说,数据存放在云端更安全些,仍是放在本地的数据中心机房呢? 公有云平台里的数据 不管是对于企业还是用户而言,挑选一个大的公

    2024年02月11日
    浏览(45)
  • 玩转云端 | 拥有HBlock这项“存储盘活绝技”,数据中心也能“热辣瘦身”!

    夏天马上就要到了,“瘦身”不光是特定人群的需求,也是数据中心的需求。构建轻量化、低碳化、高性价比的新型数据中心,更有效地支撑经济社会数字化转型,已成为业界主流趋势。 如何让数据中心“热辣瘦身”? 轻量级存储集群控制器——天翼云存储资源盘活系统H

    2024年04月23日
    浏览(31)
  • 大数据:Hadoop HDFS,基础架构,去中心化,中心化模式,HDFS基础架构,虚拟机和云服务器部署HDFS

    2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库 这oracle比sql安全,强大多了,所以你需要学

    2024年02月17日
    浏览(40)
  • On-Premises (On-Prem) 介绍(公司自有硬件部署——自有物理设施内部署和管理IT基础设施,包括数据中心、服务器、网络硬件、存储设备等)(On-Prem与云服务的对比)私有化部署

    本文将简单介绍on-premises(常简称为on-prem)的概念、优缺点、以及与云服务的对比。 On-premises,通常被简称为on-prem,指的是在公司自有物理设施内部署和管理IT基础设施。这可能包括数据中心、服务器、网络硬件、存储设备等等 1 。 2.1 完全控制 对于on-prem部署,企业可以享有

    2024年02月04日
    浏览(44)
  • 编程探秘:Python深渊之旅-----云端部署(六)

    为了提高可访问性和性能,团队决定将他们的应用部署到云平台。龙带领团队探索不同的云服务提供商和部署策略。 龙 (自信地):将我们的应用部署到云端是一个明智的决策。云计算不仅提供可扩展性,还能让我们的应用全天候运行。 派超 (好奇地):听起来很棒,但我

    2024年01月17日
    浏览(33)
  • 支持私有部署的云端存储双链笔记软件

    大家好,我是 Java陈序员 。 我们无论是日常生活还是办公,常常需要使用一些工具软件来记录笔记、代办事项等。 今天,给大家介绍一款支持私有化部署、支持多端使用的笔记软件。 关注微信公众号:【Java陈序员】,获取 开源项目分享、AI副业分享、超200本经典计算机电子

    2024年04月24日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包