当前位置: 首页 > 科技观察

Netflix产品Spinnaker微服务实践分析

时间:2023-03-15 22:43:54 科技观察

Netflix对开源社区的贡献很大,发布了很多部署、打包等功能的开源工具。Spinnaker是Netflix的一个开源项目,用于混合云环境部署,可以实现跨云平台部署任务的编排。Netflix使用Spinnaker每天向Amazon的机器发布4000次更改。谷歌云也使用Spinnaker进行部署。他们在build的时候也是用Jenkins,有一个过程叫做bake。bake是将应用打包成镜像,然后使用deploy部署镜像。Netflix的DevOps实践很有意思,他们也有很多值得一看的项目和开源工具。本文主要分析Spinnaker的开发模型、持续集成和部署实践。服务架构Spinnaker由多个微服务组成。deck为前端页面;Gate是SpinnakerUI的API网关,所有的api调用程序都通过Gate与Spinnaker通信;Orca是处理所有临时操作和管道的编排引擎;CloudDriver负责对云提供商的所有更改调用和索引/缓存所有已部署的资源;Front50用于保存应用程序、管道、项目和通知的元数据;RoscoGenerateMirror,为各种云提供商生成不可变的VM映像;Igor用于通过Jenkins和TravisCI等系统中的持续集成作业来触发管道,它允许在管道中使用Jenkins/Travis阶段;echo负责消息通知;法币负责用户权限管理;Kayenta为Spinnaker提供自动化金丝雀分析;Halyard是Spinnaker生命周期配置管理工具。代码仓库管理Spinnaker的微服务为每个微服务创建一个代码仓库。可以访问Github上的spinnaker仓库,这里每个微服务都有对应的仓库管理代码。进入项目查看分支策略,主分支开发,版本分支发布。用于持续集成的工具是GitHubActions。这个ci文件中只有一个jobbranch-build,主要运行gradlebuild。.github/workflows/build.ymlCI文件内容如下:提交master分支和version-*tag时自动触发。gradle构建的参数是通过env配置的。名称:BranchBuildon:推送:分支:-master-version-*env:GRADLE_OPTS:-Dorg.gradle.daemon=false-Xmx2g-Xms2gjobs:branch-build:#Onlyrunthisonrepositoriesinthe'spinnaker'org,notonforks.if:startsWith(github.存储库,'spinnaker/')runs-on:ubuntu-lateststeps:-uses:actions/checkout@v2#InstallJava8f??orcross-compilationsupport.Settingitupbefore#Java11meansitcomeslaterin$PATH(因为howsetup-javaworks)-uses:actions/setup-java@v1with:java-version:8-uses:actions/setup-java@v1with:java-version:11-uses:actions/cache@v1with:path:~/.gradlekey:${{runner.os}}-gradle-${{hashFiles('**/*.gradle')}}restore-keys:|${{runner.os}}-gradle--name:Buildrun:./gradlew-PenableCrossCompilerPlugin=truebuild--stacktrace应用部署Spinnaker安装部署很头疼,因为很多资源文件需要从外部获取。当我们把需要的资源文件导入国内的时候,其实并没有那么痛苦。在30分钟内部署大三角帆至少目前是现实的。(如果不算从阿里云镜像拉取时间,一个脚本5分钟内部署一个实例)我们来看这个版本文件,里面记录了spinnaker产品所有的微服务版本信息。Spinnaker的halyarddeployment实际上就是读取这个文件,根据文件的内容获取需要的资源。version:1.19.4timestamp:'2020-04-0308:01:05'services:echo:version:2.11.2-20200401121252commit:5e2b673d1d658f88a3ae7741ab99cc0fd4a9df48clouddriver:version:6.7.3-20200401190525commit:77c774d185de42bb83dffde1f813f719f712994bdeck:version:3.0.2-20200324040016commit:7c228ce82928f73a0f3051c4233242a6f87e0becfiat:version:1.10.1-20200401121252commit:aaebd07d8134d48630b056d6877a799a09ed282bfront50:version:0.22.1-20200401121252commit:ef1e7feff41797beb2d1695c1c3c0face550fe4bgate:version:1.15.1-20200403040016commit:365aa9fc5b1351207731c4445d7bbb79885d6da1igor:version:1.9.2-20200401121252commit:576235bcfce0c48bc139e9c94fe98b3467d3d170kayenta:version:0.14.0-20200304112817commit:85f590de74db46d54f016d88862418c990a17747orca:version:2.13.2-20200401144746commit:8460456e8380d370d1678b06acd015900a94f515rosco:version:0.18.1-20200401121252commit:9a20165e9c0d33e538d0038d5d02cb480e27f8c3defaultArtifact:{}monitoring-third-party:version:0.16.2-20200228142642commit:94c6e9cd3006347efe3101c0e6d8f98ce65f9053monitoring-daemon:version:0.16.2-20200228142642commit:94c6e9cd3006347efe3101c0e6d8f98ce65f9053dependencies:redis:version:2:2.8.4-2consul:version:0.7.5vault:version:0.7.0artifactSources:debianRepository:https://dl.bintray.com/spinnaker-releases/debiansdockerRegistry:gcr.io/spinnaker-marketplacegoogleImageProject:marketplace-spinnaker-releasegitPrefix:https://github.com/spinnaker这是一个yaml格式的文件,最上面的version是指Spinnaker的版本号;underservices包含每个服务的信息(版本、提交)。dependencies是spinnaker部署所需的依赖服务。我们来分析一下version字段在各个服务中的作用,这个很重要。使用该字段指定获取Docker镜像标签和服务分支中的配置文件。echo:version:2.11.2-20200401121252echo是spinnaker的微服务之一,负责消息通知。halyard会读取version-2.11.2标签下halconfig目录下的echo.yml配置文件,下载gcr.io/spinnaker-marketplace/echo:2.11.2-20200401121252镜像。等等其他服务。最后我们执行haldeployapply一键部署发布Spinnaker。对于微服务模式下的项目,很多细节可以借鉴Spinnaker模型。例如:我们也可以在gitlab仓库中创建一个版本号对应的yaml文件,里面包含了当前版本中各个微服务的镜像标签。准备发布时,在Jenkins上选择版本分支,然后根据版本分支中的版本号读取gitlab仓库中对应版本的yaml文件,然后一键部署。当需要回滚时,输入与之前版本号相同的流程回滚。了解更多Spinnaker平台最佳实践,请点击Spinnaker实践课程在线|实现多云环境下的持续交付感谢您的支持!