雲原生的生態圈
既然介紹雲原生的技術生態體系,這里不得不祭出CNCF的這張landscape。

這張取自2020/03/02,最新的可見:https://github.com/cncf/landscape
這里主要分成了幾個技術板塊,
- 應用定義及部署(App Definition and Development)
- 編排與管理(Orchestration & Management)
- 運行環境(Runtime)
- 配置(Provisioning)
- 平台(Platform)
- 可觀測性和分析(Observability and Analysis)
- 無服務(Serverless)
這幾大板塊基本把雲原生技術所涉及領域都涵括進去了,下面詳細介紹下各板塊所涉及到的技術棧。
從系統層次來看,從上到下分別是:
- 應用層:應用定義及部署(App Definition and Development)、配置(Provisioning)、可觀測性和分析(Observability and Analysis)、無服務(Serverless)
- 集群:編排與管理(Orchestration & Management)
- 底層運行環境:運行環境(Runtime)
應用定義及部署

這個板塊的技術棧主要是應用開發過程種都會用到的,像數據庫、流式處理和消息隊列、應用定義和鏡像構建、持續集成和持續部署。
- 數據庫(Database):應用層的數據庫,其中 PingCAP 公司推出的 TiDB 就是其中的佼佼者之一,其具有水平彈性擴展、分布式事務等特性讓其和雲原生應用理念天然的契合。
- 流式處理和消息隊列(Streaming and Messaging):常用的消息隊列有kafka、NATS、RabbitMQ等,常用的應用系統中也用的比較多。流式處理有Spark streaming、storm、flink等,都是常用的大數據流式計算框架。
- 應用定義和鏡像構建(App Definition and Image Build):雲原生的應用構建一般由於一堆 YAML 文件組成,為了能更靈活的生成和打包管理這些配置定義文件,我們需要一些工具,而 Helm 就是k8s應用比較多的一種應用程序 Chart 的創建、打包、發布以及創建的軟件包管理工具。
- 持續集成與持續部署(Continuous Integration and Continuous Delivery):持續集成和持續部署是一種基於敏捷開發提出的開發工具,由於敏捷開發中要求要以快步小走的方式進行迭代,為了節約測試、部署時間周期,必須需要一個能做到和代碼管理進行結合的自動化測試和部署工具,而這就是持續集成和部署(簡稱CI/CD)。常用的CI/CD工具有Jenkins、Travis CI、gitlab runner等。
編排與管理

編排與管理板塊可以說是雲原生的核心,其包括了容器編排、一致性與服務發現、遠程程序調用(RPC)、服務代理、API網關、服務網格。
- 容器編排與調度(Orchestration and Scheduling):容器的編排和管理可以說是雲原生的基石,而 Kubernetes 可以說是這個領域的事實標准,作為 CNCF 基金會的首個畢業項目和金字招牌甚至很多人認為雲原生就是 k8s 和其相關的一系列技術,雖然這樣的說法是很不准確的,不過現在雲原生技術確實和k8s綁定的越來越緊密,由此而衍生了一大批的工具生態。
- 一致性與服務發現(Coordination and Service Discovery):各服務之間的協同以及服務發現是分布式計算中的核心,分布式架構作為雲原生的基礎特性之一可以說是不可或缺的功能組件,從大數據時代的老牌的Zookeeper到到Docker Swarm采用的Consul,再到k8s中集成的分布式鍵值數據庫etcd和DNS服務發現CoreDNS都是其中的佼佼者。
- 遠程調用服務(Remote Procedure Call):廣義上的遠程調用一般分為兩種,一種基於HTTP協議,一種基於RPC,而狹義的遠程調用一般指的RPC。比較常用的RPC框架有 Google 開源的 gRPC和 Apache 旗下的 Thrift 框架,k8s是采用 gRPC 框架作為服務間調用。
- 服務代理(Service Proxy):平常用的最多的服務代理應該就是nginx了,作為一個高性能支持正向和方向代理的服務器, nginx具備成熟和廣泛的應用場景。envoy 則是一個新生的用go寫的服務代理,像Istio、Ambassador的服務代理就是采用了envoy,因此在雲原生應用中 envoy 也具備強大的生命力。
- API網關(API Gateway):API網格主要起到對所有的API的調用進行統一接入和管理、認證、授權等功能。ambassador、traefik、kong等都是優秀的微服務網關。
- 服務網格(Service Mesh):服務網格是用於控制應用的不同部分之間如何共享數據,服務網格是內置於應用程序中的專用基礎架構層,用於記錄應用的不同部分是否能正常交互。服務網格可以更細粒度地為每個服務提供限流、管控、熔斷、安全等功能。Istio 是最流行的 Service Mesh 之一,其以易用性、無侵入、功能強大贏得眾多用戶青睞,相信不久將來應該有可能會成為服務網格的事實標准。
運行環境

這里的運行時板塊指的就是容器運行環境,包括了容器存儲、容器計算、容器網絡三大工具,在k8s分別對應的是CSI、CRI和CNI三類接口定義。
- 雲原生存儲(Cloud Native Storage):隨着數據庫、消息隊列等中間件逐步在容器環境中得到應用,容器持久化存儲的需求也逐步增多,隨之而來的是建立一套基於雲原生的存儲系統,在k8s中對應的就是CSI——容器存儲接口。持久化存儲中用的比較多的是Ceph,作為一個分布式存儲系統,Ceph提供較好的性能、可靠性和可擴展性。
- 容器運行時(Container Runtime):容器運行時就是指容器的運行環境,比如最常用的Docker。除了docker,還有一個比較著名的開源容器運行時標准組織(Open Container Initiative),簡稱OCI。OCI由Linux基金會於2015年6月成立,旨在圍繞容器格式和運行時制定一個開放的工業化標准,目前主要有兩個標准文檔:容器運行時標准 (runtime spec)和 容器鏡像標准(image spec),Containerd就是一個滿足OCI規范的核心容器運行時。
- 雲原生網絡(Cloud Native Network):容器的網絡方案,為容器集群提供一層虛擬化的網絡,像k8s的CNI就是其中一個標准的網絡接口,flannel是 CoreOS 公司主推的容器網絡方案,現在現在比較主流的一種網絡之一。
配置

配置板塊主要包括四個模塊自動化與配置、容器注冊、安全與合規性、密鑰管理。
- 自動化與配置(Automation & Configuration):用於自動化部署和配置容器運行平台和環境,代表工具包括Ansible、Chef、Puppet、VMware、OpenStack。
- 容器注冊(Container Registry):容器注冊是整個CNCF雲原生中的重要部件,因為基於容器的運行環境中,所有的應用都需要借助容器鏡像庫來進行安裝和部署。容器注冊工具主要分公有工具和私有工具,公有的容器鏡像庫主要包括docker官方的registry,在私有鏡像庫最著名的是Harbor,目前市面上大量的容器平台目前都基於Harbor構建其鏡像倉庫。
- 安全與合規性(Security & Compliance):安全性和合規性基本是所有系統都會面臨的東西,Notary和TUF是這個領域兩個主要的項目,其中TUF是一個開源的安全標准,Notary是其中一個實現。
- 密鑰管理(Key Management):秘鑰管理做權限管理和身份認證,比如雅虎發布的athenz,就是一個基於RBAC的權限管理和配置。SPIFFE通用安全身份框架提供了統一的工作負載身份解決方案。
可觀測性與分析

可觀測性與分析板塊主要包括了監控、日志、追蹤和混沌工程。
- 監控(Monitoring):監控主要是對運行系統和應用的狀態進行觀測與預警,常用的監控有Prometheus、Zabbix等,Grafana通常會配合Prometheus做圖形化的展示。
- 日志(Logging):日志采集模塊,如ELK(elastic/logstash/kibana)、fluentd等。
- 追蹤(Tracing): 這里的tracing是指分布式鏈路追蹤,因為在分布式系統中,各服務之間相互調用,一個地方出問題可以會導致很多其他服務上的組件出現連鎖問題,因此在定位問題的時候十分困難,必須要建立分布式鏈路追蹤來對錯誤和故障進行定位,分布式跟蹤是對日志和監控指標的重要補充。OpenTracing 是一套分布式系統跟蹤標准協議,為大家建立一套統一的標准來實現分布式跟蹤信息的描述和傳遞。
- 混沌工程(Chaos Engineering):混沌工程主要是解決在高復雜性的分布式系統之上建立起值得信任的生產部署體系,比如服務不可用時后備設置不當 ; 因超時設置不當導致反復重試 ; 下游依賴關系在接收到大量流量時出現中斷 ; 發生單點故障時連鎖引發后續問題等一系列混亂的難題,建立受控實驗觀察分布式系統。
無服務

Serverless是一個很大的領域,因此針對 serverless 這里專門又細分了五個模塊:工具、安全、框架、注冊平台和可安裝平台。
- 工具(Tools):一些工具集,,比如CNCF的landscape作為一個信息聚合網站可以用於查看各種新的軟件工具(CNCF永遠把自己放第一?)、Dashbird可以用於serverless監控和故障排查工具。
- 安全(Security):主要提供serverless的安全防護。
- 框架(Framework):指直接用於構建、管理serverless應用的框架,比如Apex可以用於構建、發布和管理AWS Lambda,SAM 一個Python的開源serverless應用構建框架。
- 注冊平台(Hosted Platfrom):指提供第三方注冊的廠商服務,比如AWS的Lambda、阿里雲的函數計算服務、Google的cloud functions服務等。
- 可安裝平台(Installable Platform):這里就是用於自己搭建serverless平台的工具,比如著名的Knative,就是由谷歌開源的 serverless 架構方案。

平台

這些主要是雲原生相關的平台供應商,需要找相關的產品和合作可以在這里找。
后記
雲原生的技術范疇是很廣的,可以說所有和分布式系統相關的技術棧基本都包含了,也是雲計算最佳實踐的集合。針對每個領域細細琢磨研究,也許這是條不錯的技術之路。