Netflix 的上線工具 Spinnaker
Spinnaker 的介紹
Spinnaker
Spinnaker 是 Netflix 開源出來的持續交付工具,目的是為研發團隊提供靈活的持續交付流水線,並且支持部署到測試/生產環境。Netflix 目前通過 Spinnaker 實現每天4000次的發布。它的優勢在於:
- 支持多種雲平台。目前支持 AWS EC2(Netflix 的機器大部分都在亞馬遜),谷歌雲,Kubernetes,Azure,Openstack 等,目前正在支持甲骨文的物理機和 DC/OS。
- 自動化發布。可以集成測試腳本進行測試,並且能夠管理測試,線上環境的機器,實現動態擴容,和服務的下線。
- 發布原子化。由於 Netflix 的平台已經實現微服務化,每個團隊使用 Spinnaker 獨立維護服務的發布,所以 Spinnaker 的設計特別適合於微服務持續交付的場景。
- 預置了軟體發布的最佳實踐。通過腳本實現不可變基礎設施,使得發布時候能夠更容易的進行回滾,和擴容。當你的團隊還在為每個應用寫腳本支持藍綠髮布時,Spinnaker 已經提供了從界面上進行藍綠髮布,金絲雀發布等策略的配置。
- 社區強大。Netflix,谷歌,微軟等等都已經在社區貢獻代碼。
Spinnaker 的組成
查看 Spinnaker 的源碼:https://github.com/spinnaker 可以發現,Spinnaker 的實現本身也是微服務架構,這樣就意味著 Spinnaker 本身可以輕鬆的實現擴容和滾動升級。Spinnaker 的微服務數量也達到10個左右,目前比較核心的模塊有以下幾個:
- Clouddriver顧名思義,是和底層 IaaS 打交道的模塊,主要負責底層資源的讀寫,它對接了底層的雲提供商: AWS,谷歌雲,Kubernetes,CloudFoundry 和 Azure 等等。
以 Kubernetes 的對接為例,Clouddriver 通過 Cloud Provider Agent 實現了緩存,部署,實例,負載均衡,安全組和集群的對接,工作量還是很大的。
- DeckSpinnaker 的 UI 層,使用 TypeScript + AngularJs 開發,支持擴展。
- GateSpinnaker 的 API 網關層,它為其他服務提供的 API 的接入,使用 Eureka 和 OKClient 實現。
- Orca任務編排引擎,目的是為 Spinnaker 提供一個流水線,將構建包從一個 Stage 升級到另一個 Stage,並且和其他服務進行協同工作。
- IgorSpinnaker 的 CI 工具,Igor 提供的是統一的 CI 工具介面(Jenkins,Travis 以及 Git 倉庫),並且記錄 Jenkins 的認證信息。在配置 Igor 項目時,需要將 Jenkins 的登錄信息配置在 yml 文件里。
使用 Spinnaker 進行持續發布
持續發布
- 使用 Nebula (Netflix 打包工具)進行編譯打包。
- 使用 Bake 將包打成一個鏡像,或者 RPM 包。
- 並發測試這個包,集成測試,系統測試等等。
- 金絲雀發布,此階段將包發布到集群里1%的節點,並且設置一個人工決策點。
- 1%的機器測試通過後,進行人工決策,將包發布到其他集群節點。
註:Netflix 的流程里大部分是沒有人工決策點的。
集群管理:
Spinnaker 的集群管理組件能夠管理以下資源:伺服器組, 集群,應用,負載均衡,安全組。用這些組件來屏蔽的底層 IaaS 資源的差異。
Spinnaker 部署策略
藍綠部署:
部署
由於 Spinnaker 已經接管了底層的雲平台資源,所以它能夠實現軟體部署的調度。從上圖可以看到,在軟體發布新版本時,我們可以為一個新集群上線新版本,將老版本的服務停掉。一旦新版本發現問題,我們可以通過 UI 上的 Rollback 按鈕實現回滾。
Netflix
金絲雀發布如何實現自動化?難點在於自動化評估1%節點部署的結果。Spinnaker 在發布1%集群的節點之後,ACA 會進行一系列的監控,包括用戶的行為是否異常,流量的訪問是否存在較大波動,最好會為這次發布計算出一個分數,這個分數就成為繼續發布到10% 集群機器的數據依據,只要分數大於這個值,就能繼續發布到剩餘的機器。
其他功能
即時通信工具集成 – Slack
Slack
Netflix 最開始是用郵件通知構建發布的結果,後來發現郵件根本沒人看,於是 Spinnaker 和 Slack 做了集成,任何發布消息都會推送到 Slack 的群聊里。好處是如果有人工的決策點需要審核,在 Slack 里可以得到及時的通知。
支持Chaos Monkey:
Chaos Monkey
Chaos Monkey 之前文章有講過,它負責在線上環境里隨機的關掉某幾台機器,從而進行服務高可用的測試,沒有經歷 Chaos Monkey 測試的服務不是好服務。
使用 Artifactory 進行軟體包管理:
Netflix 是 Artifactory 的重度用戶。Netflix 在部署包/鏡像到生產環境時,不會重新構建,而是從測試環境找到包,複製到生產環境。這就需要包管理平台的支持,Netflix 使用 Artifactory 作為統一包管理平台,記錄包的發布元數據,例如包經過了哪些測試,被部署到了哪些測試環境/生產環境。當服務需要擴容或者回滾時,根據AQL(Artifactory Query Language)進行元數據查詢,找到需要擴容或回滾的包。
總結
Spinnaker 作為持續交付平台,已經被 Netflix 內部上百個團隊使用,並且在生產環境里的進行了驗證,同時社區也非常的活躍。
不過使用 Spinnaker 也有一些門檻,首先你需要有自動化構建,測試的流水線進行軟體升級(Promotion),其次,需要讓 Spinnaker 接管公司的雲平台,用代碼描述環境,並且已經用腳本/CMDB 實現軟體在不同環境的部署,升級,回滾。如果你的公司內部有多個 Cloud Provider,並且希望實現可重複的持續交付流水線,可以考慮使用 Spinnaker 實現統一持續交付。
作者:王青
鏈接:轉載自JFrog傑蛙DevOps微信公眾號(jfrogchina聲明:版權歸作者所有,轉載請註明作者出處。
推薦閱讀:
※從《惡魔城》到《聖鬥士》,「良心甲方」Netflix正在改變日本動畫格局
※效仿迪士尼收購漫威,Netflix或1億美金收購《王牌特工》《海扁王》出版公司Millarworld
※除了Netflix和Amazon,這兩個高逼格網站也值得訂閱
※【2016新美劇推薦】《Luke Cage:盧克凱奇》第一季第一集至第六集影評:無堅不摧的街頭正義