灰度发布
灰度发布是可以帮助您渐进式更新Deployment的工具。它能结合Ingress Controller实现多版本共存,发布暂停,流量百分比切换,健康检查等功能,极大解放灰度发布过程中的手动操作,全自动化实现线上灰度流量切换。本文介绍灰度发布的概念和如何安装灰度发布组件。
什么是灰度发布?
灰度发布,又称金丝雀发布,是将应用的旧版本A与新版本B同时部署在环境中,业务请求可能会被路由到版本A的后端上,也可能会被路由到版本B的后端上。您可以自定义灰度发布策略,快速调整版本A和B的流量占比。
灰度发布可以在发布新版本应用时,自定义控制新版本应用流量比重,渐进式完成新版本应用的全量上线,最大限度地控制新版本发布带来的业务风险,降低故障带来的影响面,同时支持快速回滚。
图 1. 灰度发布流程图
安装灰度发布组件
您需要在ACK中安装对应的组件后才可以使用灰度发布功能。在灰度发布页面,直接通过单击开始安装即可实现对应的组件安装。
灰度发布是可以帮助您渐进式更新Deployment的工具。它能结合Ingress Controller实现多版本共存,发布暂停,流量百分比切换,健康检查等功能,极大解放灰度发布过程中的手动操作,全自动化实现线上灰度流量切换。本文介绍如何创建灰度发布。
前提条件
- 创建一个类型为Deployment的工作负载。有关具体操作,请参见创建无状态工作负载Deployment。
- 创建一个服务(Service)。有关具体操作,请参见管理服务。
- 创建一个路由(Ingress)。有关具体操作,请参见创建Ingress路由。
创建灰度发布
创建灰度发布时,您可以选择自动发布和手动发布两种灰度发布方式。文本介绍两种发布方式的高级选项特性。
背景信息
手动发布
自动发布
参数 | 描述 |
---|---|
权重调整步长 | 切换新的流量百分比。例如设置此参数为20,则说明新流量每次增加20%。 |
健康检查路径 | 在自动发布的过程中,填入一个URL地址。允许灰度发布控制器可以通过这个URL检查网络的连通性。此健康检查必须是一个HTTP模式的URL,且返回的HTTP Code必须是2xx才会认为是通过,否则就认为失败。 |
允许失败次数 | 需要配合健康检查路径来使用。如果健康检查失败次数超过了允许失败的次数,就会自动回滚。 |
超时时间 | 如果在自动发布过程中,新建Pod出现无法启动,或者健康检查卡住无法返回时超过设定的超时时间,就会认为发布失败。如果超过了允许失败的次数,系统就会触发自动回滚。 |
钉钉通知地址 | 生成的钉钉机器人Webhook。将Webhook填入到对应的钉钉通知地址。有关详情,请参见上述手动发布。 |
在使用灰度发布的手动发布方式的时候,您需要创建一个Ingress、Service和Deployment结构的应用。目前灰度发布只支持基于Deployment和Ingress的灰度发布。本文举例介绍使用手动发布方式的灰度发布流程。
步骤一:创建测试应用
本文使用以下YAML文件模板作为测试示例。该示例使用Deployment部署一个Web应用,并通过路由(Ingress)向外暴露服务(Service)。有关如何使用YAML模板创建应用的具体步骤,请参见通过编排模板创建Linux应用。
apiVersion: apps/v1
kind: Deployment
metadata:
name: podinfo
labels:
app: podinfo
spec:
replicas: 4
minReadySeconds: 5
revisionHistoryLimit: 5
progressDeadlineSeconds: 60
strategy:
rollingUpdate:
maxUnavailable: 1
type: RollingUpdate
selector:
matchLabels:
app: podinfo
template:
metadata:
labels:
app: podinfo
spec:
containers:
- name: podinfod
image: registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:green
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
protocol: TCP
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
timeoutSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: my-podinfo-svc
spec:
selector:
app: podinfo
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: podinfo
labels:
app: podinfo
spec:
rules:
- host: app.example.com
http:
paths:
- backend:
serviceName: my-podinfo-svc
servicePort: 80
步骤二:创建灰度发布
创建灰度发布时,设置上述创建的Deployment、Service、Ingress,然后设置发布方式为手动发布。有关创建灰度发布的具体操作,请参见创建灰度发布。
步骤三:执行灰度发布
初始化完毕后,就可以进行灰度发布。开始灰度发布前,您需要先更新一下应用。本文示例以更新镜像tag为例,修改镜像tag中的green为blue。先发布两个Pod为新版本,同时将新版本的灰度流量设置为10%。
查看历史记录
- 在灰度发布页面的历史记录区域,您可以查看所有创建的灰度发布的发布记录。
- 在每个创建的灰度发布详情页面下方的发布日志区域,查看发布的过程。