阿裡雲容器存儲解決方案
1
介紹
容器技術是這兩年熱門的話題,因為容器技術給我們帶來了很多友善的地方,節約了不少成本,不管是在運維還是開發上。而如今最熱門的開源容器工具就是docker和Kubernets。
1.1
Docker
Docker是
PaaS提供商dotCloud 開源的一個基于
LXC的進階容器引擎,源代碼托管在
Github上, 基于
go語言并遵從Apache2.0協定開源。Docker采用 C/S架構
Docker daemon 作為服務端接受來自客戶的請求,并處理這些請求(建立、運作、分發容器)。 用戶端和服務端既可以運作在一個機器上,也可通過 socket 或者RESTful API 來進行通信。
1.2
Kubernetes
Kubernetes是自動化容器操作的開源平台,這些操作包括部署,排程和節點叢集間擴充。如果你曾經用過Docker容器技術部署容器,那麼可以将Docker看成Kubernetes内部使用的低級别元件。它支援自動化部署、大規模可伸縮、應用容器化管理。
在生産環境中部署一個應用程式時,通常要部署該應用的多個執行個體以便對應用請求進行負載均衡。我們可以使用kubernets建立多個容器,每個容器裡面運作一個應用執行個體,然後通過内置的負載均衡政策,實作對這一組應用執行個體的管理、發現、通路,而這些細節都不需要運維人員去進行複雜的手工配置和處理。
2
容器存儲的需求
Docker裡的資料不做持久化的話資料是不保留的。所有的資料都是臨時的,關了或者重新開機都會讓資料丢失。如何持久化儲存容器的資料,這是自Docker誕生之日起就一直存在的問題。在Docker的初始設計中,資料與容器共生共滅,人們很難把容器從一台機器遷移到另一台機器。時至今日,存儲的發展和變革給了容器持久化存儲以多種多樣的解決之道。
2.1
容器存儲類型
容器架構使用到三種類型的存儲:
第一類是鏡像存儲資料。這可以利用現有的共享存儲進行傳遞,要求類似于伺服器虛拟化環境中虛拟機鏡像分發保護的平台架構。容器鏡像的一項好處在于其存儲容量相較于完整的虛拟機鏡像小了許多,因為它們不會複制作業系統代碼。此外,容器鏡像的運作在設計之初便是固定的,是以可以更高效地存儲、共享。但也是以,容器鏡像無法存儲動态應用程式的資料。
第二類是容器的管理配置資料。不論使用Docker、Kubernetes、Swarm、Mesos還是其它類型的容器管理工具,都需要存儲配置資料、日志記錄等管理資料。這類資料容量不大,ETCD叢集等分布式系統存儲,沒有共享需求,可以直接使用節點的本地硬碟。
第三類是容器應用的存儲,相比虛拟機,容器的設計壽命更短,一旦容器銷毀,所有的臨時存儲都會随之消散。是以,應用真正需要儲存的資料,可以寫入持久化的Volume資料卷。由于以微服務架構為主的容器應用多為分布式系統,容器可能在多個節點中動态地啟動、停止、伸縮或遷移,是以,當容器應用具有持久化的資料時,必須確定資料能被不同的節點所通路。另一方面,容器是面向應用的運作環境,資料通常要儲存到檔案系統中,即存儲接口以檔案形式更适合應用通路。
2.2
容器存儲管理
Kubernetes是開源的容器叢集管理平台,可以自動化部署、擴充和運維容器應用。Kubernetes的排程機關稱作Pod,每個Pod包含一個或多個容器。Pod可部署在叢集的任意節點中,儲存設備可以通過資料卷(Volume)提供給Pod的容器使用。為了不綁定特定的容器技術,Kubernetes沒有使用Docker的Volume機制,而是制定了自己的通用資料卷插件規範,以配合不同的容器運作時來使用(如Docker和rkt)。資料卷分為共享和非共享兩種類型,其中非共享型隻能被某個節點挂載使用,共享型則可以讓不同節點上的多個Pod同時使用。對有狀态的應用來說,共享型的卷存儲能夠很友善地支援容器在叢集各節點之間的遷移。
為了給容器提供更細粒度的卷管理,Kubernetes增加了持久化卷PV(Persistent Volume)的功能,把外置存儲作為資源池,由平台管理并提供給整個叢集使用。Kubernetes的卷管理架構使得存儲可用标準的接入方式,并且通過接口暴露儲存設備所支援的能力,進而在容器任務排程等方面實作了自動化管理。
2.3
阿裡雲容器存儲管理架構
容器存儲控制平面(Container Storage Control Plane),控制平面通常由軟體實作,主要是接收北向API收到的存儲請求,如建立、删除、加載、解除安裝和遷移資料卷(volume)等,并傳遞給底層資料平面去完成實際的存儲操作。控制平面一般需要滿足調用層規範的API,既可以是Docker容器引擎卷插件(Volume Plugin) 的API,也可以是Kubernetes等編排排程平台的Volume API。
存儲資料平面(Storage Data Plane)提供資料實際的持久化能力,不僅需要實作容器資料卷的讀寫、快照、資料保護和複制等存儲操作,而且通常還需具備多節點共享資料的能力。資料平面可以基于檔案NAS實作,也可以基于雲盤來實作資料存儲功能。從部署架構上看,檔案存儲從易用性,擴充性和共享上更優于雲盤。

NAS檔案存儲挂載流程:
1)
API接口調用Kubelet準備啟動POD,并挂載NAS。
2)
Kubelet讀取配置檔案發現需要挂載的NAS,并通知Volume元件挂載。
3)
FlexVolume調用挂載指令挂載NAS。
4)
NAS挂載到ECS主機的/var/lib/kubernet/pods/**/volumes/alicloud-nas/pv-nas目錄下。
5)
Kubelet建立POD,并将挂載了NAS的/var/lib/kubernet/pods/**/volumes/alicloud-nas/pv-nas目錄映射到POD的/data目錄。
3
阿裡雲NAS檔案存儲
阿裡雲檔案存儲NAS是一個彈性擴充,高可靠,高可用,高性能的分布式檔案系統。它基于 POXIS 檔案接口,天然适配原生作業系統,共享通路,同時保證一緻性和鎖互斥,并且性能随容量線性擴充。
阿裡雲檔案存儲NAS架構:
第一層是計算層,使用标準檔案協定NFS/SMB或相容posix的定制化用戶端來通路檔案存儲。第二層是阿裡雲網絡負載均衡ALB,把用戶端請求輪轉發送到前端機。第三層是負責協定處理的前端機,協定盡量做到無狀态,涉及狀态部分下沉到中繼資料管理層。第四層是中繼資料管理,把目錄樹結構轉變成key-value對,通過基于log structure merge tree的分布式key-value來實作。第五層是中繼資料和資料持久化在盤古,使用盤古的分布式存儲量提供高達10PB,和99.999999999%的資料可靠性,容量可彈性擴充,按需使用。
中繼資料和資料分離,NAS
Protocol前端機IO直連盤古,把資料位置資訊和中繼資料一起更新,前端機通過中繼資料更新盤古檔案的資訊。盤古檔案是會散在整個叢集的,是以前端機讀寫可充分利用整個叢集的IO能力,最高可提供50K的IOPS和20GB/s的帶寬吞吐量。
安全隔離,基于VPC安全組提供網絡隔離和ACL通路控制,保證海量容器使用共享存儲時的資料安全隔離。同時提供容器到檔案存儲的傳輸加密,保障資料傳輸過程在不被竊取和篡改。
資料備份,阿裡雲檔案存儲提供檔案系統級的資料備份功能,可以基于靈活的備份政策提供多副本的資料保護,在發生資料誤删除,錯誤修改的情景時,可以使用曆史副本恢複容器資料。
4
阿裡雲容器服務解決方案
4.1
解決方案架構
4.2
阿裡雲容器解決方案設計關注點
易用性:
- 一鍵建立容器叢集。
- 基于容器的一站式應用生命周期管理。
- 整合阿裡雲NAS檔案存儲,容量按需彈性擴充。
- 支援圖形化界面和 OpenAPI。
安全可控:
- 在阿裡雲容器服務中,容器運作在使用者自己的 ECS 節點上,不會和其他使用者共享,容器之間安全隔離。
- 網絡上,使用者可以通過安全組定義容器叢集内 ECS 節點和容器的通路政策,允許或者拒絕某些來源的位址通路容器。
- 容器叢集的管理 API 使用雙向證書校驗,避免接口被非法使用者通路。
- 專門的容器安全解決方案,如 neuvector,可以很友善地內建到阿裡雲容器服務上,提供更高層次的安全防護。
高效可靠,高性能:
- 支援海量容器秒級啟動。
- 共享檔案存儲,支援容器的異常恢複和自動伸縮,資料不丢失。
- 支援跨可用區的容器排程。
5
阿裡雲容器和存儲業務部署配置
5.1
Kubernets叢集部署
1.建立Kubernets叢集
2.确認叢集配置
3.叢集開始自動建立部署
4.叢集建立成功
5.2
阿裡雲NAS檔案存儲部署
1.建立NAS檔案系統
2. 添加挂載點
3.成功添加挂載點,挂載位址用于後續對接容器使用
5.3
Kubernets叢集對接NAS存儲
1.為叢集建立存儲卷
2. 成功建立NAS存儲卷
5.4
釋出一個Nginx容器應用
1.建立應用容器
2.配置容器鏡像、存儲和網絡
鏡像選擇:
存儲配置,選擇NAS檔案存儲作為資料存儲:
叢集網絡服務配置:
叢集網絡路由配置:
3.Nginx容器應用部署成功:
4.在主機測試Nginx,打開浏覽器輸出
www.test.com域名,服務正常: