詳解k8spv

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FNBVH的頭像FNBVH
上一篇 2025-01-20 14:10
下一篇 2025-01-20 14:10

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和算法 C語言貪吃蛇主要運用了以下數據結構和算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25

發表回復

登錄後才能評論