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
這是因為沒有對齊,也就是空格問題。
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
這是因為沒有對齊,也就是空格問題。