前言
上篇《雲原生的前世今生(一)》跟大家分享了 Pivotal 和 CNCF 對雲原生的定義,這篇聊聊我自己對雲原生的理解。
先拋結論,我理解的雲原生是一種利用雲端計算交付優勢來構建和執行應用的方法論,當你的應用按照雲端計算交付模式來構建的話,就能充分貼合雲端計算的彈性伸縮、分散式、自動化等特點,而且隨著容器和 Kubernetes 技術的出現,這套原本只適用於公有云的架構思路,現在可以輕鬆在私有云、混合雲、甚至單臺伺服器上搭建,開發人員只需要關心應用是如何建立的,無需理會在哪部署。
有些讀者可能會覺得,雲原生技術只適用於大公司,小公司可能玩不轉。而我認為只要你想構建一個分散式、彈性伸縮、容錯性好、易於管理、便於觀察、在哪都能部署的應用,無論是大公司還是小公司,雲原生技術都是一個不錯的選擇。
什麼是雲端計算?
要想理解什麼是雲原生,需要先理解什麼是雲端計算。
雲端計算簡單來說就是雲平臺提供(包括伺服器、儲存、資料庫、網路、軟體、分析和智慧)等雲服務,通過因特網提供快速創新、彈性資源和規模經濟。對於雲服務而言,通常你可以根據業務需求的變化,隨時增減服務和用量,從而幫助降低運營成本,使基礎設施更加有效地執行。總的來說,雲端計算的本質是按需分配資源和彈性計算。雲端計算的優勢有:
- 費用:雲端計算讓你無需在購買硬體和軟體以及設定和執行現場資料中心(包括伺服器機架、用於供電和冷卻 的全天不間斷電力、管理基礎結構的專家)上進行資金投入。
- 速度:大多數雲端計算服務作為按需自助服務提供,因此通常只需點選幾下滑鼠,即可在數分鐘內調配海量計算資源,賦予企業非常大的靈活性,並消除了容量規劃的壓力。
- 效能:雲端計算服務商會定期升級到快速而高效的硬體,保證雲端計算的效能最優。
- 可靠性:雲端計算能夠以較低費用簡化資料備份、災難恢復和實現業務連續性。
- 安全性:許多雲提供商都提供了廣泛的用於提高整體安全情況的策略和技術。
- 工作效率:雲端計算避免了大量的軟硬體維護工作,讓團隊可以專注於業務目標。
- 彈性伸縮:雲端計算最大的優點是彈性擴充套件能力。對於雲而言,這意味著能夠在需要的時候從適當的地理位置提供適量的資源。
什麼是雲原生應用?
隨著提供雲端計算的廠商越來越多,使用雲端計算的成本也在逐步降低,再加上雲端計算的優勢明顯,所以越來越多的開發者在應用建立之初就選擇雲服務,而不再購置昂貴的伺服器,這些自建立之初就被託管在雲平臺的應用,可稱之為雲原生應用。
雲原生應用,是專門為在雲平臺部署和執行而設計的應用。雲原生應用並非完全顛覆傳統的應用,採用雲原生的設計模式可以優化和改進傳統應用模式,使應用更加適合在雲平臺上執行。
在雲端計算越來越流行的今天,雲原生成了一個必然的導向。雲原生存在的意義是解放開發和運維,而不是讓開發和運維工作變得更加複雜和繁重。
其實,大部分傳統應用即便不做任何改動,也可以在基於 Linux 作業系統核心的雲平臺上部署和執行,但是僅以能夠部署和執行為主要目的,將雲主機當作物理機一樣使用,無法充分利用雲平臺的能力。
讓應用能夠利用雲平臺實現資源的按需分配和彈性伸縮,是雲原生應用被重點關注的地方。雲原生還關注規模,分散式系統應該具備將節點擴充套件到成千上萬個的能力,並且這些節點應具有多租戶和自愈能力。
本質上來說,雲原生是一種設計模式,它要求雲原生應用具備伸縮性和可用性,以及自動化部署和管理的能力,可隨處執行,並且能夠通過持續整合、持續交付工具提升研發、測試與釋出的效率。
雲原生的重要特性
雲原生應用的特性很多,本文重點聊聊伸縮性和可用性。這兩大特性可以拆解成4個關鍵詞:負載均衡、可用冗餘、容錯轉移、資源調配。
負載平衡:雲平臺通常用水平擴容的策略來調節計算能力,這就要求一個雲原生應用,可以同時執行多個例項,且多個例項的狀態是共享的、統一的,當應用的計算量激增時,雲平臺會主動為應用增加新的例項,以調節計算壓力,在請求量降低時,雲平臺也會動態刪除多餘的例項,以保障資源最優。而在本地環境,如果需要更高的處理能力,只能更換到一個更強大的伺服器上,或者對這個伺服器進行升級,比如:增加記憶體、磁碟容量等等。
可用冗餘:雲平臺通常用冗餘的策略來保障應用的可用性,假設你的應用需要達到5個9的可用性(表示在1年時間裡最多隻能有5.26分鐘的業務中斷),那麼在雲平臺上,通常會採用異地雙機房*雙例項的部署模式,當任意例項發生故障時,請求會立即切換到同機房的另一個例項上,當某個機房停電或光纜被挖斷時,另一地域機房中的例項也能快速響。如果想進一步提高的可用性,還可以繼續增加例項,並且儘量分散地域部署。而在本地環境,伺服器偶爾當機或停電,馬上就會導致服務不可用超過5分鐘。
容錯轉移:當一個伺服器失效之後,雲平臺會迅速把應用遷移到另一臺伺服器,來恢復這個應用的可用性。對於一個典型的雲資料中心來講,通常都是有幾十萬臺伺服器的,即便只有1%的錯誤率,每天這個雲資料中心的錯誤也是數以千計的,你的應用很有可能就部署在失效的那個伺服器上,所以雲原生應用需要做好隨時被遷移到另一臺伺服器上的準備。
資源調配:應用遷移不光出現在伺服器失效的時候,雲平臺有時也會主動調節不同伺服器上的負載來達到一個資源優化,也就是說應用和伺服器本身都沒有問題,也有可能觸發應用的遷移。而在本地環境,伺服器當機是一件很大的事情,會直接導致你的服務不可用,並且很難快速恢復。
雲原生的蓬勃發展
為了滿足雲原生應用特性的要求,雲平臺需要具備哪些具體的能力呢?
1、快速、穩定地重新發布。無論是容錯轉移還是彈性伸縮,雲平臺需要能快速的把你的應用,重新發布到另外一臺伺服器上。在歷史上人們有很多不同的解決方案:1)一開始是部署指令碼+安裝程式的形式,但書寫一個相容性良好的部署指令碼是一個十分複雜的工作;2)後來人們提出了虛擬化概念,通過虛擬機器的形式,把應用和所有類庫以及底層作業系統全部打包成一個虛擬機器映象,部署時直接用映象進行還原,這個方法雖然解決了相容性問題,但又產生了部署效率問題,因為一個完整的虛擬機器映象,無論是在下載、還是在排程上,都需要很大的時間開銷;3)再後來出現了容器技術,它統一解決了不同作業系統之間的相容性問題,並給大家提供了一種輕量級的封裝方式,支援把應用和它依賴的類庫打包成一個尺寸較小的容器映象,這種容器映象不管是傳輸、還是重新發布,都可以達到很快的速度。
2、動態、靈活的網路。同樣是容錯轉移或者是彈性伸縮,雲原生應用的例項會不停的在資料中心進行遷移,例項在遷移的過程中要保證它和其他部件之間的連線穩定,所以需要動態、靈活的網路。1)一開始人們也是提供這種配置指令碼,對不同的網路硬體書寫特定的指令碼來進行配置,這個工作同樣也是非常複雜的;2)後來有了 SDN 軟體定義網路的方式,就是說在硬體網路基礎層的上面,通過軟體來定義網路的一些功能,比如路由的分配等等;3)再後來出現了 kubernetes 和 Service Mesh,就是說在軟體和硬體的網路架構上,可以再貼一層服務網格進行更靈活的、私有的、服務之間的連線配置。
隨著容器和 Kubernetes 等雲原生技術的出現,這套原本只適用於公有云的架構思路,現在可以輕鬆在私有云、混合雲、甚至單臺伺服器上搭建,開發人員只需要關心應用是如何建立的,無需理會在哪部署。目前已經從 CNCF 畢業的雲原生專案主要有:
專案名稱 | GitHub Star | 官網地址 | 專案描述 |
---|---|---|---|
Kubernetes | 80k+ | https://kubernetes.io/ | 是用於自動部署,擴充套件和管理容器化應用程式的開源系統。 |
Prometheus | 39k+ | https://prometheus.io/ | 使用領先的開源監控解決方案為您的指標和警報提供支援。 |
etcd | 37k+ | https://etcd.io/ | 是一種開源的分散式統一鍵值儲存,用於分散式系統或計算機叢集的共享配置、服務發現和的排程協調。etcd 有助於促進更加安全的自動更新,協調向主機排程的工作,並幫助設定容器的覆蓋網路。 |
Helm | 20k+ | https://helm.sh/ | Helm is the best way to find, share, and use software built for Kubernetes. |
Envoy | 18k+ | https://envoy.com/ | 是專為大型現代 SOA(面向服務架構)架構設計的 L7 代理和通訊匯流排。 |
Harbor | 15k+ | https://goharbor.io/ | Harbor 是一個開源登錄檔,它通過策略和基於角色的訪問控制來保護工件,確保影像被掃描且沒有漏洞,並將影像簽名為受信任的。 Harbor 是 CNCF 畢業的專案,可提供合規性、效能和互操作性,幫助您跨雲原生計算平臺(如 Kubernetes 和 Docker)一致且安全地管理工件。 |
Jaeger | 14k+ | https://www.jaegertracing.io/ | end-to-end distributed tracing. |
Vitess | 12k+ | https://vitess.io/ | 是一個資料庫叢集系統,用於通過廣義分片對 MySQL 進行水平擴充套件。 |
Fluentd | 10k+ | https://www.fluentd.org/ | Fluentd是一個開源的資料收集器,專為處理資料流設計,使用JSON作為資料格式。它採用了外掛式的架構,具有高可擴充套件性高可用性,同時還實現了高可靠的資訊轉發。 |
TiKV | 9k+ | https://tikv.org/ | TiKV 是一個分散式的 KV 系統,它採用 Raft 協議保證資料的強一致性,同時使用 MVCC + 2PC 的方式實現了分散式事務的支援。 |
containerd | 9k+ | https://containerd.io/ | 是一種行業標準的集裝箱執行時間,強調簡單性、堅固性和便攜性。它可作為 Linux 和 Windows 的守護神,可管理其主機系統的完整容器生命週期:影像傳輸和儲存、容器執行和監督、低階儲存和網路附件等。 |
Rook | 9k+ | https://rook.io/ | 是一款雲原生環境下的開源分散式儲存編排系統,目前支援 Ceph、NFS、Edegefs、Cassandra、CockroachDB等儲存系統。它實現了一個自動管理的、自動擴容的、自動修復的分散式儲存服務。Rook 支援自動部署、啟動、配置、分配、擴容/縮容、升級、遷移、災難恢復、監控以及資源管理。 |
CoreDNS | 8k+ | https://coredns.io/ | 是一個靈活可擴充套件的 DNS 伺服器,可以作為 Kubernetes 叢集 DNS。 |
Linkerd | 7k+ | https://linkerd.io/ | 出現是為了解決像twitter、google這類超大規模生產系統的複雜性問題。Linkerd不是通過控制服務之間的通訊機制來解決這個問題,而是通過在服務例項之上新增一個抽象層來解決的。 |
Open Policy Agent | 5k+ | https://www.openpolicyagent.org/ | 官方簡稱OPA, 為這類策略決策需求提供了一個統一的框架與服務。它將策略決策從軟體業務邏輯中解耦剝離,將策略定義、決策過程抽象為通用模型,實現為一個通用策略引擎,可適用於廣泛的業務場景 |
在國內,阿里雲將雲原生升級為技術戰略,積極參與到雲原生生態的建設,持續沉澱簡單易用的雲原生產品,並在自身業務中充分實踐雲原生,取得了非常不錯的成效。
我們靈活運用這些雲原生技術,配合 CNCF 雲原生實踐路線圖 ,相信大家能輕鬆的構建自己的雲原生應用。
參考
- 《什麼是雲端計算》https://azure.microsoft.com/zh-cn/overview/what-is-cloud-computing/
- 《架構新紀元(二):什麼是雲原生?》https://www.infoq.cn/article/xpFP8uclTKJQhhFqDyjZ
PS:關注公眾號【劼哥舍】,一起學習成長