標籤:

Netflix 的上線工具 Spinnaker

Spinnaker 的介紹

Spinnaker

Spinnaker 是 Netflix 開源出來的持續交付工具,目的是為研發團隊提供靈活的持續交付流水線,並且支持部署到測試/生產環境。Netflix 目前通過 Spinnaker 實現每天4000次的發布。它的優勢在於:

  • 支持多種雲平台。目前支持 AWS EC2(Netflix 的機器大部分都在亞馬遜),谷歌雲,Kubernetes,Azure,Openstack 等,目前正在支持甲骨文的物理機和 DC/OS。
  • 自動化發布。可以集成測試腳本進行測試,並且能夠管理測試,線上環境的機器,實現動態擴容,和服務的下線。
  • 發布原子化。由於 Netflix 的平台已經實現微服務化,每個團隊使用 Spinnaker 獨立維護服務的發布,所以 Spinnaker 的設計特別適合於微服務持續交付的場景。
  • 預置了軟體發布的最佳實踐。通過腳本實現不可變基礎設施,使得發布時候能夠更容易的進行回滾,和擴容。當你的團隊還在為每個應用寫腳本支持藍綠髮布時,Spinnaker 已經提供了從界面上進行藍綠髮布,金絲雀發布等策略的配置。
  • 社區強大。Netflix,谷歌,微軟等等都已經在社區貢獻代碼。

Spinnaker 的組成

查看 Spinnaker 的源碼: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 進行持續發布

持續發布

  1. 使用 Nebula (Netflix 打包工具)進行編譯打包。
  2. 使用 Bake 將包打成一個鏡像,或者 RPM 包。
  3. 並發測試這個包,集成測試,系統測試等等。
  4. 金絲雀發布,此階段將包發布到集群里1%的節點,並且設置一個人工決策點。
  5. 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:盧克凱奇》第一季第一集至第六集影評:無堅不摧的街頭正義

TAG:Netflix | 工具 |