NFS PersistentVolume


 

 

NFS PersistentVolume

 

一、部署nfs服務端:

 
在k8s的部署節點上搭建了 NFS 服務器
(1)安裝nfs服務:
yum install -y nfs-utils rpcbind
 
然后將/opt/nfsshare/目錄共享出去
vim /etc/exports
/opt/nfsshare *(rw,no_root_squash,no_all_squash,sync)
 
 
(2)保存配置文件后,執行如下操作:
在服務端創建對應的目錄和賦予權限:
[root@cicd opt]# ls
harbor  nfsshare [root@cicd opt]# chmod -R 777 nfsshare/

 
(3) 啟動rpcbind和nfs服務,並設置自啟動
systemctl start rpcbind && systemctl enable rpcbind
systemctl start nfs && systemctl enable nfs
 
(4)每個node節點都安裝nfs工具,並且重啟nfs服務
 yum install -y nfs-utils 
 
(5) 每個node查詢NFS服務器
showmount -e nfs-ip
[root@node1 network-scripts]# showmount -e 192.168.253.9
Export list for 192.168.253.9:
/opt/nfsshare *
 
 
 

二、 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

[root@cicd yml]# kubectl apply -f  nfs-pv1.yml
persistentvolume "mypv1" created
[root@cicd yml]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
mypv1     1G         RWO            Recycle          Available             nfs                      2m
STATUS 為  Available,表示  mypv1 就緒,可以被 PVC 申請。
 
 

創建 PVC

 
(1)接下來創建 PVC  mypvc1,配置文件  nfs-pvc1.yml 如下:
 
 
PVC 就很簡單了,只需要指定 PV 的容量, 訪問模式和 class。
 
 

(2)創建 mypvc1

 
[root@cicd yml]# kubectl apply -f nfs-pvc1.yml 
persistentvolumeclaim "mypvc1" created
[root@cicd yml]# kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc1    Bound     mypv1     1G         RWO            nfs            9s
 
 
從  kubectl get pvc 和  kubectl get pv 的輸出可以看 到 mypvc1 已經 Bound 到 mypv1申請成功。
 
 

Pod使用pvc

 
(1)接下來就可以在 Pod 中使用存儲了,Pod 配置文件  pod1.yml 如下:
 值得注意的是mountpath也就是掛載目錄與宿主機的映射目錄是/opt/nfsshare/pv1.
 
與使用普通 Volume 的格式類似, 在 volumes 中通過 persistentVolumeClaim 指定使用 mypvc1 申請的 Volume。
(2)創建  mypod1
[root@cicd yml]# kubectl apply -f pod1.yml 
pod "mypod1" created
[root@cicd yml]# kubectl get pod -o wide
NAME                                READY     STATUS              RESTARTS   AGE       IP              NODE
httpd-deployment-67b8d86468-9bz57   1/1       Running             1          19h       172.20.104.9    192.168.253.11
httpd-deployment-67b8d86468-skw2n   1/1       Running             0          19h       172.20.135.28   192.168.253.10
httpd-deployment-67b8d86468-zmr75   1/1       Running             1          19h       172.20.104.7    192.168.253.11 mypod11/1       running             8s        19         172.20.135.33   192.168.253.10

 

(3)驗證 PV 是否可用:
 
  1、進入mypod1中的mydata目錄下創建hello文件
[root@cicd yml]# kubectl exec -it mypod1 /bin/sh
/ # ls
bin     etc     mydata  root    tmp     var
dev     home    proc    sys     usr
/ # cd mydata/mydata # touch hello

 

2、cd到與宿主機映射的目錄下查看是否映射成功。

[root@cicd yml]# cd /opt/nfsshare/
[root@cicd nfsshare]# ls
pv1
[root@cicd nfsshare]# cd pv1/
[root@cicd pv1]# ls
hello 
 
可見,在 Pod 中創建的文件  /mydata/hello  確實已經保存到了 NFS 服務器目錄 /nfsdata/pv1 中。
如果 不再需要使用 PV,可用刪除 PVC 回收 PV。
 
 
 

三、 回收 PV  :

 

通過pvc回收pv

 
(1)當 PV 不再需要時,可通過刪除 PVC 回收,執行:
 
  kubectl delete pvc mypvc1
[root@cicd pv1]# kubectl get pvc

No resources found.

 

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

 

(2)當數據清除完畢,mypv1 的狀態重新變為 Available,此時則可以被新的 PVC 申請。
[root@cicd pv1]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
mypv1     1G         RWO            Recycle         Available           nfs                      23m

 

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

 
(4)通過 kubectl apply 更新 PV:
[root@cicd yml]# kubectl apply -f nfs-pv1.yml 
persistentvolume "mypv1" configured

 

(5)回收策略已經變為 Retain,通過下面步驟驗證其效果:
[root@cicd yml]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
mypv1     1G         RWO            Retain           Available             nfs      
 
① 重新創建 mypvc1。
kubectl exec -it  mypod1 /bin/sh

② 在 mypv1 中創建文件 hello。
/mydata # touch hello
 
③ 執行刪除pvc-mypv1, 發現pv狀態變為 Released。
[root@cicd pv1]# kubectl delete pvc mypvc1
persistentvolumeclaim "mypvc1" deleted

[root@cicd pv1]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM            STORAGECLASS   REASON    AGE
mypv1     1G         RWO            Retain           Released default/mypvc1   nfs                      37m
 
可以發現Kubernetes 並沒有啟動 Pod recycler-for-mypv1。
 
 
(6)我們再看 NFS 服務器目錄 /nfsdata/pv1 中數據還保留。
[root@cicd pv1]# cd /opt/nfsshare/pv1/
[root@cicd pv1]# ls
hello

 

 
(7)雖然 mypv1 中的數據得到了保留, 但其 PV 狀態會一直處於 Released,不能被其他 PVC 申請。
 
 
(8)為了重新使用存儲資源,可以刪除並重新創建 mypv1。刪除操作只是刪除了 PV 對象,存儲空間中的數據並不會被刪除。
新建的 mypv1 狀態為 Available,已經可以被 PVC 申請。
[root@cicd yml]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
mypv1     1G         RWO            Retain           Available             nfs                      49s

 

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

 

四、 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 和容量以及訪問模式。
 
 
 

 一些報錯:

[root@cicd ~]# kubectl apply -f httpd.yml
error: error validating "httpd.yml": error validating data: apiVersion not set; if you choose to ignore these errors, turn validation off with --validate=false
這是因為配置內容錯誤apiVersion鍵值對錯誤

[root@cicd yml]# kubectl apply -f nfs-pvc1.yml
error: error converting YAML to JSON: yaml: line 1: mapping values are not allowed in this context
這是因為yaml文件中含有不是鍵值對格式的內容

[root@cicd yml]# kubectl apply -f pod1.yml
error: error converting YAML to JSON: yaml: line 15: did not find expected key
[root@cicd yml]# vim pod1.yml
這是因為沒有對齊,也就是空格問題。


免責聲明!

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



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