1. 程式人生 > 實用技巧 >Kubernetes & Volume & Persistent Volume

Kubernetes & Volume & Persistent Volume

Kubernetes & Volume & Persistent Volume

一、Volume

Volume(儲存卷)是Pod中能夠被多個容器訪問的共享目錄。

KubernetesVolume概念、用途和目的與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存在於相同的regionavailability-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自動回收失敗。