使用Spinnaker和Kayenta进行金丝雀发布的流水线(本地Kubernetes)
首先
我之前在本地环境中安装了Spinnaker和Kayenta。
https://qiita.com/sugimount/items/0627f99b1bdabf511927
我們將在Spinnaker上設定流水線,以進行CanaryRelease。
整体的外貌.
我们假设以下是在Kubernetes上提供某种服务时的配置。
在进行Spinnaker的金丝雀发布时,我们通过比较新版本(Version 2)和现有版本(Version 1)的度量指标来确认新版本没有问题。Netflix和Google作为开发Spinnaker的公司推荐采用基准线和金丝雀进行新的部署方法。
当然,可以使用在生产环境中运行的度量指标来进行比较,但由于长时间运行的生产环境和新创建的金丝雀之间的度量指标的可信度可能不同,因此推荐创建新的基准线配置。
構築流水线
创建应用
创建CanaryConfig
本次将使用CPU指标进行金丝雀分析,以进行测试。
在实际的生产环境中,使用与应用程序行为相关的指标进行金丝雀分析是可行的。
对于Web应用程序,建议检查HTTP状态码、响应时间、异常数量和平均负载等。
请输入以下参数。
管道设置 初始设置
根据Pipeline的整体设计,我们将创建以下步骤:
步骤1:部署基线版本和金丝雀版本的Deployment
步骤2:进行金丝雀分析
步骤3:如果金丝雀分析结果通过,则将生产环境替换为新版本
步骤4:删除基线版本和金丝雀版本
设置Pipeline的基准和金丝雀发布。
接下来,作为第一步,在Kubernetes集群上创建Canary和Baseline的Deployment。
在集群中已经存在作为生产环境的Service和Deployment。
粘贴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
请确保在”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
設置Pipeline的金絲雀分析。
输入金丝雀配置。
设置管道并部署到生产环境。
删除流水线中的基准(Baseline)和金丝雀(Canary)配置。
基线,金丝雀部署后的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
总结
我們使用Spinnaker和Kayenta進行了Canary Release的Pipeline,但是我們仍然認為有以下問題存在。
-
- Pipelineのコード化
-
- CanaryAnalysisで利用するべきMetricの選択
- MetricをPassかFailか判断するときのアルゴリズムが不明。(どれくらいの差であればPassとなるのか?Marginは設定可能なのか?)
我考虑通过spincli进行Pipeline代码化以确认它的配置方法。由于在CanaryAnalysis中应使用的Metric与应用程序有很大的依赖性,因此我认为最好准备一个专用于应用程序的Exporter。我希望进一步讨论这个方法以及其他可能的方式。