nfs實現k8s持久化


1. 部署nfs服務端

k8s-master 節點上搭建了 NFS 服務器

(1)安裝nfs服務:

yum install -y nfs-utils rpcbind
vim /etc/exports
/nfsdata *(rw,no_root_squash,no_all_squash,sync)

(2)保存配置文件后,執行如下操作:

在服務端創建對應的目錄和賦予權限:

 mkdir /nfsdata
 chmod 777 /nfsdata

 

(3) 啟動rpcbind和nfs服務:

systemctl start rpcbind && systemctl enable rpcbind
systemctl start nfs && systemctl enable nfs

(4)每個node安裝nfs工具

 yum install -y nfs-utils 

(5) 每個node查詢NFS服務器

showmount -e nfs-ip

2. NFS PersistentVolume 

創建 PV 

(1)下面創建一個 PV mypv1,配置文件 nfs-pv1.yml 如下:

① capacity 指定 PV 的容量為 1G。

② accessModes 指定訪問模式為 ReadWriteOnce,支持的訪問模式有:

ReadWriteOnce – PV 能以 read-write 模式 mount 到單個節點。

ReadOnlyMany – PV 能以 read-only 模式 mount 到多個節點。

ReadWriteMany – PV 能以 read-write 模式 mount 到多個節點。

③ persistentVolumeReclaimPolicy 指定當 PV 的回收策略為 Recycle,支持的策略有:

Retain – 需要管理員手工回收。

Recycle – 清除 PV 中的數據,效果相當於執行 rm -rf /thevolume/*。

Delete – 刪除 Storage Provider 上的對應存儲資源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

④ storageClassName 指定 PV 的 class 為 nfs。相當於為 PV 設置了一個分類,PVC 可以指定 class 申請相應 class 的 PV。

⑤ 指定 PV 在 NFS 服務器上對應的目錄。

  注意要做storage-provider段要提前建好文件夾

 

(2)創建 mypv1:

 

 

STATUS 為 Available,表示 mypv1 就緒,可以被 PVC 申請。

創建 PVC

(1)接下來創建 PVC mypvc1,配置文件 nfs-pvc1.yml 如下:

 

 

PVC 就很簡單了,只需要指定 PV 的容量,訪問模式和 class。

(2)創建 mypvc1:

 

 

  從 kubectl get pvc 和 kubectl get pv 的輸出可以看到 mypvc1 已經 Bound 到 mypv1,申請成功。

Pod使用pvc

(1)接下來就可以在 Pod 中使用存儲了,Pod 配置文件 pod1.yml 如下:

 

與使用普通 Volume 的格式類似,在 volumes 中過 persistentVolumeClaim 指定使用 mypvc1 申請的 Volume。

(2)創建 mypod1:

 

(3)驗證 PV 是否可用:

kubectl exec mypod1 touch /mydata/hello

  可見,在 Pod 中創建的文件 /mydata/hello 確實已經保存到了 NFS 服務器目錄 /nfsdata/pv1 中。

  如果不再需要使用 PV,可用刪除 PVC 回收 PV。

3. 回收 PV  

通過pvc回收pv

(1)當 PV 不再需要時,可通過刪除 PVC 回收。

 

  當 PVC mypvc1 被刪除后,發現 Kubernetes 啟動了一個新 Pod,這個 Pod 的作用就是清除 PV mypv1 的數據。這個時候再看 NFS 服務器目錄 /nfsdata/pv1 中已經沒有數據了。

 

(2)當數據清除完畢,mypv1 的狀態重新變為 Available,此時則可以被新的 PVC 申請。

 

(3)因為 PV 的回收策略設置為 Recycle,所以數據會被清除,但這可能不是我們想要的結果。如果我們希望保留數據,可以將策略設置為 Retain。

 

(4)通過 kubectl apply 更新 PV:

  

(5)回收策略已經變為 Retain,通過下面步驟驗證其效果:

 

  ① 重新創建 mypvc1。

  ② 在 mypv1 中創建文件 hello。

  ③ mypv1 狀態變為 Released。

  ④ Kubernetes 並沒有啟動 Pod recycler-for-mypv1。

  ⑤ PV 中的數據被完整保留。

 

(6)我們再看 NFS 服務器目錄 /nfsdata/pv1 中數據還保留。

 

(7)雖然 mypv1 中的數據得到了保留,但其 PV 狀態會一直處於 Released,不能被其他 PVC 申請。

 

(8)為了重新使用存儲資源,可以刪除並重新創建 mypv1。刪除操作只是刪除了 PV 對象,存儲空間中的數據並不會被刪除。

新建的 mypv1 狀態為 Available,已經可以被 PVC 申請。

 

  PV 還支持 Delete 的回收策略,會刪除 PV 在 Storage Provider 上對應存儲空間。NFS 的 PV 不支持 Delete,支持 Delete 的 Provider 有 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

4.  PV的動態供給  

pv的供給方式

  前面的例子中,我們提前創建了 PV,然后通過 PVC 申請 PV 並在 Pod 中使用,這種方式叫做靜態供給(Static Provision)。

  與之對應的是動態供給(Dynamical Provision),即如果沒有滿足 PVC 條件的 PV,會動態創建 PV。相比靜態供給,動態供給有明顯的優勢:不需要提前創建 PV,減少了管理員的工作量,效率高。

   動態供給是通過 StorageClass 實現的,StorageClass 定義了如何創建 PV

 

pv動態供給舉例

StorageClass standard:

 

StorageClass slow:

 

  這兩個 StorageClass 都會動態創建 AWS EBS,不同在於 standard 創建的是 gp2 類型的 EBS,而 slow 創建的是 io1 類型的 EBS。不同類型的 EBS 支持的參數可參考 AWS 官方文檔。

StorageClass 支持 Delete 和 Retain 兩種 reclaimPolicy,默認是 Delete。

與之前一樣,PVC 在申請 PV 時,只需要指定 StorageClass 和容量以及訪問模式,比如:

 

  除了 AWS EBS,Kubernetes 支持其他多種動態供給 PV 的 Provisioner,完整列表請參考 https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM