Spinnaker第三节-对接云实例

目录

前言:

Infrastructure与实例云对应关系

Spinnaker的Bake阶段

Spinnaker的金丝雀分析

持续集成全流程设计: 

部署策略

云平台差异性

注意事项:

1 伸缩规则的继承

2 线上服务不可中断

3 按量计费

常见问题:

1 实例创建后状态不能up

2 spinnaker对接AWS后无法正常启动

3 spinnaker对接国内云平台


前言:

前面博文介绍过spinnaker的能力和微服务设计,在系统架构中spinnaker到底如何正确打开呢?我打算花两篇来介绍下spinnaker在我们公司是如何使用的,事先说明这并不代表spinnaker只有这一种使用方式,它的pipeline设计真的是太灵活了。

Spinnaker支持多种云平台,我这里需要把实例云和容器云分开,因为这两种设计思想完全不同,本文先分享下实例云如何使用。

Infrastructure与实例云对应关系

Spinnaker中并没有维护强关联关系,而是通过application-stack-detail三段命名的方式来表示它们的关系。也就是说第一段名称相同的资源就属于同一个app,spinnaker对授权的控制是以app为单位的,所以要在使用spinnaker之前请对自己的产品命名做好规划。

Spinnaker中具有相同application-stack-detail的ServerGroup组成一个cluster,cluster代表某一个服务不同的软件版本。

Spinnaker中的ServerGroup对应云平台的自动伸缩组。

Spinnaker中的firewall对应云平台的安全组。

Spinnaker中的LoadBalance对应云平台的LoadBalance。

Spinnaker的Bake阶段

这个阶段刚接触时感觉非常陌生,我先解释下spinnaker的设计原理和baker实现机制。

Spinnaker的发布策略采用Immutable的方式,发布的交付物是镜像而不是软件包,没有软件包的上传、配置、部署、启动这些过程,只有基于镜像启动实例和销毁实例,用过k8s的同学应该不难理解这种发布方式的优势。

我们会预先制作几个公共基础镜像,里面预装了公共系统组件,然后每个业务线在此基础上完成除软件包以外的所有增量部分并制作成业务基础镜像。而spinnaker的baker阶段会利用packer基于业务基础镜像启动一个临时实例,执行预设的脚本(对于我来说就是更新软件包),然后重新导出为一个业务交付镜像。

Spinnaker的金丝雀分析

Spinnaker为我们提供了一套脱离业务适用于所有场景的测试机制:金丝雀分析。

步骤如下:

1 在spinnaker预配一些比对项目:CPU、内存、IO、Http请求、返回状态等,并为每一项分配一个权重,满分为100分。

2 通过deploy环节部署两个cluster,一个为基线集群,该集群镜像来自生产集群;一个为测试集群,该集群镜像就是待发布的镜像。这两个集群size一般都配置为1,LB都配置成线上的LB。

3 prometheus会采集到这两个新集群的各项指标,

4 spinnaker会去prometheus拉取监控数据按照步骤1的预设规则进行比对和打分。

5 环节最后会根据分数决定是直接发布失败、直接发布成功、还是进入人工干预。(我们配置的是75分以上成功,50分以下失败,50-75之间人工干预进行判断)

原理图:

报告图:

 

持续集成全流程设计: 

 

从研发在git中打tag,到软件版本上线可以完成全自动发布(spinnaker也支持人工审核环节和手动触发方式,根据管理要求酌情添加)

部署策略

Deploy环节是spinnaker最核心的环节,并提供了多种部署策略,我们最常用的有三种:

1 无策略:只是按配置创建一个新伸缩组,并不关心老伸缩组的状态。

2 Highlander:创建一个新伸缩组,然后销毁掉该cluster内的其它伸缩组。

3 Red/Black:创建一个新伸缩组,然后disable该cluster内的其它伸缩组,并不做销毁操作。

3和2区别在于,Red/Black可以在页面发起Rollback操作,因为老伸缩组还在,只是没有接入流量;而Highlander后无法Rollback,因为老伸缩组已经被销毁了。所以Red/Black用于部署生产环境,Highlander用于部署测试环境。

云平台差异性

Spinnaker在pipeline’中定义了多种stage,例如前面提到的bake和deploy就是stage的概念,stage是通过orca将clouddriver中对接云平台的一系列串行操作封装到一个环节内。但是并不是每一个stage都适用于所有云平台。所以在使用时请事先了解下云平台之间的差异性。

例如FindImageByTag,这个stage适用于AWS,但是不适用于Openstack和腾讯云,因为前者云平台镜像可以打tag,但是后者们的镜像不支持tag功能。

注意事项:

1 伸缩规则的继承

  自动伸缩组除开最基本的容量、实例类型、镜像、实例tag等配置之外,还会挂载伸缩策略、schedule、告警策略等高级配置,它们在每种云平台上叫法都不一样,但是功能都是一样的。我们在deploy的时候一定要注意把这些高阶配置复制到新的伸缩组中,否则每次软件迭代后这些配置将会丢失。

2 线上服务不可中断

  玩具和产品的区别是能否上生产,我们在使用spinnaker的部署策略或者是自己通过自定义pipeline来达到相同效果时,一定要注意先启动创建新伸缩组的实例后才能做LB的流量割接(这个spinnaker的红黑和highlander已经内置了该部分功能,这里强调这一点主要针对新接入的云平台),否则将会造成生产环境短暂的服务无响应。

3 按量计费

  Spinnaker发布思想是Immutable,所以决定了云平台上的每个实例生命周期都不会太长,在下一次软件版本发布时就被销毁重建了,所以spinnaker只支持按流量计费。如果你认为按流量计费要比包年包月计费贵很多,我只能回答你不一定。你只看到了包年包月的折扣,却没有看到弹性伸缩组对资源的超高利用率,所以关键看你怎么用。而按量计费才是云计算的正确使用方式。

常见问题:

1 实例创建后状态不能up

  说明实例伸缩组中的实例已成功创建,但是LB到这些实例的健康检查没通过。一般需要排查检查的端口和地址是否有误,还有安全组是否墙掉了健康检查端口。

2 spinnaker对接AWS后无法正常启动

  是个因为国内AWS与国外AWS的差异性引起的,因为spinnaker是google和Netflix的产品,所以直接对接国内的AWS有些水土不服。我已经修复了该部分功能并且上传到spinnaker-cn社区,具体可以参考:https://github.com/spinnaker-cn/clouddriver

3 spinnaker对接国内云平台

  Spinnaker-cn中已经对接了腾讯云,并已经在我们公司生产环境使用了。2019年8月份阿里云也会加入进来,预计9月份能上生产,我也会持续更新到https://github.com/spinnaker-cn项目中。

发布了168 篇原创文章 · 获赞 184 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/yejingtao703/article/details/99492433