分析Netflix公司產(chǎn)品Spinnaker的微服務(wù)實踐
Netflix在開源社區(qū)有著非常大的貢獻(xiàn),發(fā)布了很多開源工具去做部署、打包等各種功能。Spinnaker 是 Netflix的一個開源項目,來做混合云環(huán)境部署,能夠?qū)崿F(xiàn)跨云平臺的部署任務(wù)的編排。
在 Netflix 使用 Spinnaker 每天發(fā)布 4000 次變更到亞馬遜的機(jī)器上。谷歌云也在用 Spinnaker 去做部署。他們構(gòu)建時也是用 Jenkins,其中有一個過程叫 bake,bake 是把應(yīng)用打包成一個鏡像,然后把這個鏡像用 deploy 去做部署。Netflix 的 DevOps實踐非常值得關(guān)注,他們也有很多項目和開源工具都值得一看。
本文主要分析Spinnaker其開發(fā)模式、持續(xù)集成、部署實踐。
服務(wù)架構(gòu)
Spinnaker 是由多個微服務(wù)組成的。Deck是前端頁面;Gate是API網(wǎng)關(guān)Spinnaker UI和所有api調(diào)用程序都通過Gate與Spinnaker進(jìn)行通信;Orca是編排引擎處理所有臨時操作和管道;CloudDriver是負(fù)責(zé)對云提供商的所有變更調(diào)用,并索引/緩存所有已部署的資源;Front50用于保存應(yīng)用程序,管道,項目和通知的元數(shù)據(jù);Rosco生成鏡像,它為各種云提供商生成不可變的VM映像;Igor用于通過Jenkins和Travis CI等系統(tǒng)中的持續(xù)集成作業(yè)來觸發(fā)管道,并且它允許在管道中使用Jenkins / Travis階段;Echo負(fù)責(zé)消息通知;Fiat負(fù)責(zé)用戶權(quán)限管理;Kayenta為Spinnaker提供自動化的金絲雀分析;Halyard是Spinnaker生命周期配置管理工具。
代碼倉庫管理
Spinnaker的微服務(wù)是每個微服務(wù)都創(chuàng)建一個代碼庫。大家可以訪問Github上面spinnaker的倉庫,里面每個微服務(wù)都有對應(yīng)一個倉庫管理代碼。進(jìn)入項目查看分支策略,主干分支開發(fā),版本分支發(fā)布。
持續(xù)集成
使用的工具為GitHub Actions,這個ci文件中只有一個作業(yè)branch-build,主要是運行g(shù)radle構(gòu)建。
.github/workflows/build.ymlCI文件內(nèi)容如下:當(dāng)master分支和version-*tag有提交時自動觸發(fā)。通過env配置了gradle構(gòu)建的參數(shù)。
- name: Branch Build
- on: push: branches: - master - version-*env: GRADLE_OPTS: -Dorg.gradle.daemon=false -Xmx2g -Xms2g
- jobs: branch-build: # Only run this on repositories in the 'spinnaker' org, not on forks.
- if: startsWith(github.repository, 'spinnaker/')
- runs-on: ubuntu-latest steps: - uses: actions/checkout@v2
- # Install Java 8 for cross-compilation support. Setting it up before
- # Java 11 means it comes later in $PATH (because of how setup-java works)
- - uses: actions/setup-java@v1
- with:
- java-version: 8
- - uses: actions/setup-java@v1
- with:
- java-version: 11
- - uses: actions/cache@v1
- with:
- path: ~/.gradle
- key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
- restore-keys: |
- ${{ runner.os }}-gradle-
- - name: Build
- run: ./gradlew -PenableCrossCompilerPlugin=true build --stacktrace
應(yīng)用部署
Spinnaker安裝部署是一件令人頭疼的事情,因為很多資源文件都是需要外面獲取的。當(dāng)我們把所需要的資源文件導(dǎo)入到國內(nèi)后,其實就沒有那么痛苦了。至少現(xiàn)在30分鐘內(nèi)部署一個spinnaker已經(jīng)很現(xiàn)實了。(如果不算從阿里云鏡像的pull時間,一個腳本5分鐘內(nèi)部署一個實例)
我們來看下這個版本文件,這里面記錄了spinnaker產(chǎn)品所有的微服務(wù)版本信息。而halyard部署Spinnaker其實也是讀取的這個文件,根據(jù)文件內(nèi)容獲取所需的資源。
- version: 1.19.4
- timestamp: '2020-04-03 08:01:05'
- services:
- echo:
- version: 2.11.2-20200401121252
- commit: 5e2b673d1d658f88a3ae7741ab99cc0fd4a9df48
- clouddriver:
- version: 6.7.3-20200401190525
- commit: 77c774d185de42bb83dffde1f813f719f712994b
- deck:
- version: 3.0.2-20200324040016
- commit: 7c228ce82928f73a0f3051c4233242a6f87e0bec
- fiat:
- version: 1.10.1-20200401121252
- commit: aaebd07d8134d48630b056d6877a799a09ed282b
- front50:
- version: 0.22.1-20200401121252
- commit: ef1e7feff41797beb2d1695c1c3c0face550fe4b
- gate:
- version: 1.15.1-20200403040016
- commit: 365aa9fc5b1351207731c4445d7bbb79885d6da1
- igor:
- version: 1.9.2-20200401121252
- commit: 576235bcfce0c48bc139e9c94fe98b3467d3d170
- kayenta:
- version: 0.14.0-20200304112817
- commit: 85f590de74db46d54f016d88862418c990a17747
- orca:
- version: 2.13.2-20200401144746
- commit: 8460456e8380d370d1678b06acd015900a94f515
- rosco:
- version: 0.18.1-20200401121252
- commit: 9a20165e9c0d33e538d0038d5d02cb480e27f8c3
- defaultArtifact: {}
- monitoring-third-party:
- version: 0.16.2-20200228142642
- commit: 94c6e9cd3006347efe3101c0e6d8f98ce65f9053
- monitoring-daemon:
- version: 0.16.2-20200228142642
- commit: 94c6e9cd3006347efe3101c0e6d8f98ce65f9053
- dependencies:
- redis:
- version: 2:2.8.4-2
- consul:
- version: 0.7.5
- vault:
- version: 0.7.0
- artifactSources:
- debianRepository: https://dl.bintray.com/spinnaker-releases/debians
- dockerRegistry: gcr.io/spinnaker-marketplace
- googleImageProject: marketplace-spinnaker-release
- gitPrefix: https://github.com/spinnaker
這是一個Yaml格式的文件, 頂部的version指的是Spinnaker的版本號;services下面包含每個服務(wù)的信息(版本,提交)。dependencies是spinnaker部署時所需要的依賴服務(wù)。我們來分析下每個服務(wù)中的version字段的作用,這個字段的作用很大。通過此字段指定Docker鏡像標(biāo)簽和服務(wù)分支中配置文件的獲取。
- echo:
- version: 2.11.2-20200401121252
echo是spinnaker其中的一個微服務(wù),負(fù)責(zé)消息通知。halyard會讀取version-2.11.2標(biāo)簽中halconfig目錄下的echo.yml配置文件,會下載gcr.io/spinnaker-marketplace/echo:2.11.2-20200401121252鏡像。其他服務(wù)以此類推。
最后,我們執(zhí)行hal deploy apply一鍵部署發(fā)布Spinnaker。
對于微服務(wù)模式的項目,很多細(xì)節(jié)可以借鑒Spinnaker的模式。例如:我們也可以在gitlab倉庫中創(chuàng)建一個對應(yīng)版本號的yaml文件,里面包含當(dāng)前版本中每個微服務(wù)的鏡像標(biāo)簽。準(zhǔn)備發(fā)布的時候在Jenkins上面選擇版本分支,然后根據(jù)版本分支中的版本號讀取gitlab倉庫中對應(yīng)版本的yaml文件,然后一鍵部署。當(dāng)需要回滾的時候,輸入上個版本號同樣的過程進(jìn)行回滾。
想了解更多關(guān)于Spinnaker平臺的最佳實踐請點擊 Spinnaker實踐課程上線|實現(xiàn)多云環(huán)境持續(xù)交付 感謝您的支持!