日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

云原生技術(shù)持久化存儲PV與PVC_云其它

作者:、重明 ? 更新時間: 2022-05-21 編程語言

1.PV與PVC

PV:

持久卷(PersistentVolume)簡稱PV,是集群中的一塊存儲,可以由管理員事先供應(yīng)。
可以配置NFS、Ceph等常用存儲配置,相對于volumes,提供了更多的功能,如生命周期管理、大小的限制。

PV 卷的供應(yīng)有兩種方式:靜態(tài)供應(yīng)或動態(tài)供應(yīng)。

靜態(tài):

集群管理員預(yù)先創(chuàng)建許多PV,在PV的定義中能夠體現(xiàn)存儲資源的特性。

動態(tài):

集群管理員無須預(yù)先創(chuàng)建PV,而是通過StorageClass的設(shè)置對后端存儲資源進行描述,標記存儲的類型和特性。用戶通過創(chuàng)建PVC對存儲類型進行申請,系統(tǒng)將自動完成PV的創(chuàng)建及與PVC的綁定。如果PVC聲明的Class為空"",則說明PVC不使用動態(tài)模式。

PVC:

持久卷申領(lǐng)(PersistentVolumeClaim,PVC)表達的是用戶對存儲的請求。就像Pod消耗Node的資源一樣,PVC消耗PV資源。PVC可以申請存儲空間的大小(size)和訪問模式。

在這里插入圖片描述

由管理員創(chuàng)建PV連接到后端存儲,使用人員或管理員創(chuàng)建PVC使用PV資源。

2.PV資源回收

當(dāng)用戶不再使用其存儲卷時,他們可以從 API 中將 PVC 對象刪除,從而允許 該資源被回收再利用。PV 對象的回收策略告訴集群,當(dāng)其被 從申領(lǐng)中釋放時如何處理該數(shù)據(jù)卷。 目前,數(shù)據(jù)卷可以被 Retained(保留)、Recycled(回收)或 Deleted(刪除)。

Retain:保留資源

保留策略可以管理員手動回收資源,當(dāng)PVC被刪除后,PV仍然存在,對應(yīng)的數(shù)據(jù)卷被視為"已釋放(released)",管理員可以手動回收資源。

Delete:刪除數(shù)據(jù)

需要插件支持,如果支持,那么刪除PVC時也會自動刪除PV和相關(guān)的后端存儲資源;動態(tài)卷默認為delete。

Recycle:回收(棄用)

回收策略已被棄用,代替者為動態(tài)供應(yīng)。如果下層的卷插件支持,回收策略 Recycle 會在卷上執(zhí)行一些基本的 擦除(rm -rf /thevolume/*)操作,之后允許該卷用于新的 PVC 申領(lǐng)。

3.訪問模式

ReadWriteOnce

卷可以被一個節(jié)點以讀寫方式掛載。 ReadWriteOnce 訪問模式也允許運行在同一節(jié)點上的多個 Pod 訪問卷,縮寫為RWO。

ReadOnlyMany

卷可以被多個節(jié)點以只讀方式掛載,縮寫為ROX。

ReadWriteMany

卷可以被多個節(jié)點以讀寫方式掛載,縮寫為RWX。

ReadWriteOncePod

卷可以被單個 Pod 以讀寫方式掛載。 如果你想確保整個集群中只有一個 Pod 可以讀取或?qū)懭朐?PVC, 請使用ReadWriteOncePod 訪問模式。這只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本,縮寫為RWOP。

注意: 你的存儲支不支持這種訪問模式,具體情況查看:官方文檔

4.存儲分類

文件存儲(Filesystem):

一些數(shù)據(jù)可能需要多個節(jié)點使用,比如用戶頭像、用戶上傳文件等,實現(xiàn)方式:NFS、NAS、FTP等;NFS和FTP不推薦。

塊存儲(block):

一些數(shù)據(jù)只能被一個節(jié)點使用,或者是一塊裸盤整個掛載使用,比如數(shù)據(jù)庫、redis等,實現(xiàn)方式是Ceph、GlusterFS、公有云等。

對象存儲:

由程序代碼直接實現(xiàn)的一種存儲方式,云原生應(yīng)用無狀態(tài)化常用的實現(xiàn)方式;實現(xiàn)方式:一般是符合53標準的云存儲,比如AWS的53存儲、Minio等。

5.創(chuàng)建PV卷

列舉兩個實例,其他類型可參考官網(wǎng),因為我這資源有限。

5.1.實例:創(chuàng)建NAS/NFS類型的PV

生產(chǎn)不推薦NFS。可以使用NAS。

準備一臺NFS服務(wù)器

第一步:準備一臺NFS服務(wù)器,我這個裝的有點多,你也可以只安裝nfs服務(wù)器

[root@localhost ~]# yum -y install nfs* rpcbind

第二步:所有節(jié)點安裝nfs客戶端,不然不能識別,每一個需要掛載nfs的節(jié)點都需要裝

[root@k8s-master01 ~]# yum -y install nfs-utils

第三步:在服務(wù)端創(chuàng)建共享目錄

[root@k8s-master01 ~]# yum -y install nfs-utils

第四步:服務(wù)端配置共享目錄

[root@localhost ~]# cat /etc/exports
/data/k8s/ *(rw,sync,no_subtree_check,no_root_squash)
[root@localhost ~]# exportfs -r
[root@localhost ~]# systemctl restart nfs rpcbind

第五步:有另外一臺機器掛載共享目錄測試是否成功

[root@k8s-master01 hgfs]# mount -t nfs 192.168.10.6:/data/k8s /mnt
[root@k8s-master01 mnt]# mkdir hah
[root@k8s-master01 mnt]# ls
111.txt  hah
# 在nfs服務(wù)端查看
[root@localhost k8s]# ls
111.txt  hah

創(chuàng)建一個PV

第一步:編寫一個PV的yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity:
    storage: 2Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs-slow
  nfs:
    path: /data/k8s
    server: 192.168.10.6

對上面的yaml文件做一下說明:

通用的開頭就不說了

capacity:容量配置,這個pv使用多大容量,當(dāng)然需要后端存儲支持才行

volumeMode:卷的模式,目錄4有說明

accessModes:PV的訪問模式,目錄3有說明

accessClassName:PV的類,特定的PV只能綁定特定的PVC

persistentVolumeReclaimPolicy:回收策略,目錄2有說明

nfs:NFS服務(wù)配置,里面包含共享目錄和服務(wù)端IP

第二步:執(zhí)行yaml文件創(chuàng)建此PV;注意PV的成功跟后端存儲正不正常沒什么關(guān)系。

[root@k8s-master01 ~]# kubectl create -f pv-nfs.yaml 
persistentvolume/pv-nfs created
[root@k8s-master01 ~]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-nfs   2Gi        RWO            Recycle          Available           nfs-slow                54s

第三步:說一下PV的狀態(tài)(STATUS)

Available:可用,沒有被PVC綁定的空閑資源

Bound:已綁定,已經(jīng)被PVC綁定

Released:已釋放,PVC被刪除,資源未被重新使用

Failed:失敗,自動回收失敗

5.2.實例:創(chuàng)建一個hostPath類型的PV

當(dāng)你沒有一個可靠的存儲,但是數(shù)據(jù)又不能丟失,可以掛載到宿主機的路徑,即使重啟數(shù)據(jù)還在。

第一步:創(chuàng)建一個pv-host.yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: host-pv-volume
  labels:
    type: local
spec:
  storageClassName: hostpath
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"  # 宿主機路徑

第二步:執(zhí)行yaml文件創(chuàng)建PV

[root@k8s-master01 ~]# kubectl create -f pv-host.yaml 
persistentvolume/host-pv-volume created
您在 /var/spool/mail/root 中有新郵件
[root@k8s-master01 ~]# kubectl get pv
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
host-pv-volume   1Gi        RWO            Retain           Available           hostpath                9s
pv-nfs           2Gi        RWO            Recycle          Available           nfs-slow                30m

6.PVC

6.1.Pod與PVC與PV的關(guān)系

在這里插入圖片描述

由一張圖說一下PV與PVC的綁定,Pod又是怎么掛載PVC

首先創(chuàng)建一個PV,它的名字是pv-nfs,storageClassName名字是nfs-slow(這個名字不唯一,就是說其他PV也可以叫這個名字)

然后創(chuàng)建一個PVC,它的名字是test-pv-claim,storageClassName名字是nfs-slow(PVC綁定PV也是根據(jù)這個名字判斷,根據(jù)上一點說的特性也就是說一個PVC可以綁定多個storageClassName名字是nfs-slow的PV)注意PVC設(shè)置的資源大小要等于小于PV。

最后Pod使用的時候創(chuàng)建一個volumes,這個名字是test-pv-storage,這個volumes使用的PVC資源要寫PVC的name,也就是test-pv-claim;等Pod中的容器掛載資源的時候掛載的名字是volumes的name,也就是test-pv-storage。

6.2.創(chuàng)建一個PVC掛載到Pod

注意:pvc要和Pod在同一個命名空間,而pv不需要;因為都是在默認空間,就沒指定,需要注意。

第一步:編寫一個PVC的yaml文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pv-claim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 2Gi  # 小于等于pv
  storageClassName: nfs-slow

第二步:執(zhí)行yaml文件創(chuàng)建PVC;從下面這個狀態(tài)來看已經(jīng)綁定成功了,綁定了pv-nfs,類型為nfs-slow,都是前面指定的。

[root@k8s-master01 ~]# kubectl create -f pvc-nfs.yaml 
persistentvolumeclaim/test-pv-claim created
[root@k8s-master01 ~]# kubectl get pvc
NAME            STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-pv-claim   Bound    pv-nfs   2Gi        RWO            nfs-slow       20s

第三步:創(chuàng)建Pod掛載PVC

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: dp-nginx
  name: dp-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dp-nginx
  strategy: {}
  template:
    metadata:
      labels:
        app: dp-nginx
    spec:
      volumes:
      - name: test-pv-storage
        persistentVolumeClaim:
          claimName: test-pv-claim
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: test-pv-storage

第四步:創(chuàng)建Pod,進入Pod查看掛載情況

[root@k8s-master01 ~]# kubectl replace -f dp-nginx.yaml 
deployment.apps/dp-nginx replaced
[root@k8s-master01 ~]# kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
dp-nginx-fcd88d6f8-prxcd   1/1     Running   0          22s
[root@k8s-master01 ~]# kubectl exec -ti dp-nginx-fcd88d6f8-prxcd -- bash
root@dp-nginx-fcd88d6f8-prxcd:/# df -Th
Filesystem              Type     Size  Used Avail Use% Mounted on
overlay                 overlay   17G  5.2G   12G  31% /
tmpfs                   tmpfs     64M     0   64M   0% /dev
tmpfs                   tmpfs    2.0G     0  2.0G   0% /sys/fs/cgroup
shm                     tmpfs     64M     0   64M   0% /dev/shm
/dev/mapper/centos-root xfs       17G  5.2G   12G  31% /etc/hosts
192.168.10.6:/data/k8s  nfs4      17G  2.4G   15G  14% /usr/share/nginx/html
tmpfs                   tmpfs    3.8G   12K  3.8G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                   tmpfs    2.0G     0  2.0G   0% /proc/acpi
tmpfs                   tmpfs    2.0G     0  2.0G   0% /proc/scsi
tmpfs                   tmpfs    2.0G     0  2.0G   0% /sys/firmware
# 可以看到10.6的共享目錄已經(jīng)掛載到了/nginx/html下

第五步:測試,在nfs服務(wù)器共享目錄下創(chuàng)建資源,進入Pod容器內(nèi)查看是否存在

# nfs服務(wù)器中創(chuàng)建資源
[root@localhost k8s]# ls
111.txt  hah
# 在Pod的nginx容器中查看
root@dp-nginx-fcd88d6f8-prxcd:/# cd /usr/share/nginx/html/
root@dp-nginx-fcd88d6f8-prxcd:/usr/share/nginx/html# ls
111.txt  hah
# 內(nèi)容存在,說明創(chuàng)建成功

原文鏈接:https://yyang.blog.csdn.net/article/details/123348981

欄目分類
最近更新