官方檔案地址: https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
1. 什么是PV,PVC?
1.1 什么是PV
PresistentVolume(PV)是指集群管理員配置提供的某存盤系統上的一段存盤空間,它是對底層共享存盤的抽象,將共享存盤作為一種可由用戶申請使用的資源,實作"存盤消費"機制,通過存盤插件,PV支持使用多種網路存盤等多種后端存盤系統,例如,NFS、CephFS、RBD,PV是集群級別的資源,不屬于任何名稱空間,用戶對PV資源的使用需要通過PersistentVolumeClaim(PVC)提供的使用申請來完成系結,PVC是PV資源的消費者,它向PV申請特定大小的空間及訪問模式(rw或ro)從而創建出PVC存盤卷,然后再由Pod資源通過PersistentVolumeClaim存盤卷關聯使用,
1.2 什么是PVC?
PersistentVolumeClaim,PVC是存盤卷型別的資源,它通過申請占用某個PersistentVolume而創建,它與PV是一對一的關系,用戶無須關心其底層實作細節,申請時,用戶只需要指定目標空間的大小,訪問模式,PV標簽選擇器和StorageClass等相關資訊即可,
2. PV資源實踐;
2.1 PV配置欄位詳解
PresistentVolume Spec支持如下幾個通用欄位,用于定義PV的容量,訪問模式和回收策,
1.Capacity: PV的容量
2.volumeMode: 卷型別,用于指定此卷可被用作檔案系統還是裸格式的塊設備,默認為Filesystem,
3.accessMode: PV的訪問模式參考官方
- 1.ReadWriteOnce: 僅可被單個節點讀寫掛載;命令列中簡寫RWO,
- 2.ReadOnlyMany: 僅可被多個節點同時只讀掛在;命令列簡寫ROX,
- 3.ReadyWriteMany: 可被多個節點同時讀寫掛載;命令列中簡寫RWX,
4.persistentVolumeReclaimPolicy: PV空間的處理機制,可用型別為Retain(默認)、Recycle或Delete,
- 1.Retain: 保持不動,由管理員手動回收,
- 2.Recycle: 空間回收,即洗掉存盤卷下的所有檔案(包括子目錄和隱藏檔案rm -rf /thevolume/*),目前僅NFS和hostpath支持此功能,
- 3.Delete: 洗掉存盤卷,諸如 AWS EBS、GCE PD、Azure Disk 或 OpenStack Cinder 卷這類關聯存盤資產也被洗掉,
5.storageClassName: 當前PV所屬的StorageClass的名稱,默認為空,即不屬于任何StorageClass,
6.mountOptions: 掛載選項組成的串列,如ro,soft和hard等,
2.2 HostPath PV示例
[root@kn-server-master01-13 pv]# cat hostpath-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-volume-001
spec:
storageClassName: "host-storage" 資源型別的標識
persistentVolumeReclaimPolicy: "Retain" 回收策略默認為Retain
capacity: 定義空間
storage: 1Gi 定義空間大小
accessModes: 訪問模式
- ReadWriteOnce 訪問模式為僅被單個節點讀寫掛載,單路讀寫
hostPath: 臨時存盤在哪個地方
path: "/mnt/data"
[root@kn-server-master01-13 pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-volume-001 1Gi RWO Retain Available host-storage 4m36s
2.2 NFS PV示例
[root@kn-server-master01-13 pv]# cat nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
labels: 標簽
release: nfs-redis
spec:
storageClassName: "nfs-storage" 資源型別表示
persistentVolumeReclaimPolicy: "Recycle" 回收策略為Recycle相當rm -rf /
capacity:
storage: 0.5Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.0.0.15
path: /data/redis
[root@kn-server-master01-13 pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 512Mi RWX Recycle Available nfs-storage 62m
pv-volume-001 1Gi RWO Retain Bound default/001-pvc host-storage 160m
3. PVC資源實踐;
3.1 PVC配置清單詳解,
PersistentVolumeClaim,PVC是存盤卷型別的資源,它通過申請占用某個PersistentVolume而創建,它與PV是一對一的關系,用戶無須關心其底層實作細節, 申請時,用戶只需要指定目標空間的大小,訪問模式,PV標簽選擇器和StorageClass等相關資訊即可,
PVC的Spec欄位可嵌套欄位如下,
- accessMode: 當前PVC的訪問模式,其可用模式與PV相同,
- resource當前PVC存盤卷需要占用的資源的最大和最小值,
- selector系結時對PV應用的標簽選擇器,matchlabels或者匹配運算式matchEx-pressions用于挑選要系結的PV,如果同時指定來兩種挑選機制,則必須同時滿足兩種選擇機制的PV才能被選出,
- storageClassName: 所依賴的存盤卷的名稱,
- volumeName: 用于直接制定要系結的PV的卷名,
3.2 hostPath-PVC示例
[root@kn-server-master01-13 pv]# cat hostpath-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: 001-pvc
spec:
storageClassName: "host-storage" 和PV的storageclassname須一致,否則無法識別,
accessModes:
- ReadWriteOnce
resources: pvc的資源限定僅指其空間大小,
requests:
storage: 0.9Gi 大小為0.9Gi;
[root@kn-server-master01-13 pv]# kubectl apply -f hostpath-pvc.yaml
Available: 可用狀態的自由資源,尚未被系結PVC,
Bound: 已經系結至某個PVC,
Released: 系結的PVC已經被洗掉,但資源尚被集群回收,
Failed: 因自動回收資源失敗而處于的故障狀態,
[root@kn-server-master01-13 pv]# kubectl get pv pv-volume-001
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-volume-001 1Gi RWO Retain Bound default/001-pvc host-storage 33m
[root@kn-server-master01-13 pv]# kubectl describe pv pv-volume-001
Name: pv-volume-001
Labels: <none>
Annotations: pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pv-protection]
StorageClass: host-storage
Status: Bound
Claim: default/001-pvc
Reclaim Policy: Retain
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 1Gi
Node Affinity: <none>
Message:
Source:
Type: HostPath (bare host directory volume)
Path: /mnt/data
HostPathType:
Events: <none>
[root@kn-server-master01-13 pv]# kubectl describe pvc 001-pvc
Name: 001-pvc
Namespace: default
StorageClass: host-storage
Status: Bound 已系結
Volume: pv-volume-001
Labels: <none>
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 1Gi
Access Modes: RWO
VolumeMode: Filesystem
Used By: <none>
Events: <none>
3.3 NFS-PV-PVC實踐之準備NFS共享存盤,
NFS即是網路檔案系統,它是一種分布式檔案系統協議,kubernetes中的NFS存盤卷用于將某些事先存在的NFS服務器匯出(export)的存盤空間掛載到Pod中以供容器使用,與臨時存盤不同的是,NFS存盤卷在Pod物件終止后僅僅是被卸載而非洗掉,NFS是檔案系統級共享服務,它支持同時存在多路掛載,定義NFS存盤卷時,常用如下欄位,
server
path
readOnly
生產環境建議使用Ceph、azureDisk等公有云存盤,
[root@kn-server-node02-15 ~]# yum install nfs-utils -y
[root@kn-server-node02-15 ~]# cat /etc/exports
/nfs/data5/ 10.0.0.0/24(rw,no_root_squash)
/data/redis 10.0.0.0/24
10.0.0.0/24 pod訪問nfs服務會將源IP修改為節點IP,允許所有節點訪問NFS服務
(ro,no_root_squash)訪問NFS-SERVER共享目錄的用戶如果是root,它對共享目錄有root權限
準備資料共享目錄
[root@kn-server-node02-15 ~]# mkdir /data/redis -p
[root@kn-server-node02-15 ~]# systemctl enable nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
服務端配置
各個作業節點安裝nfs-utils
[root@kn-server-master01-13 pv]# showmount -e 10.0.0.15
Export list for 10.0.0.15:
/data/redis 10.0.0.0/24
master節點和node節點都需要安裝
[root@kn-server-node01-14 ~]# showmount -e 10.0.0.15
Export list for 10.0.0.15:
/data/redis 10.0.0.0/24
3.4 準備NFS-PVC
[root@kn-server-master01-13 pv]# cat nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
labels: 首先標簽須匹配,不然無法匹配,也可以稱為強行系結,
release: nfs-redis
spec:
storageClassName: "nfs-storage" 須同屬一個
accessModes:
- ReadWriteMany
resources:
requests:
storage: 0.5Gi 指定大小,
[root@kn-server-master01-13 pv]# kubectl apply -f nfs-pvc.yaml
persistentvolumeclaim/nfs-pvc created
顯示已為系結狀態,
[root@kn-server-master01-13 pv]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/nfs-pv 512Mi RWX Recycle Bound default/nfs-pvc nfs-storage 78m
persistentvolume/pv-volume-001 1Gi RWO Retain Bound default/001-pvc host-storage 175m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/001-pvc Bound pv-volume-001 1Gi RWO host-storage 143m
persistentvolumeclaim/nfs-pvc Bound nfs-pv 512Mi RWX nfs-storage 6s
通過describe來查看
[root@kn-server-master01-13 pv]# kubectl describe pv nfs-pv
Name: nfs-pv
Labels: release=nfs-redis 所屬標簽
Annotations: pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pv-protection]
StorageClass: nfs-storage storageclass名稱
Status: Bound 系結狀態
Claim: default/nfs-pvc 名稱空間
Reclaim Policy: Recycle 回收策略
Access Modes: RWX 訪問模式
VolumeMode: Filesystem
Capacity: 512Mi 大小
Node Affinity: <none>
Message:
Source:
Type: NFS (an NFS mount that lasts the lifetime of a pod)
Server: 10.0.0.15 來自那個nfs服務器
Path: /data/redis 共享的資料目錄
ReadOnly: false
Events: <none>
3.4.1準備Pod并使用PVC
[root@kn-server-master01-13 pv]# cat pod-redis.yaml
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-data
mountPath: /data
volumes:
- name: redis-data
persistentVolumeClaim:
claimName: nfs-pvc
[root@kn-server-master01-13 pv]# kubectl describe pods redis
Containers:
redis:
Container ID: docker://d82061a1a86f56432e9956fc46bc810e577a0d89b91894e266e883bef68f5d9d
Image: redis
Image ID: docker-pullable://redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Port: <none>
Host Port: <none>
State: Running
Started: Sun, 27 Nov 2022 21:57:34 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/data from redis-data (rw) 已經掛載
[root@kn-server-master01-13 pv]# kubectl describe pvc nfs-pvc
Name: nfs-pvc
Namespace: default
StorageClass: nfs-storage
Status: Bound
Volume: nfs-pv
Labels: release=nfs-redis
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 512Mi
Access Modes: RWX
VolumeMode: Filesystem
Used By: redis 這里可以看到是redis這個Pod正在使用這個PVC
Events: <none>
3.4.2 測驗資料持久性,
[root@kn-server-master01-13 pv]# redis-cli -h 192.168.1.86
192.168.1.86:6379> set key haitang
OK
192.168.1.86:6379> get key
"haitang"
192.168.1.86:6379> bgsave
Background saving started
192.168.1.86:6379> exit
可以看到資料是寫到nfs-server了
[root@kn-server-node02-15 redis]# ll
總用量 4
-rw-r--r-- 1 polkitd input 110 11月 27 22:14 dump.rdb
洗掉Pod后,資料是不會丟失的,
[root@kn-server-master01-13 pv]# kubectl delete pods redis
pod "redis" deleted
資料是還在的,
[root@kn-server-node02-15 redis]# ll
總用量 4
-rw-r--r-- 1 polkitd input 110 11月 27 22:20 dump.rdb
我們一直奔跑在進步的旅途
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/538562.html
標籤:其他
