PersistentVolume(簡稱PV)是由管理員設(shè)置的存儲(chǔ),它同樣是集群中的一類資源,PV是容量插件,如Volumes(卷),但其生命周期獨(dú)立使用PV的任何Pod,PV的創(chuàng)建可使用NFS、iSCSI、GFS、CEPH等。
PersistentVolumeClaim(簡稱PVC)是用戶對(duì)存儲(chǔ)的請(qǐng)求,類似于Pod,Pod消耗節(jié)點(diǎn)資源,PVC消耗PV資源,Pod可以請(qǐng)求特定級(jí)別的資源(CPU和內(nèi)存),PVC可以請(qǐng)求特定的大小和訪問模式。例如,可以以一次讀/寫或只讀多次的模式掛載。
雖然PVC允許用戶使用抽象存儲(chǔ)資源,但是用戶可能需要具有不同性質(zhì)的PV來解決不同的問題,比如使用SSD硬盤來提高性能。所以集群管理員需要能夠提供各種PV,而不僅是大小和訪問模式,并且無須讓用戶了解這些卷的實(shí)現(xiàn)方式,對(duì)于這些需求可以使用StorageClass資源實(shí)現(xiàn)。
目前PV的提供方式有兩種:靜態(tài)或動(dòng)態(tài)。
靜態(tài)PV由管理員提前創(chuàng)建,動(dòng)態(tài)PV無需提前創(chuàng)建,只需指定PVC的StorageClasse即可。
PV的回收策略
當(dāng)用戶使用完卷時(shí),可以從API中刪除PVC對(duì)象,從而允許回收資源。回收策略會(huì)告訴PV如何處理該卷,目前卷可以保留、回收或刪除。
? Retain:保留,該策略允許手動(dòng)回收資源,當(dāng)刪除PVC時(shí),PV仍然存在,volume被視為已釋放,管理員可以手動(dòng)回收卷。
? Recycle:回收,如果volume插件支持,Recycle策略會(huì)對(duì)卷執(zhí)行rm -rf清理該P(yáng)V,并使其可用于下一個(gè)新的PVC,但是本策略已棄用,建議使用動(dòng)態(tài)配置。
? Delete:刪除,如果volume插件支持,刪除PVC時(shí)會(huì)同時(shí)刪除PV,動(dòng)態(tài)卷默認(rèn)為Delete。
PV的訪問策略
ReadWriteOnce:可以被單節(jié)點(diǎn)以讀寫模式掛載,命令行中可以被縮寫為RWO。
ReadOnlyMany:可以被多個(gè)節(jié)點(diǎn)以只讀模式掛載,命令行中可以被縮寫為ROX。
ReadWriteMany:可以被多個(gè)節(jié)點(diǎn)以讀寫模式掛載,命令行中可以被縮寫為RWX。
NFS安裝配置
NFS服務(wù)器安裝服務(wù)端: yum install nfs* rpcbind -y
所有K8s節(jié)點(diǎn)安裝NFS客戶端:yum install nfs-utils -y
NFS服務(wù)端:mkdir /data/k8s -p
NFS服務(wù)器創(chuàng)建共享目錄:vim /etc/exports
/data/k8s/ *(rw,sync,no_subtree_check,no_root_squash)
exportfs -r
systemctl restart nfs rpcbind
掛載測試:mount -t nfs nfs-serverIP:/data/k8s /mnt/
一、創(chuàng)建PV
1)基于NFS創(chuàng)建
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity: # 容量配置
storage: 5Gi
volumeMode: Filesystem # 卷的模式,目前支持Filesystem(文件系統(tǒng)) 和 Block(塊),其中Block類型需要后端存儲(chǔ)支持,默認(rèn)為文件系統(tǒng)
accessModes: # PV的訪問模式
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle # 回收策略
storageClassName: nfs-slow # PV的類,一個(gè)特定類型的PV只能綁定到特定類別的PVC
nfs: # NFS服務(wù)配置
path: /data/k8s
server: 172.17.0.2
2)基于hostPath創(chuàng)建
kind: PersistentVolume
apiVersion: v1
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: hostpath
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
3)基于CephRBD創(chuàng)建
apiVersion: v1
kind: PersistentVolume
metadata:
name: ceph-rbd-pv
spec:
capacity:
storage: 1Gi
storageClassName: ceph-fast
accessModes:
- ReadWriteOnce
rbd:
monitors: # Ceph的monitor節(jié)點(diǎn)的IP
- 192.168.1.123:6789
- 192.168.1.124:6789
- 192.168.1.125:6789
pool: rbd # 所用Ceph Pool的名稱,可以使用ceph osd pool ls查看
image: ceph-rbd-pv-test # Ceph塊設(shè)備中的磁盤映像文件,可以使用rbd create POOL_NAME/IMAGE_NAME --size 1024創(chuàng)建,使用rbd list POOL_NAME查看
user: admin # Rados的用戶名,默認(rèn)是admin
secretRef: # 用于驗(yàn)證Ceph身份的密鑰
name: ceph-secret
fsType: ext4 # 文件類型,可以是ext4、XFS等
readOnly: false # 是否是只讀掛載
二、創(chuàng)建PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: task-pvc-claim
spec:
storageClassName: nfs-slow
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
三、pod使用PVC
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: default
spec:
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pvc-claim
containers:
- env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: C.UTF-8
image: nginx
imagePullPolicy: IfNotPresent
name: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage