分批发布是一种通用的发布方式,但是在Kubernetes集群中,要实现分批发布,需要控制各种状态,维护service流量,以及各种label配置,十分麻烦。阿里云容器服务提供一种基于 CRD 的分批发布方式,大大方便发布流程。

视频链接

使用kubectl进行分批发布

新集群默认安装了alicloud-application-controller,老集群请先手动安装,安装方式,

kubectl create -f alicloud-application-controller.yml

clipboard.png

我们这里以下面这个StatefulSet为例子演示分批发布的流程,

clipboard.png

这是一个含有三个实例的nginx 实例,为了暴露此容器,我们使用Service来暴露,Service的Yaml如下

clipboard.png

这里通过SLB 暴露nginx 服务。

为了保证用户的Yaml安全性,分批发布需要使用Secret来存储最终的yaml,这里需要将yaml执行一下base64操作,再存储。

这个是StatefulSet的Secret Yaml

clipboard.png

下面的为Service的Secret Yaml

clipboard.png

分别将上面的两个Secret 创建出来,kubectl create -f xxxxx

clipboard.png

可以看到两个Secret都已经创建完毕,下面就可以来创建分批发布的 CRD。分批发布的 CRD 格式如下,

clipboard.png

�aliyun.batchnum: 代表分几批发布,目前默认是2批

statefulSetSecretName: 表示存储StatefulSet的Secret 名称

serviceSecretName: 表示存储Service的Secret 名称

使用kubectl create -f xxx 创建此CRD分批发布

clipboard.png

可以看到,描述资源都已经创建出来了。

clipboard.png

可以看到,nginx 的StatefulSet和对应的Service 都已经创建出来,并且curl 是可以直接访问。

下面我们开始分批发布一个新版本的StatefulSet,这里我们新的StatefulSet Yaml 模板如下

clipboard.png

可以看到,新老StatefulSet的区别在于,更换了新版本的镜像。

同样,我们需要创建一个Secret 来存储这个新的StatefulSet

clipboard.png

然后我们更新刚才创建的 CRD,将statefulSetSecretName改成新的StatefulSet名称。

修改后的CRD Yaml 如下:

clipboard.png

clipboard.png

我们可以通过event 看到 CRD 的所有事件。同时可以看到,nginx的3个pod,已经有一个 pod发生了改变,变成了最新镜像,同时 curl对应的service,会发现流量已经指向了新的pod。这样用户就可以快速试错了。

下面我们来演示如何快速回滚,如果流量打到新的 pod后发现有问题,需要回滚,那么我们需要编辑CRD,

clipboard.png

将Status 的action 置为rollback 就可以快速回滚。

clipboard.png

可以看到原来web-2所在的pod已经被回滚到了老镜像,现在curl service 也都是老的服务了。

发布第二批

clipboard.png

发布第二批需要在action 置为continue 就可以

clipboard.png

可以看到StatefulSet的三个 pod都被更新了。

这个时候就可以确认发布了

clipboard.png

置为confirm 就确定了这次发布。

clipboard.png

可以看到,所有的确认版本历史都会被记录到secret里面,方便到时候跨版本回滚。

本文作者:xianlubird

阅读原文

本文为云栖社区原创内容,未经允许不得转载。


阿里云云栖号
27.8k 声望35.7k 粉丝

阿里云官网内容平台