Kubernetes & Volume & Persistent Volume
Kubernetes & Volume & Persistent Volume
一、Volume
Volume(儲存卷)
是Pod中能夠被多個容器訪問的共享目錄。
Kubernetes
的Volume
概念、用途和目的與Docker的Volume比較類似,但兩者不能等價。首先,Kubernetes中的Volume被定義在Pod上,然後被一個Pod裡的多個容器掛載到具體的檔案目錄下;
其次,Kubernetes中的Volume與Pod的生命週期相同,但與容器的生命週期不相關,當容器終止或者重啟時,Volume中的資料也不會丟失。
最後,Kubernetes支援多種型別的Volume,例如GlusterFS
Ceph
等先進的分散式檔案系統。
Volume的使用也比較簡單,在大多數情況下,我們先在Pod上宣告一個Volume,然後在容器裡引用該Volume
並掛載(Mount
)到容器裡的某個目錄上。
Kubernetes提供了非常豐富的Volume型別,下面逐一進行說明。
1.emptyDir
一個emptyDir Volume
是在Pod分配到Node時建立的。從它的名稱就可以看出,它的初始內容為空,並且無須指定宿主機上對應的目錄檔案,因為這是Kubernetes自動分配的一個目錄,當Pod從Node上移除時,emptyDir中的資料也會被永久刪除。emptyDir的一些用途如下。
- ◎ 臨時空間,例如用於某些應用程式執行時所需的臨時目錄,且無須永久保留。
- ◎ 長時間任務的中間過程CheckPoint的臨時儲存目錄。
- ◎ 一個容器需要從另一個容器中獲取資料的目錄(多容器共享目錄)。
目前,使用者無法控制emptyDir
使用的介質種類。如果kubelet的配置是使用硬碟,那麼所有emptyDir都將被建立在該硬碟上。Pod在將來可以設定emptyDir是位於硬碟、固態硬碟上還是基於記憶體的tmpfs上。
2.hostPath
hostPath
為在Pod上掛載宿主機上的檔案或目錄,它通常可以用於以下幾方面。
- ◎ 容器應用程式生成的日誌檔案需要永久儲存時,可以使用宿主機的高速檔案系統進行儲存。
- ◎ 需要訪問宿主機上Docker引擎內部資料結構的容器應用時,可以通過定義hostPath為宿主機/var/lib/docker目錄,使容器內部應用可以直接訪問Docker的檔案系統。
在使用這種型別的Volume時,需要注意以下幾點。
- ◎ 在不同的Node上具有相同配置的Pod,可能會因為宿主機上的目錄和檔案不同而導致對Volume上目錄和檔案的訪問結果不一致。
- ◎ 如果使用了資源配額管理,則Kubernetes無法將hostPath在宿主機上使用的資源納入管理。
3.gcePersistentDisk
使用這種型別的Volume
表示使用谷歌公有云提供的永久磁碟(Persistent Disk,PD
)存放Volume
的資料,它與emptyDir
不同,PD上的內容會被永久儲存,當Pod被刪除時,PD只是被解除安裝(Unmount),但不會被刪除。需要注意的是,你需要先建立一個PD,才能使用gcePersistentDisk
。
使用gcePersistentDisk時有以下一些限制條件。
- ◎ Node(執行kubelet的節點)需要是GCE虛擬機器。
- ◎ 這些虛擬機器需要與PD存在於相同的GCE專案和Zone中。
4.awsElasticBlockStore
與GCE類似,該型別的Volume使用亞馬遜公有云提供的EBS Volume儲存資料,需要先建立一個EBS Volume才能使用awsElasticBlockStore
。
使用awsElasticBlockStore
的一些限制條件如下。
-
◎ Node(執行kubelet的節點)需要是AWS EC2例項。
-
◎ 這些AWS EC2例項需要與EBS Volume存在於相同的
region
和availability-zone
中。 -
◎ EBS只支援單個EC2例項掛載一個Volume。
5.NFS
使用NFS網路檔案系統提供的共享目錄儲存資料時,我們需要在系統中部署一個NFS Server。
6.其他型別Volume
-
◎ iscsi:使用iSCSI儲存裝置上的目錄掛載到Pod中。
-
◎ flocker:使用Flocker管理儲存卷。
-
◎ glusterfs:使用開源GlusterFS網路檔案系統的目錄掛載到Pod中。
-
◎ rbd:使用Ceph塊裝置共享儲存(Rados Block Device)掛載到Pod中。
-
◎ gitRepo:通過掛載一個空目錄,並從Git庫clone一個git repository以供Pod使用。
-
◎ secret:一個Secret Volume用於為Pod提供加密的資訊,你可以將定義在Kubernetes中的Secret直接掛載為檔案讓Pod訪問。Secret Volume是通過TMFS(記憶體檔案系統)實現的,這種型別的Volume總是不會被持久化的
二、Persistent Volume
之前提到的Volume是被定義在Pod上的,屬於計算資源的一部分,而實際上,網路儲存是相對獨立於計算資源而存在的一種實體資源。比如在使用虛擬機器的情況下,我們通常會先定義一個網路儲存,然後從中劃出一個“網盤”並掛接到虛擬機器上。Persistent Volume(PV)和與之相關聯的Persistent Volume Claim(PVC)也起到了類似的作用。
PV可以被理解成Kubernetes叢集中的某個網路儲存對應的一塊儲存,它與Volume類似,但有以下區別。
-
◎ PV只能是網路儲存,不屬於任何Node,但可以在每個Node上訪問。
-
◎ PV並不是被定義在Pod上的,而是獨立於Pod之外定義的。
-
◎ PV目前支援的型別包括:gcePersistentDisk、AWSElasticBlockStore、AzureFile、AzureDisk、FC(Fibre Channel)、Flocker、NFS、iSCSI、RBD(Rados Block Device)、CephFS、Cinder、GlusterFS、VsphereVolume、Quobyte Volumes、VMware Photon、Portworx Volumes、ScaleIO Volumes和HostPath
比較重要的是PV的accessModes屬性,目前有以下型別。
- ◎ ReadWriteOnce:讀寫許可權,並且只能被單個Node掛載。
- ◎ ReadOnlyMany:只讀許可權,允許被多個Node掛載。
- ◎ ReadWriteMany:讀寫許可權,允許被多個Node掛載。
最後說說PV的狀態。PV是有狀態的物件,它的狀態有以下幾種。
- ◎ Available:空閒狀態。
- ◎ Bound:已經繫結到某個PVC上。
- ◎ Released:對應的PVC已經被刪除,但資源還沒有被叢集收回。
- ◎ Failed:PV自動回收失敗。