一、k8spv介紹
k8spv全稱為Kubernetes Persistent Volume,是Kubernetes(下文簡稱K8s)中用於訪問持久化存儲的一種API。在K8s中,容器的存儲是臨時性的,當容器退出時,所屬的存儲也會消失。針對於這種「一次性」的存儲,K8s提供了Persistent Volume的機制,可以將數據從容器中分離出來,並將其持久化到其他的存儲設備中。
Persistent Volume 可以看做是抽象出來的存儲插槽,它代表了一段實際物理存儲資源(比如磁盤卷或其他雲存儲),它提供了一種獨立的、統一的方式來管理多個k8s pod中使用到的數據卷,從而使得存儲管理變得更加的方便和高效。
二、k8spv的類型
在K8s中定義了多種不同類型的Persistent Volume,每種類型都有其特別的用途和實現方式。
1. HostPath類型
HostPath類型的Persistent Volume 直接使用節點上的文件系統來存儲數據。這種存儲方式適用於測試或獨立的應用程序,但不建議在生產環境中使用。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-hostpath
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /usr/share/elasticsearch/data
2. GCEPersistentDisk類型
GCEPersistentDisk類型表示通過Google Compute Engine(GCE)提供的持久化磁盤,它可以用來存儲K8s的數據卷,但只能適用於部署在GCE上的應用程序。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-gcepersistentdisk
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
gcePersistentDisk:
pdName: my-data-disk
fsType: ext4
3. NFS類型
NFS類型的Persistent Volume使用NFS協議實現共享存儲,它可以讓多個Pod之間共享同一組數據。NFS類型的Persistent Volume的PD需要先被正確指定。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /var/nfs/data
server: nfs.example.com
4. GlusterFS類型
GlusterFS類型的Persistent Volume使用GlusterFS作為卷的存儲後端,這是一個開源的網絡文件共享系統,它可以在多個節點之間共享數據。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-glusterfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
glusterfs:
endpoints: glusterfs-cluster
path: myvolume
readOnly: false
5. iSCSI類型
iSCSI類型的 Persistent Volume可以連接到iSCSI Target,它是一種用TCP/IP協議傳輸SCSI指令的網絡存儲標準。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-iscsi
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
iscsi:
targetPortal: 10.0.0.10:3260
iqn: iqn.2001-04.com.example:storage.k8s.io
lun: 0
fsType: ext4
三、k8spv的使用
k8spv的使用分為三個步驟:
1. 創建 Persistent Volume
Persistent Volume 可以通過yaml文件的方式創建,如下所示:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /mnt/nfs
server: 192.168.0.1
2. 創建 Persistent Volume Claim
根據應用的需求,可以定義一個 Persistent Volume Claim (PVC) 來請求一個匹配的 PV。PVC可以通過yaml文件的方式定義,如下所示:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
3. 在Pod中使用 Persistent Volume
在Pod的定義文件中,需要使用Volume和VolumeMount兩個參數來使用 Persistent Volume,其中Volume參數定義了存儲卷的名稱和類型,VolumeMount參數定義了容器訪問該存儲卷的路徑。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: mycontainer
image: nginx
volumeMounts:
- mountPath: /data
name: my-pv-storage
volumes:
- name: my-pv-storage
persistentVolumeClaim:
claimName: my-pvc
四、k8spv的擴展
k8spv並不僅僅是上述這些已經被定義好的類型,通過擴展 k8spv,我們可以更好地滿足我們的業務需求。
1. 自定義 Volume Plugin
如果你希望自己的存儲後端被 K8s 支持,則需要自定義一個 Volume Plugin。通過Volume Plugin,可以使K8s支持新的存儲卷類型。
2. StorageClass
StorageClass通過定義存儲類型的參數,提供一個標準化的方式來管理PV。一個 StorageClass定義了一組參數,這些參數主要包括存儲的類型、存儲的大小等。通過 StorageClass,可以根據具體需求動態的使用 PV,從而更加靈活的管理數據。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: my-storage-class
provisioner: my-provisioner.com
parameters:
type: ssd
3. Volume Snapshot
Volume Snapshot 可以幫助用戶創建存儲卷的快照,用戶可以基於此進行數據保護和恢復。通過Volume Snapshot,可以快速創建一個新的Persistent Volume,從而節省了很多比較耗時的工作。
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshot
metadata:
name: my-snapshot
spec:
snapshotClassName: my-snapshot-class
source:
kind: PersistentVolumeClaim
name: my-pvc
五、總結
K8spv為我們提供了很好的數據存儲管理方式,通過它我們可以更好地管理應用程序的狀態數據,並保證數據不丟失。此外,由於K8s PV和PVC的使用非常簡單,因此它也非常適合用於各種類型的企業級應用程序。
原創文章,作者:FNBVH,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/331567.html