
之前在思考双活/多活架构的时候,其实对于蓝绿发布是有一些了解的,也梳理过在底层存储是一份,服务是多份的模式有做过深入的分析。但那个时候对于Kubernetes的了解还不是很熟悉,是通过传统的方式来考量的。
因为现在的互联网公司基本都是上云了,我们也必须对于Kubernetes那一整套要有比较深入、熟悉的运用才能真的提高我们的效率。先聊一下,我为什么需要利用灰度+蓝绿发布的模式来去做?
现在有一个比较老的项目,应该在10年+,每天请求量大概在1.5亿+,峰值的QPS在6000/s,存在着比较多性能问题。现在需要在它上面新增一个服务,为了后面优化做准备,比如:请求的分流、限流、熔断、日志的上报与监控(新)、统一编码处理,特殊报文转换等。也就是说,只要你新增加了一层,你才有可能更好的去做更多的事情。
那么我们需要达到一些什么的基础条件了?
如果是你?针对于这2个基础的要求,你会如何去思考的你架构方案呢?
新增服务的思考:
I/O模型、线程模型、数据结构、算法等息息相关。比如:你在思考Redis单线程为什么快的时候?应该就很能get到这里的点了。解决这个问题,我们选择了Go语言来开发(当然,最熟悉的语言风险最小),为了保证性能,也是做了2轮非常细致的压测。502。如果说我在发布的过程中,我把滚动这一步省略掉,直接先准备好一份最新的,验证可以后,我一刀直接把流量引导最新服务上,老的服务也不会断掉,这是否就可以达到效果了?下面是我画的一个架构图,方便大家的理解,一共是3条路线:

http://static.cyblogs.com/如何利用k8s的label与ingress做蓝绿发布_架构图02.jpg
Ingress → Service:server-read → StatefulSet:server-g3-read + server-g3-read-gray,整条链路是通过ingress的指向与selector的标签:k8s-app:server-read。就是我只能让一少部分的流量进入到新的服务(2%~10%,支持慢慢调整,其实就是pod的数量占比)。
2%的概率走的路径:Ingress → Service:server-gateway-read01 → StatefulSet:server-gateway-read01 → 注册中心获取负载地址 → Service:server-read → StatefulSet:server-g3-read + server-g3-read-gray,整条链路是通过ingress的指向与selector的标签:server-app:server-gateway-read0198%的概率还是走的路线1Ingress → Service:server-gateway-read01 → StatefulSet:server-gateway-read01 → 注册中心获取负载地址 → Service:server-read → StatefulSet:server-g3-read + server-g3-read-gray。但是它的selector的标签:server-app:server-gateway-read02后面如果长期稳定后,方案2其实就没有必要再继续灰度了,直接就替换成线路3了。相当于是一个蓝绿+主备的模式了。优缺点非常的明显:
Graceful Shutdown优化。再温馨提示一下,因为做了蓝绿发布,我们的系统对应的配置中心应该也最好是要分开的。系统之间要避免蓝色通过与绿色通道之间的交叉访问等问题。