本文首发于:Jenkins 中文社区html
这是渐进式交付系列的第三篇文章,前两篇请参见:git
渐进式交付被 Netflix, Facebook 以及其它公司使用用来减轻部署的风险。 可是如今你能够在使用Jenkins X时采用它。github
渐进式交付是持续交付的下一步,它将新版本部署到用户的一个子集,并在将其滚动到所有用户以前对其正确性和性能进行评估,若是不匹配某些关键指标,则进行回滚。app
尤为是,咱们聚焦金丝雀发布,并让它在你的 Jenkins X 应用中变得易于采用。 金丝雀发布包括向应用程序的新版本发送一小部分流量,并在向其余用户发布以前验证这里没有错误。 Facebook 就是这样作的,首先向内部员工提供新版本,而后是一小部分用户,而后是其余全部用户,可是你要采用它并不须要成为 Facebook !less
你能够在 Martin Fowler 的网站阅读更多与金丝雀发布相关信息。性能
jx promote myapp --version 1.0 --env production
命令 promote 它到"生产"环境。 可是,在检查新版本是否失败的同时,它也能够自动并逐步地向必定比例的用户推出。 若是发生失败,应用程序将自动回滚。 整个过程当中彻底没有人为干预。注意:这个新功能是很是新的,在未来这些步骤将再也不须要,由于它们也将由 Jenkins X 自动化了。学习
做为第一步,三个 Jenkins X 插件须要被安装:网站
插件可使用以下命令安装(使用一个最近版本的 jx CLI ):spa
这将在 jx-production 命名空间启动 Istio 来进行指标收集。插件
如今获取 Istio ingress 的 IP ,并将一个通配符域名(如: *.example.com )指向它,以便咱们可使用它根据主机名路由多个服务。 Istio ingress 提供了金丝雀发布须要的路由能力(流量转移),传统的 Kubernetes ingress 对象不支持该功能。
集群被配置后,是时候配置咱们的应用了。 在 charts/myapp/templates
目录下向你的 helm chart 添加一个 canary.yaml。
而后往 charts/myapp/values.yaml
追加以下内容,将 myapp.example.com
修改成你的主机名或域名:
不久,当你从 Jenkins X 快速开始建立你的应用,将再也不须要修改 canary.yaml
和 values.yaml
这两个文件,由于它们默认启用金丝雀部署。
就这样!如今当使用 jx promote myapp --version 1.0 --env production
将你的应用 promote 到生产环境,它将执行一次金丝雀部署。 请注意,第一次被 promote 时,它不会执行金丝雀部署,由于它须要与之前的版本数据进行比较,但从第二次 promotion 开始,它将起做用。
根据上面 values.yaml
文件中的配置,它看起来像:
若是咱们配置的指标(请求持续时间超过 500 毫秒或超过 1% 的响应返回 500 错误)失败,Flagger 将注意到失败,而且若是重复 5 次,它将回滚此次发布,将 100% 的流量发送到旧版本。
得到金丝雀事件输出,执行以下命令:
为了可视化的目的,Flagger 包含一个 Grafana 面板,尽管它在金丝雀发布中不须要。 能够在本地经过 Kubernetes 端口转发访问它。
而后使用 admin/admin
访问 http://localhost:3000/,选择 canary-analysis
面板以及
jx-production
jx-production-myapp-primary
jx-production-myapp
它将为咱们提供当前版本和新版本的对比视图,视图中包含不一样指标(CPU,内存,请求持续时间,响应错误……)。
请注意 Istio 默认地将阻止从你的 Pod 访问外部集群(一种预计将在 Istio 1.1 中发生变化的行为)。 学习如何控制 Istio ingress 流量。
若是由于指标失败出现自动回滚,生产环境的 Jenkins X GitOps 仓库会过期,仍然使用新版本而不是旧版本。 这是计划在即将发布的版本中修复的内容。
译者:王冬辉