借助Rancher持续交付,3步实现金丝雀发布!

作者:微信小助手

发布时间:2021-04-23T19:57:27

点击上方卡片关注公众号并设为星标✨

即可及时获取K8S干货哟


从Rancher 2.5起,Rancher借助Fleet提供了大规模交付的GitOps功能,允许用户使用GitOps的方法管理其集群的状态。


金丝雀发布是一个被软件开发者广泛使用的方法,它可以用来向一部分用户发布新版本的应用程序,并根据可用性、延迟或自定义指标等指标来扩大规模,进而为更多用户提供服务。在本文中,我们将探索如何使用持续交付来为你的应用程序工作负载执行金丝雀发布。


实际的金丝雀发布将由一个名为Flagger的项目执行。Flagger作为Kubernetes operator运行。它允许用户指定一个自定义对象,该对象会通知Flagger观察一个部署并创建额外的主要部署(primary deployment)和金丝雀部署。作为本文的一部分,我们将使用Flagger与Istio作为服务网格。


简而言之,当我们创建一个部署时,Flagger会将该部署克隆到一个主部署。然后它修改与原始部署相关的服务以指向这个新的主部署。该主部署本身会被缩减到0。


Flagger使用Istio virtualservices来执行实际的金丝雀发布。当一个新版本的应用程序被部署时,Flagger将原始部署缩减到原始规格,并将金丝雀服务关联到部署。


现在,一定比例的流量被路由到这个金丝雀服务。基于预定义的指标,Flagger开始将越来越多的流量路由到这个金丝雀服务。一旦100%的流量被迁移到金丝雀服务,主部署就会以原始部署相同的规格重新创建。


接下来,将更新virtualservice以将100%的流量返回到主服务。在流量转换之后,原始部署被缩减为0,Flagger operator等待并监控后续的部署更新。


借助Flagger执行金丝雀发布


为了开始使用Flagger,我们需要执行以下操作:


  1. 设置监控和Istio

  2. 设置Flagger和flagger-loadtest

  3. 部署一个demo程序并执行金丝雀发布


1.设置监控和Istio


为了设置monitoringistio,我们将在持续交付中设置几个ClusterGroups


监控

         </ul>
         <pre class="code-snippet__js" data-lang="properties"><code style="box-sizing: border-box;"><span class="code-snippet_outer" style="box-sizing: border-box;"><span class="code-snippet__attr" style="box-sizing: border-box;">apiVersion</span>: <span class="code-snippet__string" style="box-sizing: border-box;">fleet.cattle.io/v1alpha1</span></span></code><code style="box-sizing: border-box;"><span class="code-snippet_outer" style="box-sizing: border-box;"><span class="code-snippet__attr" style="box-sizing: border-box;">kind</span>: <span class="code-snippet__string" style="box-sizing: border-box;">ClusterGroup</span></span></code><code style="box-sizing: border-box;"><span class="code-snippet_outer" style="box-sizing: border-box;"><span class="code-snippet__attr" style="box-sizing: border-box;">metadata</span>:<span class="code-snippet__string" style="box-sizing: border-box;"></span></span></code><code style="box-sizing: border-box;"><span class="code-snippet_outer" style="box-sizing: border-box;">  <span class="code-snippet__attr" style="box-sizing: border-box;">name</span>: <span class="code-snippet__string" style="box-sizing: border-box;">monitoring</span></span></code><code style="box-sizing: border-box;"><span class="code-snippet_outer" style="box-sizing: border-box;">  <span class="code-snippet__attr" style="box-sizing: border-box;">namespace</span>: <span class="code-snippet__string" style="box-sizing: border-box;">fleet-default</span></span></code><code style="box-sizing: border-box;"><span class="code-snippet_outer" style="box-sizing: border-box;"><span class="code-snippet__attr" style="box-sizing: border-box;">spec</span>:<span class="code-snippet__string" style="box-sizing: border-box;"></span></span></code><code style="box-sizing: border-box;"><span class="code-snippet_outer" style="box-sizing: border-box;">