打造開放的雲原生操作系統和系統軟件架構

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"演講嘉賓 | 汪源"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"整理 | Tina"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"真正的雲原生,必須以一套技術體系支持任意負載,運行於任意雲環境。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"大家早上好,我今天給大家分享我們的基礎軟件建設。網易杭州研究院在整個網易集團的主要職責是爲網易的非遊戲業務構建統一的技術平臺,來支撐網易音樂、網易新聞、嚴選,以及之前的考拉海購的業務需求。在 2019 年的時候,我們把考拉海購出售給阿里集團了,但是在之前,考拉也曾經一度是我們最大的一個支撐對象。所以對我們來講,重點就是要去探索一個比較統一的、開放的、自主可控的技術架構,來滿足我們的業務需求。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這三年我們也給很多外部的客戶提供了一些服務,大家的認知也非常一致:中大型的企業需要一個自主可控的體系,在當前計算環境下能夠形成一個對於企業來說可以長期發展和演化的技術演進的路線。我的演講標題爲《打造開放的雲原生操作系統和系統軟件架構》,實際上這兩個領域都是基礎軟件的範疇,一般來講操作系統、數據庫、中間件,也包括現在的大數據計算、機器學習平臺、開發工具等等,都是基礎軟件的範疇。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/b7\/b726a0de829d8c3490d6965f79b93c99.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"爲什麼要做雲原生操作系統"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我今天的分享包括四個部分。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一部分,我想介紹一下我們爲什麼要去做這個事情。當時有幾個方面的因素需要考慮。第一點是我們當時已經實現了互聯網業務的大規模上雲。從 2012 年開始網易就基於 OpenStack 研發了一套基於虛擬化技術的私有云。2018 年的時候,95% 以上的互聯網業務已經上雲,整個私有云規模超過五千個節點。同時在大數據領域,我們整體上圍繞着 Hadoop、Spark 這樣的技術,實現了大數據技術的平臺化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另外,我們基本上所有的業務在 2018 年的時候實現了微服務化,服務的數量超過一千。其中考拉是最大的,考拉最多的時候達到了七百個服務;網易雲音樂當時大概是三四百個服務,現在也更多了。我們當時還基於虛擬化的技術整體研發了將近十個的 PaaS 服務,包括 RDS、MongoDB、MQ 等等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們分析過當時的架構遇到一些什麼樣的痛點和問題,我相信這些問題,大家或多或少也會遇到。總結起來主要是四個方面。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一個是效率不夠高。我們的業務都已經進行了微服務的拆分,那麼對研發迭代的需求實際上要求很高,但是我們微服務的實現底層依賴的是虛擬化的技術。這個技術相對來說會比較重,我們統計了一下,一次典型的應用發佈要 12 分鐘左右,那麼這個時間是比較不理想的。我們的目標是要優化到兩分鐘以內。當時我們看到 Facebook 有公佈一個數據,應用發佈的時間如果超過一分半鐘,那麼你的工作效率就會比較明顯的受到一些影響,包括程序員的心態也會受到一些影響。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二個是系統運行的成本比較高。我們通過虛擬化之後把資源利用率從平均不到 10% 提升到 20% 到 30% 左右,但是我們發現利用率就停留在 20% 到 30%,再也提高不上去了,這個成本還是很高的。理論上來講,我們最好能夠把它優化到 50% 到 60%。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另外,我們的 PaaS 服務,每個服務都需要三到五個人的團隊去開發和維護,這對我們來說,成本是非常高的,比如說一個 RDS 的服務要 5 個人,一個 MQ 的服務可能要 3 個人。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第三個是系統的彈性會比較差。在那個時候我們已經遇到一些對彈性要求比較高的場景,比如說考拉雙十一、音樂年終的盤點,這些時候我們會發現自有 IDC 的容量不夠。因爲自有的 IDC 是不可能去堆非常多的空閒容量來滿足這些臨時性的活動需求的,但是我們的架構那時候又很難靈活地擴展到比如說像阿里雲這樣的公有云上面去。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們面臨的自有 IDC 的資源不夠,但在自有 IDC 內部,我們又發現系統各個集羣之間的資源比較割裂,不能能夠靈活的相互調配。所以在一些活動的時候,我們發現雖然我們的總資源是夠的,但是要進行調配會比較困難。當時我作爲這個中間協調的人,經常需要爲考拉的活動去找各個 BU 來借服務器用,這個過程是非常複雜,非常麻煩的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們發現還有一個很大的問題就是維護難,最突出的是,我們基於 RPC、SDK 這樣的中間件技術,它跟應用之間是耦合的,所以我們的中間件沒法靈活的去迭代,那面臨這些問題怎麼辦呢?我們當時看到在環境上有一些新的變化,使得我們有能力去比較好地解決這個問題。最主要的是雲原生技術在 2018 年已經展現出一個非常好的勢頭,這其中最主要的是 K8s 和容器,我們就堅定地選擇了圍繞 K8s 去構建我們雲原生的技術。雖然當時還有像 Docker Swarm,還有像 Mesos 等等一些競爭的技術。但我們認爲 K8s 是未來的一個主流。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當時也看到 Service Mesh 已經開始起步,雖然當時我們選擇了 Istio+Envoy 去做我們的 Service Mesh 基礎框架的時候,心理還是比較惶恐的,因爲在 2018 年的時候,非常難以看出來,Service Mesh 的社區主流技術到底是那個。但幸運的是,到目前爲止這兩個還是 Service Mesh 社區裏面最主流的技術。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/b0\/b05234841a6a8aaca7bb06630f365dc6.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另外,在硬件的環境上,我們發現在那個時候也有些新的變化是對構建新的系統和技術架構有利的,其中一個比如說高速網絡,我們發現 25G 的網絡可能很快就可以普及。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然後就是智能網卡。我們在那個時候就開始跟英特爾、邁絡思等等這些廠商溝通智能網卡方面的工作。我們看到智能網卡可能比較快就能達到量產,然後我們就可以把很多虛擬化,或者容器化集羣管控的一些負載放到智能網卡的這個層面去做,使得我們在整個操作系統、中間件這些層面的計算和應用的計算能夠比較好地隔離出來。智能網卡可能承擔了像 AWS 發佈的 Nitro 架構、阿里雲發佈的神龍架構這樣類似的作用,能夠把我們系統層面的負載跟應用層面的負載進行隔離。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另外非常大的環境是多雲。對於網易這樣的企業,我們一定是會部分上雲的,我們一定是會需要有一個混合雲的架構。同時對於公有云的廠商也一定不會綁定在其中的一家,在國內我們會使用阿里雲、華爲雲,或者是騰訊雲,我們在海外,可能會使用 AWS、GCP,或者 IBM 等等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們面臨的是一個多雲的環境,那我們的技術架構怎樣能夠更好地去適配多雲的環境?到今天,我們已經 Run 在 AWS 上,也有些業務在阿里雲和華爲雲上。當時基於這些環境和麪臨的痛點,我們策劃了一個整體的雲原生操作系統的概念,我們認爲有必要去構建一個統一的基於 K8s 的容器操作系統,通過這個操作系統來屏蔽底層的一系列的異構的、混合的資源,來進行統一管理。K8s 社區本身就在往這個方向努力,所以我們能夠跟着這個潮流走,而不需要自己去發明一套技術。所以這是一個非常好的環境了,對我們來說。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"既然有了統一的雲原生容器化的操作系統,那我們就有可能把所有的工作負載,包括業務的負載、數據庫、大數據、機器學習、基礎中間件等等,所有的負載都圍繞以 K8s 爲基礎的容器化的操作系統來做。我們當時就規劃了這麼一套體系和方案,我們認爲如果做出這樣的一套方案,對於所有的中大型的企業來說,在當前的技術環境下也是一個最適合的解決方案和路徑。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"做這個事情的主要價值有幾個,第一個我們可以讓這套技術相對來說是自主可控的,我們不會被一些廠商的技術綁定得太深。因爲整套技術是構建在社區的開源技術之上,而不是某一個廠商的私有的技術體系之上。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二個是標準統一。我們用同樣一套體系可以應用於私有云的環境、公有云的環境、混合雲的環境、多雲的環境等各種環境。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第三個可以降低成本,能夠提高資源的利用率。比如說通過發揮業務的錯峯效應來提升資源的利用率,降低成本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後一個可以提高資源彈性。資源之間相互打通了之後,通過調度的優勢來提高彈性。如果說我們把這套架構 Run 在公有云之上,它還有一個額外的好處是可以在保證彈性的同時還能讓你享受到公有云提供的包年包月的低價。大家知道如果使用公有云的彈性服務,那麼在彈性上是非常好的,但是成本非常高。公有云所提供的彈性的服務比包年包月的資源,成本可能會高兩到三倍。基於我們這套雲原生操作系統,用戶既可以享受包年包月的低價,同時也能滿足比較好的彈性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"雲原生操作系統"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來我想分兩個部分來介紹我們到底是怎麼做的。第一個,我想講一講雲原生的操作系統是一個什麼概念、是怎麼實現的。第二個是基於這個雲原生的操作系統,我們的系統軟件要怎麼做、要做到什麼樣的一個狀態。當然了,我們現在有比較多的工作也在進行的過程中,這套體系並沒有達到一個非常完善的一個層面,但我今天講的都是在我們內部至少有試點應用的技術成果。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於雲原生操作系統,我們認爲最主要要解決五個方面的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一個在計算的層面,我們要做到讓操作系統的負載和操作系統所承載的業務的負載,它們之間要能夠隔離。要提供一個高性能並且穩定的環境,相互之間不能干擾。這個也是我們在 2017 年的時候去參加 AWS re:Invent 大會所引發的我們的一個思考,就是我們一定要把操作系統的負載隔離在一個獨立的硬件上,不能跟業務負載混淆在一起,否則的話,就不能很好地支撐一些特別需要高性能的像數據庫、中間件這些業務的負載。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/44\/44a3d67306fea1607a6ff67fefaf9bf4.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在網絡層面我們要構建一個高帶寬、高 PPS、低抖動的技術。我們最怕網絡的抖動,基礎網絡一抖動,上層的應用就抽風。在存儲層,因爲這些雲原生的操作系統化了之後,我們很多的數據庫、大數據的計算都需要演變成存儲和計算分離的架構。所以我們就需要一套高可用、高性能的存儲來支持存儲計算分離的架構。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們要支持跨集羣的多層調度,支持多個 IDC 混合雲和多雲的架構。還要支持混部,要基於標準的 K8s 技術來支撐混部,早在四、五年前業界很多大廠就已經分享過混部,最早的可能是 Google,但是所有的這些技術可能都不是標準化的,都是沒有辦法給廣大的企業所使用的。我們追求的是做一套基於 K8s 標準實現的混部技術,來支撐不同負載之間的資源的隔離,並且保證 QoS 和 SLA。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼在計算層面要怎麼做?我們可以基於智能網卡來實現一個裸金屬的計算服務器。剛纔說在 2018 年的時候我們就跟英特爾、邁絡思等等進行了持續的對接和溝通,最終我們選用的是邁絡思的 BlueField 系列,這個網卡里麪包括 8 核和 16 核的配置,16G 的內存,ARM 的指令集,這個對我們的研發適配成本也不高。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們充分利用這塊智能網卡的能力,把 I\/O 的負載、網絡控制面代理、網絡數據面的轉發都放在了智能網卡的計算能力之上,這使得我們的系統層面的一些負載跟應用的負載形成比較好的隔離。最終我們發現智能網卡確實能夠比較好地滿足我們的需求,它的性能測出來接近於物理機的性能。在成本效益上,智能網卡可以給我們節省 8 到 10 個 Core,當然就目前而言,智能網卡的成本相對來說也比較高,覈算下來在成本方面是持平的,但是長期來看,應該會稍微便宜一點。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/e4\/e47fffeecdece08e6de9ce531cd4eb4c.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"網絡層面其實比較複雜。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先在容器的網絡上我們採取了兩種模式,一種是基於網卡直通的 SR-IOV VF 直通的模式,提供給特定的一些高性能應用,最典型的就是右邊這種服務網格的網絡,就是採用了這個 SR-IOV 直通的模式,因爲它在一臺物理機上只需要有一個實例部署。對於普通的容器來說,當然是沒有辦法用 SR-IOV 直通的方式來做的,我們通過內核態 veth 轉發的方式來滿足需求。這個 SR-IOV 直通的高性能的方案能夠達到萬兆網卡的限速,小包的處理能力單個可以達到 250 萬的 PPS,相對 veth 方案,它的 QPS 和延時都會更好。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另一方面,更復雜的是要解決服務網格的網絡。我們可以看上圖,服務網格的網絡實際上中間經過了很多個步驟,從一個 Service 到另一個服務端的 Service 之間,有六個環節。怎麼儘可能地提升每個環節的性能,降低它的這個抖動和波動?我們也進行了一年多的研究和開發,最後採用的技術方案是在 Service 和 Sidecar 之間,我們採用了 SockOps,這裏面採用了像 eBPF 的技術,那它能夠把我們這兩者之間的通信,Bypass 內核協議棧延遲可以降低 10%,QPS 提升 10%。現在提升的這個幅度並不是特別的大,但也是非常有效的。然後在兩個 Sidecar 之間的通信我們(在 SR-IOV 直通基礎上)基於 VPP 去實現用戶態協議棧加速,它的效益會更大一點,延遲降低 30%,QPS 提升了 20%,同時我們把這一套技術,命名作爲一個叫 MeshTurbo 的項目,很快會把它開源出來貢獻給社區。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/47\/472004bc9a14a51d7d07f974822b906b.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"剛纔說了存儲我們要做到一個高性能的高可用的存儲來支持存算分離的架構,比如說支持類似於像 PolarDB 雲原生的數據庫,我們在 2018 年開始就自主研發了一套叫 Curve 的存儲系統,並於去年的 7 月份向社區開源了,也希望大家能夠有興趣來關注和參與這個項目。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Curve 採用了 Quorum 的機制,寫大多數副本即可返回,它的性能會比較高,同樣的原因也使得它的可用性會更高。像 Ceph 如果有一臺服務器掛掉,I\/O 會堵塞至少十秒鐘,這是一個非常嚴重的問題,但 Curve 沒有這樣的問題。根據我們的測試,Curve 相比 Ceph 的 L 或 N 版本,單個卷 IOPS 達到它的 3 倍,延遲大概降低了一半,多卷隨機讀 IOPS 達到 Ceph 的 1.5 倍,延遲降低 27%。我們也還在不斷的去優化 Curve 的性能和系統的質量。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/e7\/e72bbe38cc3c4b3c3c9f12d0909d4ef4.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"怎麼解決多層調度的問題?我們的核心是基於 virtual-kubelet,這是 K8s 裏面一個核心的概念,把所有集羣的閒置資源能夠有效的利用起來。我們將所有 K8s 的集羣裏面的空閒資源彙總成一個叫 Virtual Node,然後再把多個集羣的這些資源又彙總成一個大的 Virtual Node,有這樣一個基礎支撐之後,我們的應用在申請資源的時候就不需要去指定具體是哪一個集羣,而是調度到一個 Virtual Node 上,我們自己擴展的 K8s 調度器就可以把它調度到相應的空閒資源之上了。我們內部有一個應用案例,是幾個集羣匯合起來大約有 7200 個 CPU 的 core,這個資源每年節省了 420 萬。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/7e\/7e050741adb35524542457b6dc29d69b.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後一個是怎麼樣基於 K8s 來做混部。原生的 K8s 在調度上採取的是靜態的調度,是沒有辦法做混部的。首先我們擴展了 K8s 的調度器,基於當前的負載做動態的調度。這個調度器優先要保障在線業務的資源需求,但同時也要保證離線業務的資源不能被餓死。這個調度器也是基於標準的 K8s 實現的擴展,可以移植到任意的 K8s 的集羣之上。這些 Feature 也都在我們的開源計劃過程中。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/13\/13abf73e688333a08cc12c7f36f01e80.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"混部還有非常重要一點是要在很多層面做好隔離,來保證我們的在線資源不被離線資源所影響。如果不能保證這一點,這個混部是不可行的。比如說用 CPUset 做 CPU 的隔離;在虛擬內存上要優先給在線的業務做保障;在 L3 的 Cache 上,通過 Intel CAT 技術來做隔離;在主機網絡、交換機網絡上都要進行鍼對性的處理,來使得在線業務的負載被離線業務的干擾和影響可以控制在 10% 以內,這樣就達到了一個我們業務方所能接受的一個狀態,在線業務是不會被那些混部進來的離線業務所影響、所幹擾的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"雲原生系統軟件"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"既然有了這樣一個雲原生操作系統,我們所有的系統軟件都要跟它進行改造和適配,我想講兩個方面的,一個是中間件,一個是大數據。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"基礎中間件"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在基礎中間件方面,我們圍繞雲原生的技術體系,重新打造了一個基礎中間件的體系,在這個過程中,我們非常注重複用雲原生生態已有的能力。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/45\/45df5b6bd7e136e725c70db9d923e673.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對一箇中間件的管理來說,這個中間件底層的內核都是開源的技術,我們要做的就是它的上層的管理套件,這個管理套件主要做五件事情,第一是實例生命週期的管理,是基於 K8s 的 Operator 框架去實現的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二是高可用的部署,這個時候 K8s 的調度器做一定的擴展就能夠比較好的來滿足我們的需求。故障的自愈也可以藉助 K8s 的內置的一個多副本的控制器、容器探針等機制來做,比較方便的實現。可觀測性方面,雲原生體系提供了像 Prometheus 這樣比較標準化的一個框架,我們完全可以對接到這個框架,我們的實現也會更加簡單。最後運行的資源管理和容器編排,我們藉助於 K8s 內置的 Node 的管理、Pod 的調度等等這些方面,我們的實現也會更加的便捷。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以基於 K8s 去做,跟我們原來基於虛擬化去做,同樣一箇中間件,我們的研發代碼量減少了 50% 到 80%。這個對於我們來說是非常大的一個收益,我們可以投入更少的人去做這個事情,而且我們做出來的軟件跟統一的操作系統之間,結合度會更加的緊密,適配性更強。凡是有標準的 K8s 環境,我們的中間件就可以很順暢地跑在上面,所以說這樣的中間件體系是更加有利於部署和落地的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"服務網格"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/5c\/5c93256cb75d6872f17c8822c35ae08f.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"再就是服務網格。服務網格我們的核心基礎技術是 lstio 和 Envoy 兩個,一個做控制面,一個做數據面。在服務網格的工作中要關注的是三點。第一個是兼容性,因爲應用從原來基於典型的 RPC 的模式,切換到服務網格,不可能一下切過來,一定是有一個逐步遷移的一個過程。每個應用又有已有的環境,我們服務網格技術就需要對這些環境做很好的兼容。所以說在落地方面,首先第一個兼容性,我們要兼容各種註冊發現機制,比如說有些業務是用 Consul,有些用 ZooKeeper,有些人用 Eureka 等等,需要去兼容它們。在服務的基礎設施方面要支持物理的環境、容器的環境、虛擬機的環境等等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在可落地性方面我們也要支持網格化和非網格化集羣混合調用,因爲遷移一定是逐步進行的,這些在雲原生的社區版本里面的功能都是比較弱的,還需要自己去做一些擴展。還有一個非常重要的是要支持 Sidecar 熱升級、業務無感。因爲 Sidecar 在產品的迭代過程中一定要進行升級和維護。我們還做了一系列服務網格的運維增強的功能,這些功能作爲 Slime 項目,也在 Github 開源了,大家也可以去關注。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"目前通過這樣的應用,我們把啓動時間從分鐘級降到了秒級,我們在數據面的內存下降了 80%,控制面推送時的內存下降了 70%。這些都有助於我們大規模應用,比如嚴選、傳媒的業務,現在已經 80% 以上都是在服務網格的這個技術體系上。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"大數據"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後一個細節部分,是怎麼樣把 Spark、Flink 這樣的典型的大數據框架運行到 K8s 上進行統一的調度。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/78\/78b20c412f45cd9f31a4a5eb1c2a1c9a.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一件事情我們要做一個統一的調度系統。這個統一的調度系統是爲了方便我們把 Spark 從 YARN 逐步地遷移到 K8s 上。任務遷移可能是個長期的過程,在這過程中會出現“雙跑”現象,用於驗證任務的準確性,這個長期的過程首先就需要有一個統一的調度系統。這個調度系統,首先它統一接口,使得大家不用關心底層到底是在 YARN 上,還是在 K8s 上。這個統一的接口要支持像數據開發、交互式分析、ETL 等各種不同的大數據業務場景。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個統一的調度系統還要做到負載均衡和融合的調度,要把 YARN 和 K8s 之間調度過程做得相對來說比較平滑。這個方面我們也提供了一個開源的項目叫 Kyuubi,Kyuubi 意思是九尾狐,後面有很多個不同的分叉,有可能是 K8s,有可能是 YARN。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/d0\/d0116f1d47c49eecbc57434f0e9c19f9.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第二個是把大規模的 Spark 和 Flink,尤其是 Spark,跑在 K8s 上,涉及到網絡層要怎麼解決?我們私有云採取的是基於 overlay 的 VPC 網絡實現的。但是,如果用 VPC 來跑 Spark 這樣的大數據的負載,它是有一定的缺點的。第一個有比較大的一個開銷,要拆包、解包,需要消耗比較多的 CPU 資源。但是 Spark 集羣的通訊,對 Overhead 是比較敏感的。第二個在這個時候交換機層面比較難以感知到內層的一些 QoS 的策略,所以實現全鏈路的隔離就比較複雜。我們最終選擇的是基於 K8s 的 hostNetwork,通過主機網絡來實現 Spark 層面的網絡通信,這樣就沒有這種額外的分包解包 Overhead,並且在服務器和交換機上都可以做好 QoS 的分配策略和流量隔離。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/wechat\/images\/e0\/e00b5d3a5475023cddeee1fffaa66796.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第三個還要解決很大的問題是存算分離的問題,因爲原來 Hadoop 體系是存算一體的。存算一體的時候,計算產生的臨時數據都寫在本地磁盤上,如果把 Spark 跑在 K8s 上,K8s 集羣是一個典型的計算集羣,本地是沒有存儲套件的,相應的存儲還在 HDFS 上。這帶來的問題,Spark 的資源分配支持不足會造成浪費,因爲在混部的場景下,Spark 任務比較容易被殺掉,就是在線業務一旦有資源需求的時候,它就會把離線的業務踢掉。這個時候如果用 K8s 集羣的本地存儲來做 Shuffle 存儲,我們就會發現,一旦一個任務被踢掉,Shuffle 的存儲沒有了,那整個任務就要重跑。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"剛好我們打造了一個高性能的存儲平臺 Curve,所以我們就把計算產生的臨時數據(Shuffle)放到遠程存儲,這樣就能夠比較好地解決這些問題。實現的方式也比較簡單,我們在 K8s 上做的一個特殊的 DaemonSet,叫 RSS(Remote Shuffle Service)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"解決了這三大問題之後,基本上就解決了怎麼把 Spark 和 Flink 這樣的大數據的負載跑在 K8s 上面的問題了。目前我們的應用規模還不是很大,我們還在逐步推廣,但是這條路徑我們覺得是走通了,是可行了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而且經過混部之後我們發現很多集羣的資源利用率,從剛纔說的 20% 到 30%,提升到現在的 50%,甚至有些集羣提升到 70%,資源節省了很多。尤其是我們傳媒的業務,經過大規模的混部之後,利用率的提升是非常顯著的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"總結"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後我做一個小結和展望。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我想強調的是我們理解的雲原生。雲原生理念上我認爲是面向雲環境所設計的一套技術架構。那麼雲環境來說,對於中大型企業一定是一個混合雲加多雲的環境,不可能是隻有一朵雲。面向雲的設計,最核心的是要做到彈性和資源的池化。針對這樣的雲原生理念的實現,我今天可能貢獻了一條思路,就是基於一個以 K8s 爲基礎的的統一操作系統來構建,並且把所有的基礎軟件要跟這個操作系統去做適配,來管理和調度所有的計算;同時我們要做存算分離,要有強大的存儲基礎設施,讓基礎軟件都能提供彈性的服務。我們有句口號,就是真正的雲原生,我們認爲是"},{"type":"text","marks":[{"type":"strong"}],"text":"以一套技術體系支持任意的負載,運行於任意的雲環境"},{"type":"text","text":"。如果只跑在一個特定的環境下,這樣的技術做得再好也不是真正的雲原生。未來我們希望繼續擴大存算分離架構的應用範圍,繼續擴大混部和資源池化的範圍,繼續我們的開源。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"演講嘉賓介紹:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"汪源博士"},{"type":"text","text":",網易副總裁,杭州研究院執行院長,互聯網技術委員會主席,網易數帆總經理。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2006 年獲浙江大學計算機專業博士學位,是國內大型通用關係數據庫內核技術最早的研究者和實踐者之一。畢業後加入網易,長期主持網易杭州研究院技術研究工作,在國內最早開展分佈式數據庫、文件系統、搜索等大數據系統建設。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現作爲網易杭州研究院執行院長,全面負責網易集團基礎設施 \/ 雲原生 \/ 中間件 \/ 大數據 \/ 人工智能 \/ 信息安全 \/ 中臺等核心技術平臺建設、項目管理 \/ 用戶體驗與設計 \/ 運維保障 \/ 質量保障 \/ 創新服務等創新平臺建設和網易雲政企業務。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章