分批发布是一种通用的发布方式,但是在Kubernetes集群中,要实现分批发布,需要控制各种状态,维护service流量,以及各种label配置,十分麻烦。阿里云容器服务提供一种基于 CRD 的分批发布方式,大大方便发布流程。
使用kubectl进行分批发布
新集群默认安装了alicloud-application-controller,老集群请先手动安装,安装方式,
kubectl create -f alicloud-application-controller.yml

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

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

这里通过SLB 暴露nginx 服务。
为了保证用户的Yaml安全性,分批发布需要使用Secret来存储最终的yaml,这里需要将yaml执行一下base64操作,再存储。
这个是StatefulSet的Secret Yaml

下面的为Service的Secret Yaml

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

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

�aliyun.batchnum: 代表分几批发布,目前默认是2批
statefulSetSecretName: 表示存储StatefulSet的Secret 名称
serviceSecretName: 表示存储Service的Secret 名称
使用kubectl create -f xxx 创建此CRD分批发布

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

可以看到,nginx 的StatefulSet和对应的Service 都已经创建出来,并且curl 是可以直接访问。
下面我们开始分批发布一个新版本的StatefulSet,这里我们新的StatefulSet Yaml 模板如下

可以看到,新老StatefulSet的区别在于,更换了新版本的镜像。
同样,我们需要创建一个Secret 来存储这个新的StatefulSet

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


我们可以通过event 看到 CRD 的所有事件。同时可以看到,nginx的3个pod,已经有一个 pod发生了改变,变成了最新镜像,同时 curl对应的service,会发现流量已经指向了新的pod。这样用户就可以快速试错了。
下面我们来演示如何快速回滚,如果流量打到新的 pod后发现有问题,需要回滚,那么我们需要编辑CRD,

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

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

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

可以看到StatefulSet的三个 pod都被更新了。
这个时候就可以确认发布了

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

可以看到,所有的确认版本历史都会被记录到secret里面,方便到时候跨版本回滚。
本文作者:xianlubird
本文为云栖社区原创内容,未经允许不得转载。
网友评论