雲端基礎設施架構與概念
在雲端的時代與雲端基礎設施相關的種類多如繁星,不管是開源的還是商用的。問題在於如何選擇這些工具並將它們組合在一起是一個非常頭痛的問題。本篇是用一個比較高層次的思維來呈現出適合我們的雲端基礎設施應該是怎麼樣的,我們應該用多少的容量,我們應該怎麼組合這些雲端資源來達到我們所需要的運算/儲存/網路容量。
這裡不是要給所有人一個標準架構,而是要找到一種適合我們的方式來組合雲端基礎設施的需求。比起我們在一種標準架構中使用正確的工具或技術在正確的位置中,了解因業務需求來產生相符的雲端基礎設施更為重要。
本篇的重點在於經過討論概念,實作與方法之後產生一個有意義具脈絡性的模型出來。一系列的討論跟我們用甚麼技術堆棧,工具與平台無關。討論出來的模型是定義了我們怎麼分群與術語。例如,起始一台Server在虛擬平台上,如Vmware, 或AWS的 IaaS。
雲端基礎設施的組成
在現代雲端平台上由很多的元件服務所組成,每個元件服務又有著不同的型態。但在這裡我們將它們分為三個層次:
Applications
在這個Layer中的Application與Service都是提供給組織與組織使用者一種功能的能力。
Application runtime
在這個Layer中視對其Application Layer提供服務與所需的容量。在這個Layer的組成與服務包含了容器叢集, 無伺服器環境,application server,作業系統(OS),資料庫等。
Infrastructure platform
一組基礎設施的資源與工具並且是被一個服務所管理的。雲端與虛擬化平台提供的基礎建設為三大類 — 運算,儲存,網路。
基礎設施平台
一個動態的雲端基礎設施可以讓我們達到IaC(Infrastructure as Code)的目的。在此平台上的資源我們可以透過API的方式來提供或異動。在傳統的地端機房時代,基礎設施就是硬體。虛擬化時代的到來將系統與真正的硬體分開來,而API管理方式的加入轉變成為現在的雲端時代。
基礎設施平台有許多型態,從成熟的公有雲到私有雲; 從商用平台到開源式平台。此篇我們將會講述這些平台不同的之處。
剛剛提到基礎設施平台提供的三大種類資源為 — 運算,儲存,網路。而這三大類的資源每一種的型態又有許多種。例如運算資源有虛擬機,容器或無伺服器(serverless)這幾種。
而不管公有雲或私有雲,每個業者的包裝手法也可能不相同,名稱也不一樣。例如以虛擬機來說,AWS稱為EC2,GCP稱為GCE。object storage — AWS稱作S3, GCP稱作Cloud storage, Azure稱作Blob storage。所以我們在此篇關於這三大類的資源盡量採用通用的術語。
多雲環境(Multi Cloud) — 名詞解釋
由於眾多的公有雲與私有雲業者在市場上有眾多的選擇,企業最終會因為一些因素(大都是不想被某個雲端業者綁住)使用多雲策略,以下關於多雲策略有三個名詞:
混合雲(Hybrid cloud)
不管是私有雲(地端機房)搭配公有雲,或是2–3個公有雲互相搭配。會這麼做大都是因為(1)現有在地端的Application(可能是很舊的哪種,要綁硬體的) 無法轉移到公有雲環境,或是(2)現有的法規法令不讓一些服務上到公有雲環境。
雲端無偏好者(Cloud agnostic)
組織不想給某一個雲端業者給綁住(vendor lock-in),所以希望他們的程式服務可以運作在多個雲端環境。但實際上還是會被綁在某個軟體(例如ERP-SAP)或是開發語言上,所以嚴格來說只是換雲端業者而已。而這種不希望被綁住的做法也會帶來一些額外的管理/技術/人員等成本在內。
雲端聚合(PolyCloud)
將企業不同的的程式/平台/服務運行在不同的雲端環境上。這是因為不同的雲端業者有著不同的特性長處,例如GCP善於數據分析,AWS有著多樣的管理工具,Azure對於Windows platform的支援較強等。
基礎設施資源
剛剛提到的基礎設施的三大類有著不同的細項種類,並且每家雲端業者會從這三大類的各種細想包裝成不同的產品名稱或服務。但基本上我們應該要能識別根據業務要求真正需要的雲端資源到底甚麼。例如現有的需求是要有虛擬機,但是否可能會用到容器呢?這是屬於運算資源。同時我們也要提供資料庫服務,而這一個服務就包含了運算,儲存,網路的三種類別於一身。以下我們就來介紹這三種基礎設施資源。
運算資源(Compute Resource)
所謂運算資源其基本就是實體伺服器內的CPU來運行我們的程式,但運行我們的程式有需多種的方式(運算型態):
虛擬機(VMs)
是在一群的實體機器上運行Hypervisor而跑在上面的VM instances。我們在後面的篇章會提到對其啟用,設定,管理VM的細節。
實體伺服器
又稱bare metal,這是用網路的方式(server的firmware — 像是PXE boot)來啟動,安裝,設定OS到這些實體伺服器上。有些雲端業者是提供此種服務給於客戶。
伺服器叢集(Server Cluster)
一組的server所組成的,這邊的Server可以是VM或是實體伺服器甚至混和的方式。而這個方式在雲端業者上又有不一樣的名稱,在AWS稱為ASG(Auto Scaling Group),在Azure稱為Virtual machine scale set,在GCP稱為MIGs(Managed Instance Groups)。
容器(Containers)
許多公有雲業者提供了這類的服務CaaS(Container as a Service)。通常我們是將container 標準的image(如Dicker)打包後放到這些Cloud上運行。而我們的程式就含在這個image中,其底層還是需要Host來支援(大都是VM)。每家對其Host的管理都不盡相同,有些不用管理有些需要做好capacity planning。管理上的工作有大有小,我們在後面的篇章會詳細介紹這一部分。
無伺服器(Serverless runtime)
又稱FaaS(function as a service),就是連底層的運算單元都不需要進行管理將我們的程式放上去運作。這一類的服務絕大多數都是event 或schedule based的,意思是她們只運作短時間。完成作業後就會等待下一次的event or schedule。像是AWS的Lambda, Azure的Azure function或是GCP的Cloud function都屬與此類。
儲存資源(Storage Resources)
在我們的平台或程式運作中都會直接或間接的用到儲存服務,如disk volumes,資料庫或是一個集中放檔案的地方(檔案伺服器)。而這一類的儲存服務也有好幾個型態。
Block storage
這是大家所熟知硬碟(disk volumes)。一個local disk,我們可以掛載給一台VM也可以是一個container。在AWS就稱為EBS, Azure稱為Page Blobs,GCP稱為Persistent Disk,Openstack稱為Cinder。
Object storage
這是一種將檔案本身與其metadata儲存在一起的儲存服務,並且檔案會有多個副本存在於多個地點(同一個region)。基本上是一個儲存空間無限的服務,儲存成本非常小,但存取速度(也就是latency)會遠小於block storage。在AWS稱為S3,Azure稱為Block Blobs, GCP稱作Cloud Storage, Openstack稱為Swift。
Networked filesystems
這就是大家常用的NAS之類的服務,像是使用NFS, AFS, SMB/CIFS這種標準網路服務。
Structured Data storage
在公有雲上使用的絕大多數都是託管式的資料庫(Database as a service),一種也可以用IaC來管理的服務。這種結構化的資料庫在雲端上可能是商用的(如微軟的SQL server),也可能是開源(MySQL or Postgres)的或是基於開源而再自行加工開發的(AWS的Aurora)。也有提供NoSQL的儲存服務,像是儲存key-value型態或是JSON/XML型態的資料庫。目前市面上主要的雲端業者都會提供這些大量資料的儲存,處理,轉換,分析,管理等服務。這些包含了批次處理與串流處理等等。
Secrets management
任何的儲存服務都可以進行加密服務,所以我們可以儲存機敏資料在這些儲存服務中,進而防止資料外洩。而secrets management就是幫我們進行這種資料加密金鑰管理的服務。
網路資源(Network Resources)
與其他類型的基礎設施資源一樣,動態的雲端基礎設施平台根據代碼(code)的所需來提供和變更網路的能力創造了巨大的用途。 這些用途不僅限於更快地變更網路; 它們還包括更安全的網路使用。
部分安全性來自在將網路配置更改在應用於生產環境之前快速準確地測試網路配置更改的能力。 除此之外,與手動操作相比,SDN (Software Defined Networking)可以創建更細粒度的網路安全結構。 對於動態建立和銷毀各部件的系統尤其如此。
一般在在雲端基礎設施平台中的服務與結構包含如下:
Network address blocks
這一個將資源群集起來的基本架構,並在這些資源與外部之控制其網路連線。在AWS與GCP稱為VPC,在Azure 稱為Virtual network。這其實就如同我們在企業內部對其不同的部門,機房或地點分成不同的VLAN並使用一些網路或安全設備(Router/Firewall)來控制其網路連線。
Names, 例如DNS entries
網路名稱對映其IP address。
Routes(路由)
控制其網路traffic被允許流向哪個網段(address blocks)。
Gateways
對Address block對外界的網路traffic控制。
Load balancing rules
將從外部來的(針對單一網路位置)傳送到一個資源池中。
Proxies
將一個內部或外部連線經過一些規則將其轉換或路由這些traffic。
API gateways
一種proxy,通常用於Http/https的連線,它可以執行程序來處理 API 的非核心方面的活動,例如身份驗證和速率限制。
VPNs(virtual private network)
一種網路連線方式,可以從外部登入後將該外部網路設備變成是內部網路的設備。
Direct connection
網路專線,可以從地端機房或Office建立專有的連線而不用透過Internet。
Network Access rules(firewall rules)
用來控制在不同網路位置之間的traffic。
Asynchronous messaging
使用Queue來傳送/接受訊息
Cache
一種緩存跨網路位置來分發資料以改善網路延遲。CDN(content distribute network)就是這種網路加速的服務,通常運行在HTTP/S的協定上。
Service mesh
一個分散的服務網路,動態管理分佈式系統各部分之間的連接。 它將網絡功能從infrastructure layer移動到Application runtime layer。