5.3.4 金丝雀发布

Deployment控制器还支持自定义控制更新过程中的滚动节奏,如“暂停”(pause)或“继续”(resume)更新操作,尤其是借助于前文讲到的maxSurge和maxUnavailable属性还能实现更为精巧的过程控制。比如,待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一小部分新版本的应用,主体部分还是旧的版本。然后,在根据用户特征精心筛选出小部分用户的请求路由至新版本的Pod应用,并持续观察其能否稳定地按期望的方式运行。确定没有问题后再继续完成余下Pod资源的滚动更新,否则立即回滚更新操作。这便是所谓的金丝雀发布(Canary Release),如图5-11所示。

扩展知识:矿井中的金丝雀

17世纪,英国矿井工人发现,金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯气体,金丝雀也会停止唱歌;当瓦斯含量超过一定限度时,人类依旧毫无察觉,而金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下,工人们每次下井都会带上一只金丝雀作为瓦斯检测工具,以便在危险情况下紧急撤离。

直接发布新应用版本的在线发布形式中,金丝雀发布是一种较为妥当的方式。不过,这里只涉及其部署操作的相关步骤,发布方式则通常依赖于具体的环境设置。接下来说明如何在Kubernetes上使用Deployment控制器实现金丝雀部署。

为了尽可能地降低对现有系统及其容量的影响,金丝雀发布过程通常建议采用“先添加、再删除,且可用Pod资源对象总数不低于期望值”的方式进行。首次添加的Pod对象数量取决于其接入的第一批请求的规则及单个Pod的承载能力,视具体需求而定,为了能够更简单的说明问题,接下来采用首批添加1个Pod资源的方式。将Deployment控制器的maxSurge属性的值设置为1,并将maxUnavailable属性的值设置为0:

**[terminal]
**[delimiter $ ]**[command kubectl patch deployment myapp-deploy -p '{"spec": {"strategy": {"rollingUpdate": {"maxSurge": 1, "maxUnavailable": 0}}}}']
deployment.apps/myapp-deploy patched

接下来,启动myapp-deploy控制器的更新过程,在修改相应容器的镜像版本后立即暂停更新进度,它会在启动第一批新版本Pod对象的创建操作之后转为暂停状态。需要注意的是,这里之所以能够在第一批更新启动后就暂停,有赖此前为maxReadySeconds属性设置的时长,因此用户要在更新命令后的此时长指定的时间范围内启动暂停操作,其执行过程如图5-12所示。当然,对kubectl命令来说,也可以直接以“&&”符号在Shell中连接两个命令:

**[terminal]
**[delimiter $ ]**[command kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 && \
kubectl rollout pause deployments myapp-deploy]
deployment.apps/myapp-deploy image updated
deployment.apps/myapp-deploy paused
暂停Deployment滚动更新
图 1.7.3.4 - 暂停Deployment滚动更新

通过其状态查看命令可以看到,在创建完一个新版本的Pod资源后滚动更新操作“暂停”:

**[terminal]
**[delimiter $ ]**[command kubectl rollout status deployment myapp-deploy]
Waiting for deployment "myapp-deploy" rollout to finish: 1 out of 3 new replicas have been updated...

相关的Pod列表也可能显示旧版本的ReplicaSet的所有Pod副本仍在正常运行,新版本的ReplicaSet也包含一个Pod副本,但最多不超过期望值1个,myapp-deploy原有的期望值为3,因此总数不超过4个。此时,通过Service或Ingress资源及相关路由策略等设定,即可将一部分用户的流量引入到这些Pod之上进行发布验证。运行一段时间后,如果确认没有问题,即可使用“kubectl rollout resume”命令继续此前的滚动更新过程:

**[terminal]
**[delimiter $ ]**[command kubectl rollout resume deployments myapp-deploy]
deployment.apps/myapp-deploy resumed

“kubectl rollout status”命令监控到滚动更新过程完成后,即可通过myapp-deploy控制器及其ReplicaSet和Pod对象的相关信息来了解其结果状态。

然而,如果“金丝雀”遇险甚至遭遇不幸,那么回滚操作便成了接下来的当紧任务。

results matching ""

    No results matching ""