当您需要在生产环境中安全稳妥地推出应用更新,同时希望全面监控发布效果时,可以基于服务网格ASM的Mixerless Telemetry技术实现渐进式灰度发布。该技术无侵入地收集业务容器的遥测数据,并通过Prometheus追踪关键监控指标。通过结合Flagger这一自动化发布工具,您可以实时监控Prometheus中的访问指标,精准控制灰度发布的流量比例,逐步将新版本部署至生产环境,有效降低线上故障风险,提升发布效率与用户使用体验。
前提条件
已使用Prometheus采集应用监控指标。具体操作,请参见基于Mixerless Telemetry实现服务网格的可观测性。
渐进式灰度发布流程
接入Prometheus,使Prometheus采集应用监控指标。
部署Flagger和Gateway。
部署flagger-loadtester,用于探测灰度发布阶段应用的Pod实例。
部署3.1.0版本的podinfo应用,作为示例应用。
部署HPA,设置当podinfo应用的CPU使用率达到99%时,容器会进行扩容。
部署Canary,设置当P99分布的数值持续30s达到500时,逐步按照10%的比例增加导向podinfo应用的流量。
Flagger会复制podinfo应用,生成一个名为podinfo-primary的应用。podinfo将作为灰度版本的Deployment,podinfo-primary将作为生产版本的Deployment。
升级podinfo,将灰度版本的podinfo应用升级为3.1.1版本。
Flagger监控Prometheus中访问指标控制灰度发布的流量。当P99分布的数值持续30s达到500时,Flagger逐步按照10%的比例增加导向3.1.1版本的podinfo应用的流量。同时HPA会根据灰度情况,逐步扩容podinfo的Pod,缩容podinfo-primary的Pod。
操作步骤
执行以下命令,部署Flagger。
alias k="kubectl --kubeconfig $USER_CONFIG" alias h="helm --kubeconfig $USER_CONFIG" cp $MESH_CONFIG kubeconfig k -n istio-system create secret generic istio-kubeconfig --from-file kubeconfig k -n istio-system label secret istio-kubeconfig istio/multiCluster=true h repo add flagger https://flagger.app h repo update k apply -f $FLAAGER_SRC/artifacts/flagger/crd.yaml h upgrade -i flagger flagger/flagger --namespace=istio-system \ --set crd.create=false \ --set meshProvider=istio \ --set metricsServer=http://prometheus:9090 \ --set istio.kubeconfig.secretName=istio-kubeconfig \ --set istio.kubeconfig.key=kubeconfig
部署网关规则。
使用以下内容,创建名为public-gateway的YAML文件。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: public-gateway namespace: istio-system spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"
执行以下命令,部署网关规则。
kubectl --kubeconfig <ASM kubeconfig的位置> apply -f resources_canary/public-gateway.yaml
执行以下命令,在ACK集群部署flagger-loadtester。
kubectl --kubeconfig <ACK kubeconfig的位置> apply -k "https://github.com/fluxcd/flagger//kustomize/tester?ref=main"
执行以下命令,在ACK集群部署podInfo和HPA。
kubectl --kubeconfig <ACK kubeconfig的位置> apply -k "https://github.com/fluxcd/flagger//kustomize/podinfo?ref=main"
在ACK集群部署Canary。
说明关于Canary的详细介绍,请参见How it works。
使用以下内容,创建名为podinfo-canary的YAML文件。
stepWeight
:设置逐步切流的百分比,本文设置为10。max
:设置P99分布的值。interval
:设置P99分布持续时间。
执行以下命令,部署Canary。
kubectl --kubeconfig <ACK kubeconfig的位置> apply -f resources_canary/podinfo-canary.yaml
执行以下命令,将podinfo从3.1.0升级到3.1.1版本。
kubectl --kubeconfig <ACK kubeconfig的位置> -n test set image deployment/podinfo podinfod=stefanprodan/podinfo:3.1.1
验证渐进式发布
执行以下命令,查看渐进式切流过程。
while true; do kubectl --kubeconfig <ACK kubeconfig的位置> -n test describe canary/podinfo; sleep 10s;done
预期输出:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Synced 39m flagger podinfo-primary.test not ready: waiting for rollout to finish: observed deployment generation less then desired generation
Normal Synced 38m (x2 over 39m) flagger all the metrics providers are available!
Normal Synced 38m flagger Initialization done! podinfo.test
Normal Synced 37m flagger New revision detected! Scaling up podinfo.test
Normal Synced 36m flagger Starting canary analysis for podinfo.test
Normal Synced 36m flagger Pre-rollout check acceptance-test passed
Normal Synced 36m flagger Advance podinfo.test canary weight 10
Normal Synced 35m flagger Advance podinfo.test canary weight 20
Normal Synced 34m flagger Advance podinfo.test canary weight 30
Normal Synced 33m flagger Advance podinfo.test canary weight 40
Normal Synced 29m (x4 over 32m) flagger (combined from similar events): Promotion completed! Scaling down podinfo.test
可以看到,流向3.1.1版本的podinfo应用的流量逐渐从10%切到40%。