分析Netflix公司产品Spinnaker的微服务实践

开发
Netflix 是业界微服务和 DevOps 组织的楷模,有大规模生产级微服务的成功实践。微服务有些公司甚至比 Netflix 做得更早,但 Netflix 大概是大规模生产级微服务做得最杰出的。

Netflix在开源社区有着非常大的贡献,发布了很多开源工具去做部署、打包等各种功能。Spinnaker 是 Netflix的一个开源项目,来做混合云环境部署,能够实现跨云平台的部署任务的编排。

[[342850]]

在 Netflix 使用 Spinnaker 每天发布 4000 次变更到亚马逊的机器上。谷歌云也在用 Spinnaker 去做部署。他们构建时也是用 Jenkins,其中有一个过程叫 bake,bake 是把应用打包成一个镜像,然后把这个镜像用 deploy 去做部署。Netflix 的 DevOps实践非常值得关注,他们也有很多项目和开源工具都值得一看。

 

本文主要分析Spinnaker其开发模式、持续集成、部署实践。

服务架构
Spinnaker 是由多个微服务组成的。Deck是前端页面;Gate是API网关Spinnaker UI和所有api调用程序都通过Gate与Spinnaker进行通信;Orca是编排引擎处理所有临时操作和管道;CloudDriver是负责对云提供商的所有变更调用,并索引/缓存所有已部署的资源;Front50用于保存应用程序,管道,项目和通知的元数据;Rosco生成镜像,它为各种云提供商生成不可变的VM映像;Igor用于通过Jenkins和Travis CI等系统中的持续集成作业来触发管道,并且它允许在管道中使用Jenkins / Travis阶段;Echo负责消息通知;Fiat负责用户权限管理;Kayenta为Spinnaker提供自动化的金丝雀分析;Halyard是Spinnaker生命周期配置管理工具。

 代码仓库管理
Spinnaker的微服务是每个微服务都创建一个代码库。大家可以访问Github上面spinnaker的仓库,里面每个微服务都有对应一个仓库管理代码。进入项目查看分支策略,主干分支开发,版本分支发布。

持续集成
使用的工具为GitHub Actions,这个ci文件中只有一个作业branch-build,主要是运行gradle构建。

 

.github/workflows/build.ymlCI文件内容如下:当master分支和version-*tag有提交时自动触发。通过env配置了gradle构建的参数。

  1. name: Branch Build 
  2. on:  push:    branches:    - master    - version-*env:  GRADLE_OPTS: -Dorg.gradle.daemon=false -Xmx2g -Xms2g 
  3. jobs:  branch-build:    # Only run this on repositories in the 'spinnaker' org, not on forks. 
  4.     if: startsWith(github.repository, 'spinnaker/'
  5.     runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v2 
  6.       # Install Java 8 for cross-compilation support. Setting it up before 
  7.       # Java 11 means it comes later in $PATH (because of how setup-java works) 
  8.       - uses: actions/setup-java@v1 
  9.         with
  10.           java-version: 8 
  11.       - uses: actions/setup-java@v1 
  12.         with
  13.           java-version: 11 
  14.       - uses: actions/cache@v1 
  15.         with
  16.           path: ~/.gradle 
  17.           key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} 
  18.           restore-keys: | 
  19.             ${{ runner.os }}-gradle- 
  20.       - name: Build 
  21.         run: ./gradlew -PenableCrossCompilerPlugin=true build --stacktrace 

应用部署
Spinnaker安装部署是一件令人头疼的事情,因为很多资源文件都是需要外面获取的。当我们把所需要的资源文件导入到国内后,其实就没有那么痛苦了。至少现在30分钟内部署一个spinnaker已经很现实了。(如果不算从阿里云镜像的pull时间,一个脚本5分钟内部署一个实例)

我们来看下这个版本文件,这里面记录了spinnaker产品所有的微服务版本信息。而halyard部署Spinnaker其实也是读取的这个文件,根据文件内容获取所需的资源。

  1. version: 1.19.4 
  2. timestamp'2020-04-03 08:01:05' 
  3. services: 
  4.   echo: 
  5.     version: 2.11.2-20200401121252 
  6.     commit: 5e2b673d1d658f88a3ae7741ab99cc0fd4a9df48 
  7.   clouddriver: 
  8.     version: 6.7.3-20200401190525 
  9.     commit: 77c774d185de42bb83dffde1f813f719f712994b 
  10.   deck: 
  11.     version: 3.0.2-20200324040016 
  12.     commit: 7c228ce82928f73a0f3051c4233242a6f87e0bec 
  13.   fiat: 
  14.     version: 1.10.1-20200401121252 
  15.     commit: aaebd07d8134d48630b056d6877a799a09ed282b 
  16.   front50: 
  17.     version: 0.22.1-20200401121252 
  18.     commit: ef1e7feff41797beb2d1695c1c3c0face550fe4b 
  19.   gate: 
  20.     version: 1.15.1-20200403040016 
  21.     commit: 365aa9fc5b1351207731c4445d7bbb79885d6da1 
  22.   igor: 
  23.     version: 1.9.2-20200401121252 
  24.     commit: 576235bcfce0c48bc139e9c94fe98b3467d3d170 
  25.   kayenta: 
  26.     version: 0.14.0-20200304112817 
  27.     commit: 85f590de74db46d54f016d88862418c990a17747 
  28.   orca: 
  29.     version: 2.13.2-20200401144746 
  30.     commit: 8460456e8380d370d1678b06acd015900a94f515 
  31.   rosco: 
  32.     version: 0.18.1-20200401121252 
  33.     commit: 9a20165e9c0d33e538d0038d5d02cb480e27f8c3 
  34.   defaultArtifact: {} 
  35.   monitoring-third-party: 
  36.     version: 0.16.2-20200228142642 
  37.     commit: 94c6e9cd3006347efe3101c0e6d8f98ce65f9053 
  38.   monitoring-daemon: 
  39.     version: 0.16.2-20200228142642 
  40.     commit: 94c6e9cd3006347efe3101c0e6d8f98ce65f9053 
  41. dependencies: 
  42.   redis: 
  43.     version: 2:2.8.4-2 
  44.   consul: 
  45.     version: 0.7.5 
  46.   vault: 
  47.     version: 0.7.0 
  48. artifactSources: 
  49.   debianRepository: https://dl.bintray.com/spinnaker-releases/debians 
  50.   dockerRegistry: gcr.io/spinnaker-marketplace 
  51.   googleImageProject: marketplace-spinnaker-release 
  52.   gitPrefix: https://github.com/spinnaker 

这是一个Yaml格式的文件, 顶部的version指的是Spinnaker的版本号;services下面包含每个服务的信息(版本,提交)。dependencies是spinnaker部署时所需要的依赖服务。我们来分析下每个服务中的version字段的作用,这个字段的作用很大。通过此字段指定Docker镜像标签和服务分支中配置文件的获取。

  1. echo: 
  2.     version: 2.11.2-20200401121252 

echo是spinnaker其中的一个微服务,负责消息通知。halyard会读取version-2.11.2标签中halconfig目录下的echo.yml配置文件,会下载gcr.io/spinnaker-marketplace/echo:2.11.2-20200401121252镜像。其他服务以此类推。

最后,我们执行hal deploy apply一键部署发布Spinnaker。

 

对于微服务模式的项目,很多细节可以借鉴Spinnaker的模式。例如:我们也可以在gitlab仓库中创建一个对应版本号的yaml文件,里面包含当前版本中每个微服务的镜像标签。准备发布的时候在Jenkins上面选择版本分支,然后根据版本分支中的版本号读取gitlab仓库中对应版本的yaml文件,然后一键部署。当需要回滚的时候,输入上个版本号同样的过程进行回滚。

 

想了解更多关于Spinnaker平台的最佳实践请点击 Spinnaker实践课程上线|实现多云环境持续交付 感谢您的支持!

 

责任编辑:姜华 来源: 今日头条
相关推荐

2017-09-05 14:05:11

微服务spring clou路由

2020-10-17 09:48:55

Spinnaker实践

2017-05-09 12:40:05

2021-12-02 16:20:17

开源微服务框架

2020-03-27 08:46:51

微服务服务网关

2016-07-12 17:29:40

Docker阿里云技术峰会

2023-10-27 18:47:35

微服务底层机制

2021-03-09 09:33:42

网关授权微服务

2023-04-04 14:40:46

2017-10-21 23:28:17

微服务架构师开发

2016-08-25 20:55:19

微服务架构发布

2016-08-25 21:12:31

微服务架构发布

2018-04-20 10:38:25

2022-05-12 07:37:51

单点登录微服务开源

2021-01-25 15:00:44

微服务分布式日志

2018-06-14 21:47:46

WOT沈剑58速运

2017-08-31 09:39:56

微服务架构演进

2013-03-06 09:26:20

云服务云实践精准管理

2021-05-14 09:15:32

SpringCloud微服务日志

2023-12-29 18:53:58

微服务Saga模式
点赞
收藏

51CTO技术栈公众号