NFS PersistentVolume

 

 

NFS PersistentVolume

 

1、部署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 *
 
 
 

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

[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 是否可用:
 
  一、進入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

 

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

[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。
 
 
 

3、 回收 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 等。
 
 
 

 

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

 一些報錯:

[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 這是由於沒有對齊,也就是空格問題。
相關文章
相關標籤/搜索