L2 使用 Jenkins X 渐进式交付
Jenkins X 中金丝雀部署和蓝绿色部署的三种渐进式交付方案。
Shipper
为Jenkins X
构建的Helm
图表启用了蓝绿部署和多集群部署,但是对图表的内容有限制。你可以在staging
和生产环境之间做蓝绿部署。Istio
允许通过创建一个虚拟服务将一定比例的流量发送到staging
或预览环境。Flagger
构建在Istio
之上,并添加了金丝雀部署,可以根据指标自动进行滚动部署和回滚。Jenkins X
可以通过创建一个Canary
对象自动启用金丝雀功能,从而实现优雅的滚动部署,以升级到生产环境。
这里可以查看 Shipper、Isito 和 Flager 的示例代码。
1、Shipper
由于 Shipper
对创建的 Helm Chart
有多个限制,因此我必须对应用做一些更改。而且 Jenkins X
只从 master
分支构建 Helm
包,所以我们不能做 PRs
的滚动部署,只能对 master
分支做滚动部署。
应用标签不能包含发布名称,例如:app: {{ template “fullname” . }}
不起作用, 需要一些类似这样的标签:app: {{ .Values.appLabel }}
。
由 Jenkins X
生成的图表导致应用滚动失败,归因于生成的 templates/release.yaml
可能和 jenkins.io/releases CRD
冲突。
Chart croc-hunter-jenkinsx-0.0.58 failed to render:
could not decode manifest: no kind "Release" is registered for version "jenkins.io/v1"
我们只需要将 jx step changelog
更改为 jx step changelog -generate-yaml =false
,这样就不会生成文件。
在多集群环境,需要在 shipper
应用 yaml
中为 chartmuseum
和 docker registry
使用公开的 url
,以便其他集群可以发现管理集群服务来下载图表。
2、Istio
我们可以创建这个虚拟服务, 将所有进入 Ingress
网关的主机为 croc-hunter.istio.example.org
的请求的 1%
的流量发送到 Jenkins X
预览环境( PR 号为 35 )。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: croc-hunter-jenkinsx
namespace: jx-production
spec:
gateways:
- public-gateway.istio-system.svc.cluster.local
- mesh
hosts:
- croc-hunter.istio.example.com
http:
- route:
- destination:
host: croc-hunter-jenkinsx.jx-production.svc.cluster.local
port:
number: 80
weight: 99
- destination:
host: croc-hunter-jenkinsx.jx-carlossg-croc-hunter-jenkinsx-serverless-pr-35.svc.cluster.local
port:
number: 80
3、Flagger
我们可以为 Jenkins X
在 jx-production
命名空间中部署的图表创建一个 Canary
对象, 所有新的 Jenkins X
对 jx-production
的 promotions
每次将自动滚动 10%
, 如果出现任何失败,将自动回滚。
apiVersion: flagger.app/v1alpha2
kind: Canary
metadata:
# canary name must match deployment name
name: jx-production-croc-hunter-jenkinsx
namespace: jx-production
spec:
# deployment reference
targetRef:
apiVersion: apps/v1
kind: Deployment
name: jx-production-croc-hunter-jenkinsx
# HPA reference (optional)
# autoscalerRef:
# apiVersion: autoscaling/v2beta1
# kind: HorizontalPodAutoscaler
# name: jx-production-croc-hunter-jenkinsx
# the maximum time in seconds for the canary deployment
# to make progress before it is rollback (default 600s)
progressDeadlineSeconds: 60
service:
# container port
port: 8080
# Istio gateways (optional)
gateways:
- public-gateway.istio-system.svc.cluster.local
# Istio virtual service host names (optional)
hosts:
- croc-hunter.istio.example.com
canaryAnalysis:
# schedule interval (default 60s)
interval: 15s
# max number of failed metric checks before rollback
threshold: 5
# max traffic percentage routed to canary
# percentage (0-100)
maxWeight: 50
# canary increment step
# percentage (0-100)
stepWeight: 10
metrics:
- name: istio_requests_total
# minimum req success rate (non 5xx responses)
# percentage (0-100)
threshold: 99
interval: 1m
- name: istio_request_duration_seconds_bucket
# maximum req duration P99
# milliseconds
threshold: 500
interval: 30s