在Docker的設計實現(xiàn)中徽缚,容器中的數(shù)據(jù)是臨時性的,當容器銷毀或重新啟動時存儲在容器內(nèi)部的數(shù)據(jù)將會全部丟失不从,但實際上很多容器化應用是需要持久化保存的數(shù)據(jù),這就需要使用Docker數(shù)據(jù)卷掛載宿主機上的文件或者目錄到容器中以保證數(shù)據(jù)的持久化存儲把曼。在Kubernetes中Pod重建如同Docker銷毀一樣,數(shù)據(jù)就會丟失漓穿,Kubernetes也通過掛載數(shù)據(jù)卷方式為Pod數(shù)據(jù)提供持久化能力嗤军,這些數(shù)據(jù)卷以Pod為最小單位進行存儲,通過共享存儲或分布式存儲在各個Pod之間實現(xiàn)共享晃危。
存儲使用場景
Kubernetes是由Master節(jié)點及Node節(jié)點組成的叙赚,在Master節(jié)點中通過etcd存儲了Kubernetes集群的節(jié)點信息、Pod信息山害、容器信息纠俭、配置信息。Node節(jié)點主要對外提供容器服務浪慌,著重描述Node節(jié)點與存儲相關(guān)的內(nèi)容。
Kubernetes以Pod為單位對外提供容器服務朴则,真正的服務是通過Service進行訪問的权纤。Kubernetes中的服務按類型分成三種:無狀態(tài)服務(stateless)钓简、普通有狀態(tài)服務、有狀態(tài)集群服務汹想。
無狀態(tài)服務:不需要持久化存儲的外邓,即使Pod重建也不會受影響,只要確保服務的可靠性便可古掏,Kubernetes通過ReplicationSet來保證某個服務的實例數(shù)量损话。
普通有狀態(tài)服務:這類服務需要保留服務的狀態(tài),通常通過Kubernetes提供的Volume及Persistent Volume槽唾、Persistent Volume Claim來保存狀態(tài)丧枪。
有狀態(tài)的集群服務:這類服務除了保存服務狀態(tài)的同時還需要提供集群管理的功能,集群管理過程中也涉及臨時數(shù)據(jù)的保存庞萍、集群內(nèi)數(shù)據(jù)共享等拧烦。
Kubernetes中涉及存儲的主要使用場景:
1) 容器集群相關(guān)配置信息及運行時信息保存,這類信息存儲在etcd中钝计。
2) 服務的基本配置文件及證書文件恋博。
3) 服務的狀態(tài)存儲、數(shù)據(jù)存儲信息私恬。
4) 集群內(nèi)不同服務交換共享的數(shù)據(jù)信息债沮。
文件存儲的幾種形式
1) 臨時文件形式:同一個Pod內(nèi)不同容器間通過共享內(nèi)存方式訪問,會創(chuàng)建一個空目錄本鸣,交換完信息后會刪除這個空目錄秦士。
2) HostPath方式:同一個Node內(nèi)不同的Pod間進行信息共享使用HostPath方式(比如時區(qū)timezone)。如果Pod配置了EmptyDir數(shù)據(jù)卷永高,則它在Pod的生命周期內(nèi)都會存在隧土。當Pod被分配到Node上的時候,會在Node上創(chuàng)建EmptyDir數(shù)據(jù)卷命爬,并掛載到Pod的容器中曹傀。
3) PV及PVC:Kubernetes的持久化存儲機制的核心是PV(Persistent Volume)、PVC (Persistent Volume Claim)饲宛。PV是Volume插件皆愉,關(guān)聯(lián)到真正的后端存儲系統(tǒng),PVC是從PV中申請資源艇抠,而不需要關(guān)心存儲的提供方幕庐。PVC和PV的關(guān)系就如同Pod和Node一樣,Pod是消費Node提供的資源家淤,PVC是消費PV提供的存儲資源异剥。PVC和PV通過匹配完成綁定關(guān)系,PVC可以被Pod里的容器掛載絮重。
4) 網(wǎng)絡方式:不同Node節(jié)點之間的數(shù)據(jù)共享通過網(wǎng)絡方式使用冤寿,通常采用分布式存儲方式歹苦。開源的分布式文件系統(tǒng)比較流行的選擇有GlusterFS和Ceph,還有一些其他的分布式文件系統(tǒng)(NFS)選擇督怜。
5) 自定義插件方式:Kubernetes提供了豐富的Volume的插件來進行存儲管理殴瘦。如果存儲管理接口不夠用,用戶可以通過CSI或Flex Volume進行擴展号杠。
存儲組件實現(xiàn)原理
存儲管理組件(存儲組件)主要是接收北向API收到的Rest請求蚪腋,維護持久卷的生命周期管理。如創(chuàng)建姨蟋、刪除卷屉凯,存儲組件負責與后端存儲軟件交互完成實際的創(chuàng)建、刪除卷等操作芬探;并負責調(diào)用Kubernetes原生接口創(chuàng)建對應的PVC和PV神得。
存儲后端系統(tǒng)提供數(shù)據(jù)文件的實際持久化能力,不僅需要實現(xiàn)數(shù)據(jù)文件的讀寫偷仿、副本復制等存儲操作哩簿,通常還需具備多節(jié)點高可用的能力。
當需要為自己的微服務應用掛載持久卷時酝静,只需要通過存儲組件創(chuàng)建持久卷节榜,存儲組件會在Kubernetes業(yè)務集群創(chuàng)建PVC/PV,并到后端存儲系統(tǒng)(如GlusterFS)上創(chuàng)建真正的物理Volume别智,同時維護好PVC/PV/Volume之間的一一映射對應關(guān)系宗苍。這樣,用戶部署容器時就可以選擇掛載相應的持久卷薄榛,部署后相應的卷就可以掛載到對應的容器讳窟。應用掛載持久卷后,進行讀寫時就類似于本地目錄的讀寫操作敞恋。
在Pod進行重建或者遷移到其他節(jié)點時丽啡,Pod可以自動掛回原來對應的持久卷,繼續(xù)使用原先的數(shù)據(jù)硬猫。多個Pod可以共享一個持久卷补箍,從而達到容器間文件共享的目的。
摘抄自陸平的《基于Kubernetes的容器云平臺實戰(zhàn)》一書的第11章Kubernetes存儲