每週運行30萬個容器實例 - Netflix 的容器化實踐

Netflix 是誰?



Netflix 是歐美地區最大的網絡視頻提供商,超過了 Youtube。全球每天有超過190個國家,一億多會員在 Netflix 上觀看1.2億小時的電影,電視劇和紀錄片等等。Netflix 也製作了像紙牌屋這樣廣受歡迎的電視劇。


爲了應對巨大的併發流量,Netflix 用了7年時間,網站架構從傳統巨石應用演進成爲業界超前的微服務架構。目前,Netflix 的雲平臺上運行了500個微服務,每天會有1000次的變更部署到線上環境。線上環境部署在亞馬遜3個 Region,9個可用區,爲全球用戶提供穩定的網絡視頻服務。



Netflix 爲什麼使用容器技術?



Netflix 在亞馬遜 EC2 上已經運行了上萬臺虛擬機,他們的虛擬機集羣非常的穩定,實現了雲原生應用的轉型而且非常易於擴展,爲什麼還需要用容器技術?



使用容器技術提升了 Netflix 的創新速度。筆者之前的文章也提到,在 Netflix 研發團隊的文化裏,創新是排名第一位,其次是產品的穩定性。所以 Netflix 對於應用的容錯性做的非常強,這樣即使創新的應用失敗,也可以將失敗的範圍控制到最小,開發者也就更敢於做創新的嘗試。Chaos Monkey 就是 Netflix 團隊發佈的專門做災難性測試的工具。


使用容器可以更好的管理應用以及應用的依賴,將所有內容都打包在容器裏易於管理和發佈。當線上容器出現了問題,可以隨時 Pull 下來到本地進行調試,讓開發者更快的重現問題。


使用容器的 UseCase


1. 視頻媒體轉碼

之前使用虛擬機進行大量視頻流媒體的轉碼需要一個月的時間,使用容器進行高併發轉碼,只需要一週。


2. 統一代碼構建,打包和測試系統

之前 Netflix 團隊發佈包之後,只會跑包本身的測試用例,並不會做上游包(UpStream)的集成測試,所以經常發佈包會破壞上游包的測試,上游開發者需要反覆調試,修復問題。使用容器之後,Netflix 會在容器裏跑上游包的測試用例,如果上游測試用例失敗,這次包發佈也會失敗,這叫做 Fail Fast。


3. 開發者無需關心環境

例如 NodeJs 的開發者,他們完全不關心運行的系統是什麼,也不想關心,所以使用容器可以讓這些開發者專注於開發上,減少 APP 運維的成本。


Netflix 的容器管理平臺 Titus


Netflix 最開始並沒有使用 Docker,而是使用 CGruop,之後使用了 Mesos 進行容器的管理,目前推出了自行研發的 Titus 容器管理平臺,實現容器的管理。


市場上已有了很多容器管理平臺,爲什麼需要自行研發容器管理平臺?由於市面上的平臺多數關注於數據中心的建設,支持混合雲的方案,且目前市面上的方案沒有能夠滿足 Netflix 如此大規模的容器使用情況。


Titus 的最初是用來管理 Netflix 內部大量的 Batch 任務,主要包括視頻轉碼,加水印,生成每日 CDN 網絡流量的報表。 這些任務有些共同的特點,耗時較長,屬於計算資源密集型的任務,並且不依賴於平臺,比較適合用容器來運行。


後來 Titus 開始接管 Services,Services 的要求比 Batch 任務要高很多,需要實時擴容,且需要不間斷的運行,服務有更多的狀態管理需求,難以升級等等。對此,Titus 做了很多容器管理的改進。


網絡管理



在 VPC 網絡裏使用 Docker。通過 Titus 的執行器,可以創建一個 Namespace,創建並啓動一個 Pod root container,類似於 K8S 的 Pods。隨後創建 Veth,路由的規則,iptables 等等。


Metadata Proxy


Metadata Proxy 是 Titus 基於亞馬遜的 Metadata Service 實現的統一網絡管理模塊。它解決的是容器的安全問題,它統一管理的容器的 “whoami” 的信息,例如容器的 IP,權限,容器的宿主機 ID,域名等等,容器本身無法知道宿主機的更多信息,從而確保容器的網絡安全性。將 VPC 網絡和 Metedata Proxy 合起來,就是下面的這張圖:



和 Spinnaker CI/CD 集成


Titus 和 Netflix 現有的CI/CD 工具 Spinnaker 進行了集成。在創建 Spinnaker 的集羣時,Spinnaker 提供了 AWS 虛擬機集羣的創建,和 Titus 容器集羣的創建。



當某個容器 Push 到了 Artifactory Docker 註冊中心,這個 tag 會實時的顯示在 Spinnaker 部署的任務裏供用戶選擇 Docker 鏡像的版本。



Titus 也集成了 Chaos Monkey,在 Chaos Monkey裏執行線上環境破壞性測試的時候,選擇 Titus,就會隨機銷燬在線上運行的容器。



Fenzo 任務調度框架


Netflix 開源了任務調度框架 Fenso,它是一個可擴展的任務調度框架,用於管理所有調度任務的生命週期。



你只要給 Fenzo 一個任務列表,並且給 Fenzo 一堆可以的計算資源,Fenzo 就會自行決策,進行任務的執行。如果你給的計算資源太少,不足以執行所有任務,Fenzo 會告訴你需要多少計算資源,如何擴容。


Titus 和 Fenzo 集成



爲了實現計算資源利用率的最大化,Netflix 的生產環境和 Batch 任務會共用容器資源。某些 Batch 任務會佔用大量的計算資源,導致在生產環境的 APP 需要擴容時,得等待 Batch 任務執行完成,才能獲取資源。


爲了解決這個問題,Fenzo 將容器分爲核心層和 Flex 層,核心層的應用會保障擴容的能力。Flex 層會將低優先級的任務進行排隊執行。


Titus 的現狀


之前 Titus 是和 Netflix 內部的 Mesos 的平臺進行容器管理,目前已使用 ECS 替換了 Mesos 作爲容器編排的平臺。 



Titus 支持了 OutBound 和 Inbound 的請求處理,從 OutBound 可以實現 ECS 裏容器的啓動和停止。如果容器停止,CloudWatch 會監測到 ECS 的變化,並且通知 Titus 裏任務的狀態變化。


未來 Titus 將會專注於基於:

1. 服務的自動擴容,以及跨數據中心的容器負載均衡。

2. 實現核心層任務的 SLA 保障,當核心層的計算資源達到上限時,會將 Flex 層的資源搶佔過來,保障核心層任務的 SLA。

3. 更好的支持動態擴容。



作者:王青

目前任職 JFrog 中國首席架構師,之前在 IBM,HPE,愛奇藝,新浪,VIPKID 等公司做過研發和架構,是有十多年開發經驗的互聯網老兵,專注於軟件生命週期管理,微服務架構,雲原生應用,容器化等領域。

歡迎轉載,但轉載請註明作者與出處。謝謝!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章