Kubernetes 數(shù)據(jù)持久化之Persistent 數(shù)據(jù)卷類型

PersistentVolume(PV存儲(chǔ)卷) 是集群中的一塊存儲(chǔ)空間,由集群管理員管理或者由Storage class(存儲(chǔ)類)自動(dòng)管理,PV和Pod,deployment,service 一樣,都是一個(gè)資源對(duì)象
既然有了PV概念,PVC(PersistentVolumeClaim) 也說(shuō)明下,PVC代表用戶使用存儲(chǔ)的請(qǐng)求,應(yīng)用申請(qǐng)PV持久化空間的一個(gè)申請(qǐng)、聲明。K8S集群可能會(huì)有多個(gè)PV,需要不停的為不同的應(yīng)用創(chuàng)建多個(gè)PV。
比如: Pod是消耗node節(jié)點(diǎn)的計(jì)算資源,而PVC 存儲(chǔ)券聲明是消耗PV的存儲(chǔ)資源。Pod可以請(qǐng)求的是特定數(shù)量的計(jì)算資源(CPU或內(nèi)存等),而PVC 請(qǐng)求的是特定大小或特定訪問(wèn)模式(只能被單節(jié)點(diǎn)讀寫(xiě)/可被多節(jié)點(diǎn)只讀/可與被多節(jié)點(diǎn)讀寫(xiě))的存儲(chǔ)資源。

PV和PVC 關(guān)系

PV(存儲(chǔ)卷)和PVC(存儲(chǔ)卷聲明)關(guān)系如下圖:


image.png
1. PV 是集群中的存儲(chǔ)資源,通常是由集群管理員創(chuàng)建和管理
2. StorageClass 用于對(duì)PV進(jìn)行分類,如果配置正常,Storage也可以根據(jù)PVC的請(qǐng)求動(dòng)態(tài)創(chuàng)建PV
3. PVC 是使用該資源的請(qǐng)求,通常由應(yīng)用程序提出請(qǐng)求,并指定對(duì)應(yīng)的StorageClass和需求空間大小
4. PVC 可以作為數(shù)據(jù)卷的一種,被掛載到Pod中使用

存儲(chǔ)卷(PVC)的管理過(guò)程

PV和PVC的管理過(guò)程如下:
1. 在主機(jī)上劃分一個(gè)單獨(dú)的目錄用于PV使用,并且定義其可用大小
2. 創(chuàng)建PVC資源對(duì)象,以便請(qǐng)求PV的存儲(chǔ)空間
3. Pod中添加數(shù)據(jù)卷,數(shù)據(jù)卷關(guān)聯(lián)PVC
4. PVC 中包含容器,容器掛載數(shù)據(jù)卷

PVC配置

底層存儲(chǔ)用NFS存儲(chǔ),然后NFS 目錄互粉1G的容量提供PV 調(diào)度.然后通過(guò)創(chuàng)建PVC來(lái)申請(qǐng)PV的存儲(chǔ)資源空間,最后創(chuàng)建Pod 測(cè)試,使用PVC聲明的存儲(chǔ)資源來(lái)實(shí)現(xiàn)數(shù)據(jù)的持久化。

1、搭建nfs存儲(chǔ)

# yum -y install nfs-utils
[root@master ~]# systemctl enable rpcbind
[root@master ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
[root@master ~]# systemctl start nfs-server
[root@master ~]# systemctl enable nfs-server
[root@master ~]# showmount -e
Export list for master:
/nfsdata *

2、創(chuàng)建PV資源對(duì)象

# vim test-pv.yaml    #編輯PV的yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv
spec:
  capacity:
    storage: 1Gi          #該P(yáng)V可分配的容量為1G
  accessModes:
    - ReadWriteOnce              #訪問(wèn)模式為只能以讀寫(xiě)的方式掛載到單個(gè)節(jié)點(diǎn)
  persistentVolumeReclaimPolicy: Recycle   #回收策略為Recycle
  storageClassName: nfs            #定義存儲(chǔ)類名字
  nfs:                                #這里和上面定義的存儲(chǔ)類名字需要一致
    path: /nfsdata/test-pv       #指定nfs的目錄
    server: 192.168.20.6           #nfs服務(wù)器的IP
#關(guān)于上述的具體解釋
#capacity:指定PV的大小
#AccessModes:指定訪問(wèn)模式
    #ReadWriteOnce:只能以讀寫(xiě)的方式掛載到單個(gè)節(jié)點(diǎn)(單個(gè)節(jié)點(diǎn)意味著只能被單個(gè)PVC聲明使用)
    #ReadOnlyMany:能以只讀的方式掛載到多個(gè)節(jié)點(diǎn)
    #ReadWriteMany:能以讀寫(xiě)的方式掛載到多個(gè)節(jié)點(diǎn)
#persistentVolumeReclaimPolicy:PV的回收策略
    #Recycle:清除PV中的數(shù)據(jù),然后自動(dòng)回收。
    #Retain:需要手動(dòng)回收。
    #Delete:刪除云存儲(chǔ)資源。(云存儲(chǔ)專用)
    #PS:注意這里的回收策略是指,在PV被刪除后,在這個(gè)PV下所存儲(chǔ)的源文件是否刪除。
#storageClassName:PV和PVC關(guān)聯(lián)的依據(jù)。
[root@master ~]# kubectl apply -f test-pv.yaml     #執(zhí)行yaml文件
[root@master ~]# kubectl get pv test-pv    #既然PV是一個(gè)資源對(duì)象,那么自然可以通過(guò)此方式查看其狀態(tài)
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
test-pv   1Gi        RWO            Recycle          Available           nfs                     38s
#查看PV的狀態(tài)必須為Available才可以正常使用

3、創(chuàng)建PVC資源對(duì)象

#cat test-pvc.yaml         #編寫(xiě)yaml文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:          #定義訪問(wèn)模式,必須和PV定義的訪問(wèn)模式一致
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi          #直接請(qǐng)求使用最大的容量
  storageClassName: nfs      #這里的名字必須和PV定義的名字一致
[root@master ~]# kubectl apply -f test-pvc.yaml     #執(zhí)行yaml文件

#再次查看PV及PVC的狀態(tài)(狀態(tài)為bound,表示該P(yáng)V正在被使用)
[root@master ~]# kubectl get pvc      #查看PVC的狀態(tài)
NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-pvc   Bound    test-pv   1Gi        RWO            nfs            2m10s
[root@master ~]# kubectl get pv      #查看PV的狀態(tài)
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM              STORAGECLASS   REASON   AGE
test-pv   1Gi        RWO            Recycle          Bound    default/test-pvc   nfs                     8m24s

4、 創(chuàng)建一個(gè)Pod

 test-pod.yaml       #編寫(xiě)pod的yaml文件
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30000
    volumeMounts:
    - mountPath: /testdata
      name: volumedata     #這里自定義個(gè)名稱
  volumes:
    - name: volumedata      #這里的是上面定義的名稱解釋,這兩個(gè)名稱必須一致
      persistentVolumeClaim:
        claimName: test-pvc
[root@master ~]# kubectl apply -f test-pod.yaml        #執(zhí)行yaml文件
[root@master ~]# kubectl get pod     #查看pod的狀態(tài),發(fā)現(xiàn)其一直處于ContainerCreating狀態(tài)
#怎么回事呢?
NAME       READY   STATUS              RESTARTS   AGE
test-pod   0/1     ContainerCreating   0          23s
#當(dāng)遇到pod狀態(tài)不正常時(shí),一般我們可以采用三種方式來(lái)排錯(cuò)
#第一就是使用kubectl  describe命令來(lái)查看pod的詳細(xì)信息
#第二就是使用kubectl logs命令來(lái)查看pod的日志
#第三就是查看宿主機(jī)本機(jī)的message日志
#這里我采用第一種方法排錯(cuò)
[root@master ~]# kubectl describe pod test-pod
#輸出的最后一條信息如下:
mount.nfs: mounting 192.168.20.6:/nfsdata/test-pv failed, reason given by server: No such file or directory
#原來(lái)是我們?cè)趻燧dnfs存儲(chǔ)目錄時(shí),指定的目錄并不存在
#那就在nfs服務(wù)器上(這里是本機(jī))進(jìn)行創(chuàng)建相關(guān)目錄咯
[root@master ~]# mkdir -p /nfsdata/test-pv      #創(chuàng)建對(duì)應(yīng)目錄
[root@master ~]# kubectl get pod test-pod   #然后再次查看pod的狀態(tài)
#如果pod的狀態(tài)還是正在創(chuàng)建,那么就是因?yàn)檫\(yùn)行該pod的節(jié)點(diǎn)上的kubelet組件還沒(méi)有反應(yīng)過(guò)來(lái)
#如果要追求pod的啟動(dòng)速度,可以手動(dòng)將pod所在節(jié)點(diǎn)的kubelet組件進(jìn)行重啟即可。
[root@master ~]# kubectl get pod test-pod    #稍等片刻,再次查看,發(fā)現(xiàn)其pod已經(jīng)running了
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          8m

5、測(cè)試其數(shù)據(jù)持久化的效果

# kubectl exec -it test-pod /bin/sh   #進(jìn)入pod
/ # echo "test pv pvc" > /testdata/test.txt       #向數(shù)據(jù)持久化的目錄寫(xiě)入測(cè)試信息
#回到nfs服務(wù)器,查看共享的目錄下是否有容器中寫(xiě)入的信息
[root@master ~]# cat /nfsdata/test-pv/test.txt   #確定是有的
test pv pvc
#現(xiàn)在查看到pod容器的所在節(jié)點(diǎn),然后到對(duì)應(yīng)節(jié)點(diǎn)將其刪除
[root@master ~]# kubectl get pod -o wide       #我這里是運(yùn)行在node02節(jié)點(diǎn)
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
test-pod   1/1     Running   0          11m   10.244.2.2   node02   <none>           <none>
#在node02節(jié)點(diǎn)查看到其pod容器的ID號(hào),然后將其刪除
[root@node02 ~]# docker ps      #獲取容器的ID號(hào)
[root@node02 ~]# docker rm -f dd445dce9530   #刪除剛剛創(chuàng)建的容器
#回到nfs服務(wù)器,發(fā)現(xiàn)其本地目錄下的數(shù)據(jù)還是在的
[root@master ~]# cat /nfsdata/test-pv/test.txt 
test pv pvc
#那么現(xiàn)在測(cè)試,將這個(gè)pod刪除,nfs本地的數(shù)據(jù)是否還在?
[root@master ~]# kubectl delete -f test-pod.yaml 
[root@master ~]# cat /nfsdata/test-pv/test.txt      #哦吼,數(shù)據(jù)還在
test pv pvc
#那現(xiàn)在要是將PVC刪除呢?
[root@master ~]# kubectl delete -f test-pvc.yaml 
[root@master ~]# cat /nfsdata/test-pv/test.txt       #哦吼,數(shù)據(jù)不在了。
cat: /nfsdata/test-pv/test.txt: 沒(méi)有那個(gè)文件或目錄

總結(jié)

由于我們?cè)趧?chuàng)建pv這個(gè)資源對(duì)象時(shí),采用的回收策略是清除PV中的數(shù)據(jù),然后自動(dòng)回收,而PV這個(gè)資源對(duì)象是由PVC來(lái)申請(qǐng)使用的,所以不管是容器也好,pod也好,它們的銷毀并不會(huì)影響用于實(shí)現(xiàn)數(shù)據(jù)持久化的nfs本地目錄下的數(shù)據(jù),但是,一旦這個(gè)PVC被刪除,那么本地的數(shù)據(jù)就會(huì)隨著PVC的銷毀而不復(fù)存在,也就是說(shuō),采用PV這種數(shù)據(jù)卷來(lái)實(shí)現(xiàn)數(shù)據(jù)的持久化,它這個(gè)數(shù)據(jù)持久化的生命周期是和PVC的生命周期是一致的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容