使用Spinnaker和Kayenta进行金丝雀发布的流水线(本地Kubernetes)

首先

我之前在本地环境中安装了Spinnaker和Kayenta。
https://qiita.com/sugimount/items/0627f99b1bdabf511927

我們將在Spinnaker上設定流水線,以進行CanaryRelease。

整体的外貌.

我们假设以下是在Kubernetes上提供某种服务时的配置。

1104_4301.png

在进行Spinnaker的金丝雀发布时,我们通过比较新版本(Version 2)和现有版本(Version 1)的度量指标来确认新版本没有问题。Netflix和Google作为开发Spinnaker的公司推荐采用基准线和金丝雀进行新的部署方法。
当然,可以使用在生产环境中运行的度量指标来进行比较,但由于长时间运行的生产环境和新创建的金丝雀之间的度量指标的可信度可能不同,因此推荐创建新的基准线配置。

1180_4341.png
1050_4131.png

構築流水线

创建应用

1428_7581.png
615_5051.png
1423_7571.png
1421_7581.png
1423_7611.png
1418_7521.png
1423_7211.png

创建CanaryConfig

1425_7581.png
1422_6901.png

本次将使用CPU指标进行金丝雀分析,以进行测试。
在实际的生产环境中,使用与应用程序行为相关的指标进行金丝雀分析是可行的。
对于Web应用程序,建议检查HTTP状态码、响应时间、异常数量和平均负载等。

1423_7521.png
1412_6741.png
607_2571.png
1587_7371.png
1587_5551.png
609_2441.png
1423_7581.png
1424_7541.png
1417_7041.png

请输入以下参数。

1581_7281.png
1578_6861.png
1443_7631.png
1434_7571.png

管道设置 初始设置

1427_7531.png
623_2401.png

根据Pipeline的整体设计,我们将创建以下步骤:
步骤1:部署基线版本和金丝雀版本的Deployment
步骤2:进行金丝雀分析
步骤3:如果金丝雀分析结果通过,则将生产环境替换为新版本
步骤4:删除基线版本和金丝雀版本

1422_7591.png
1420_7291.png
1429_7511.png
1419_7141.png
1420_7221.png
1434_7651.png

设置Pipeline的基准和金丝雀发布。

接下来,作为第一步,在Kubernetes集群上创建Canary和Baseline的Deployment。
在集群中已经存在作为生产环境的Service和Deployment。

1432_7531.png
1425_7611.png
1430_7601.png
1419_7621.png

粘贴Manifest文件的示例

- apiVersion: apps/v1beta2
  kind: Deployment
  metadata:
    labels:
      app: spinnaker
      source: demo
      stack: frontend
    name: spinnaker-canary
    namespace: default
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: spinnaker
        source: demo
    template:
      metadata:
        labels:
          app: spinnaker
          source: demo
      spec:
        containers:
          - envFrom:
              - configMapRef:
                  name: spinnaker-demo-config
            image: index.docker.io/sugimount/spin-kub-v2-demo
            name: primary
            ports:
              - containerPort: 80
            readinessProbe:
              httpGet:
                path: /
                port: 80
1425_7941.png
1421_7781.png
1415_7941.png
1426_8431.png
1420_8261.png
1425_8351.png
1437_7491.png
1431_8441.png
1411_8471.png
1431_8301.png
1441_7971.png
1414_8231.png
621_3391.png
1442_7741.png

请确保在”IMAGES”列中,正确使用了”baseline”和”canary”标签,以确保生成了正确的结果。

root@qicoo-k8s-master01(default kubernetes-admin):~# kubectl get deployments -o wide
NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS    IMAGES                                              SELECTOR
spinnaker-baseline   1         1         1            1           50s       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.27   app=spinnaker,source=demo
spinnaker-canary     1         1         1            1           50s       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.28   app=spinnaker,source=demo
spinnaker-prod       1         1         1            1           12h       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.27   app=spinnaker,source=demo
1440_7641.png

設置Pipeline的金絲雀分析。

1432_7901.png
1425_8491.png
1429_8561.png

输入金丝雀配置。

1418_8111.png
1437_7981.png
1431_8431.png
609_3321.png
1428_7021.png
1425_8451.png

设置管道并部署到生产环境。

1427_8261.png
1417_8181.png
1427_8551.png
1435_8731.png

删除流水线中的基准(Baseline)和金丝雀(Canary)配置。

1429_8351.png
1441_8481.png
1441_8101.png
1428_8231.png
1434_7751.png
1433_8071.png
1435_8341.png
615_3371.png

基线,金丝雀部署后的Kubernetes状态↓

root@qicoo-k8s-master01(default kubernetes-admin):~# kubectl get deployments -o wide
NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS    IMAGES                                              SELECTOR
spinnaker-baseline   1         1         1            1           49m       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.27   app=spinnaker,source=demo
spinnaker-canary     1         1         1            1           49m       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.28   app=spinnaker,source=demo
spinnaker-prod       1         1         1            1           13h       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.27   app=spinnaker,source=demo

将Prod更换为适用于Canary的镜像后↓

root@qicoo-k8s-master01(default kubernetes-admin):~# kubectl get deployments -o wide
NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS    IMAGES                                              SELECTOR
spinnaker-baseline   1         1         1            1           50m       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.27   app=spinnaker,source=demo
spinnaker-canary     1         1         1            1           50m       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.28   app=spinnaker,source=demo
spinnaker-prod       1         2         1            1           13h       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.28   app=spinnaker,source=demo

基准版本,在删除金丝雀版本之后↓

root@qicoo-k8s-master01(default kubernetes-admin):~# kubectl get deployments -o wide
NAME             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS    IMAGES                                              SELECTOR
spinnaker-prod   1         1         1            1           13h       primary       index.docker.io/sugimount/spin-kub-v2-demo:0.0.28   app=spinnaker,source=demo
1417_7081.png

总结

我們使用Spinnaker和Kayenta進行了Canary Release的Pipeline,但是我們仍然認為有以下問題存在。

    • Pipelineのコード化

 

    • CanaryAnalysisで利用するべきMetricの選択

 

    MetricをPassかFailか判断するときのアルゴリズムが不明。(どれくらいの差であればPassとなるのか?Marginは設定可能なのか?)

我考虑通过spincli进行Pipeline代码化以确认它的配置方法。由于在CanaryAnalysis中应使用的Metric与应用程序有很大的依赖性,因此我认为最好准备一个专用于应用程序的Exporter。我希望进一步讨论这个方法以及其他可能的方式。

广告
将在 10 秒后关闭
bannerAds