Persistent Volume(持久化卷)簡稱PV, 是一個K8S資源對象,我們可以單獨創建一個PV, 它不和Pod直接發生關系, 而是通過
Persistent Volume Claim, 簡稱PVC來實現動態綁定, 我們會在Pod定義里指定創建好的PVC, 然后PVC會根據Pod的要求去自
動綁定合適的PV給Pod使用。
持久化卷下PV和PVC概念:
Persistent Volume(PV)是由管理員設置的存儲,它是群集的一部分。就像節點是集群中的資源一樣,PV 也是集群中的資
源。 PV 是 Volume 之類的卷插件,但具有獨立於使用 PV 的 Pod 的生命周期。此 API 對象包含存儲實現的細節,即 NFS、
iSCSI 或特定於雲供應商的存儲系統。
PersistentVolumeClaim(PVC)是用戶存儲的請求。它與 Pod 相似,Pod 消耗節點資源,PVC 消耗 PV 資源。Pod 可以
請求特定級別的資源(CPU 和內存)。PVC聲明可以請求特定的大小和訪問模式(例如,可以以讀/寫一次或只讀多次模式掛
載)。
它和普通Volume的區別是什么呢?
普通Volume和使用它的Pod之間是一種靜態綁定關系,在定義Pod的文件里,同時定義了它使用的Volume。Volume是Pod
的附屬品,我們無法單獨創建一個Volume,因為它不是一個獨立的K8S資源對象。
1 准備一台機器,搭建NFS服務
yum install nfs-utils vim /etc/exports /data/k8s/ 172.16.1.0/24(sync,rw,no_root_squash) systemctl start nfs; systemctl start rpcbind systemctl enable nfs
2 在node節點上測試
yum install nfs-utils showmount -e 172.16.1.131
3 創建pv(master上)
vim mypv.yaml //內容如下
apiVersion: v1 kind: PersistentVolume metadata: name: pv001 spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: path: /data/k8s/ server: 172.16.1.131
kubectl create -f mypv.yaml
kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 10Gi RWX Retain Available 10m
狀態為Available,這是因為它還沒有綁定到任何的pvc上面,當定義完pvc后,就可以自動綁定了。
4 創建pvc(master上)
vim mypvc.yaml //內容如下
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim spec: accessModes: - ReadWriteMany resources: requests: storage: 8Gi
kubectl create -f mypvc.yaml
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Bound pv001 10Gi RWX 2m
可以看到,pvc狀態為Bound,它綁定了pv001
5 定義pod
vim pvpod.yaml //內容如下
apiVersion: v1 kind: Pod metadata: name: httpd-pvpod spec: containers: - image: httpd name: httpd-withpvc-pod imagePullPolicy: Always volumeMounts: - mountPath: "/usr/local/apache2/htdocs/" name: httpd-volume volumes: - name: httpd-volume persistentVolumeClaim: claimName: myclaim
kubectl create -f pvpod.yaml
kubectl describe pod httpd-pvpod //查看Volumes那部分里的ClaimName
6 驗證
1)到NFS的共享目錄下創建一個文件
cd /data/k8s/
echo "Test file" > 1.html
2)進入到httpd-pod里
kubectl exec -it httpd-pvpod bash
cat /usr/local/apache2/htdocs/1.html
3)刪除httpd-pvpod
kubectl delete pod httpd-pvpod
cat /data/k8s/1.html
4)重建httpd-pod
kubectl create -f pvpod.yaml
5)curl訪問
kubectl get pod httpd-pvpod -o wide //查看其對應的IP
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
httpd-pod 1/1 Running 0 2m 172.20.3.5 172.7.15.114 <none>
curl 172.20.3.5/1.html