Kubernetes - 卷



在 Kubernetes 中,卷可以被認為是一個目錄,Pod 中的容器可以訪問該目錄。Kubernetes 中有不同型別的卷,並且型別定義了卷是如何建立的以及其內容。

卷的概念在 Docker 中就已經存在,但唯一的問題是卷非常侷限於特定的 Pod。一旦 Pod 的生命週期結束,卷也會丟失。

另一方面,透過 Kubernetes 建立的卷不受任何容器的限制。它支援 Pod 內部署的任何或所有容器。Kubernetes 卷的一個關鍵優勢是,它支援不同型別的儲存,其中 Pod 可以同時使用多個儲存。

Kubernetes 卷的型別

以下是 Kubernetes 卷的一些常用型別:

  • emptyDir - 當 Pod 首次分配到節點時,會建立此型別的卷。只要 Pod 在該節點上執行,它就會保持活動狀態。卷最初為空,Pod 中的容器可以讀取和寫入 emptyDir 卷中的檔案。一旦 Pod 從節點中移除,emptyDir 中的資料就會被擦除。

  • hostPath - 此型別的卷將主機節點檔案系統中的檔案或目錄掛載到 Pod 中。

  • gcePersistentDisk - 此型別的卷將 Google Compute Engine (GCE) 永續性磁碟掛載到 Pod 中。當 Pod 從節點中移除時,gcePersistentDisk 中的資料保持不變。

  • awsElasticBlockStore - 此型別的卷將 Amazon Web Services (AWS) Elastic Block Store 掛載到 Pod 中。與 gcePersistentDisk 一樣,當 Pod 從節點中移除時,awsElasticBlockStore 中的資料保持不變。

  • nfs - nfs 卷允許將現有的 NFS(網路檔案系統)掛載到 Pod 中。當 Pod 從節點中移除時,nfs 卷中的資料不會被擦除。卷僅被解除安裝。

  • iscsi - iscsi 卷允許將現有的 iSCSI(IP 上的 SCSI)卷掛載到 Pod 中。

  • flocker - 它是一個開源的叢集容器資料卷管理器。它用於管理資料卷。flocker 卷允許將 Flocker 資料集掛載到 Pod 中。如果 Flocker 中不存在資料集,則需要先使用 Flocker API 建立它。

  • glusterfs - Glusterfs 是一個開源的網路檔案系統。glusterfs 卷允許將 glusterfs 卷掛載到 Pod 中。

  • rbd - RBD 代表 Rados 塊裝置。rbd 卷允許將 Rados 塊裝置卷掛載到 Pod 中。當 Pod 從節點中移除後,資料仍然保留。

  • cephfs - cephfs 卷允許將現有的 CephFS 卷掛載到 Pod 中。當 Pod 從節點中移除後,資料保持不變。

  • gitRepo - gitRepo 卷掛載一個空目錄,並將 git 儲存庫克隆到其中,供 Pod 使用。

  • secret - secret 卷用於將敏感資訊(例如密碼)傳遞給 Pod。

  • persistentVolumeClaim - persistentVolumeClaim 卷用於將 PersistentVolume 掛載到 Pod 中。PersistentVolume 是一種允許使用者“宣告”永續性儲存(例如 GCE 永續性磁碟或 iSCSI 卷)而不必瞭解特定雲環境的詳細資訊的方法。

  • downwardAPI - downwardAPI 卷用於使下行 API 資料可供應用程式使用。它掛載一個目錄並在純文字檔案中寫入請求的資料。

  • azureDiskVolume - AzureDiskVolume 用於將 Microsoft Azure 資料磁碟掛載到 Pod 中。

持久卷和持久卷宣告

持久卷 (PV) - 它是由管理員預配的一塊網路儲存。它是叢集中的一個資源,獨立於使用 PV 的任何單個 Pod。

持久卷宣告 (PVC) - Kubernetes 為其 Pod 請求的儲存稱為 PVC。使用者無需瞭解底層預配。宣告必須在建立 Pod 的同一個名稱空間中建立。

建立持久卷

kind: PersistentVolume ---------> 1
apiVersion: v1
metadata:
   name: pv0001 ------------------> 2
   labels:
      type: local
spec:
   capacity: -----------------------> 3
      storage: 10Gi ----------------------> 4
   accessModes:
      - ReadWriteOnce -------------------> 5
      hostPath:
         path: "/tmp/data01" --------------------------> 6

在上面的程式碼中,我們定義了:

  • kind: PersistentVolume → 我們將 kind 定義為 PersistentVolume,這告訴 Kubernetes 正在使用的 yaml 檔案用於建立持久卷。

  • name: pv0001 → 我們要建立的持久卷的名稱。

  • capacity: → 此規範將定義我們嘗試建立的 PV 的容量。

  • storage: 10Gi → 這告訴底層基礎架構我們正在嘗試在定義的路徑上宣告 10Gi 空間。

  • ReadWriteOnce → 這告訴我們正在建立的卷的訪問許可權。

  • path: "/tmp/data01" → 此定義告訴機器我們正在嘗試在底層基礎架構上的此路徑下建立卷。

建立 PV

$ kubectl create –f local-01.yaml
persistentvolume "pv0001" created

檢查 PV

$ kubectl get pv
NAME        CAPACITY      ACCESSMODES       STATUS       CLAIM      REASON     AGE
pv0001        10Gi            RWO         Available                            14s

描述 PV

$ kubectl describe pv pv0001

建立持久卷宣告

kind: PersistentVolumeClaim --------------> 1
apiVersion: v1
metadata:
   name: myclaim-1 --------------------> 2
spec:
   accessModes:
      - ReadWriteOnce ------------------------> 3
   resources:
      requests:
         storage: 3Gi ---------------------> 4

在上面的程式碼中,我們定義了:

  • kind: PersistentVolumeClaim → 它指示底層基礎架構我們正在嘗試宣告指定數量的空間。

  • name: myclaim-1 → 我們嘗試建立的宣告的名稱。

  • ReadWriteOnce → 這指定了我們嘗試建立的宣告的模式。

  • storage: 3Gi → 這將告訴 Kubernetes 我們嘗試宣告的空間量。

建立 PVC

$ kubectl create –f myclaim-1
persistentvolumeclaim "myclaim-1" created

獲取有關 PVC 的詳細資訊

$ kubectl get pvc
NAME        STATUS   VOLUME   CAPACITY   ACCESSMODES   AGE
myclaim-1   Bound    pv0001     10Gi         RWO       7s

描述 PVC

$ kubectl describe pv pv0001

將 PV 和 PVC 與 POD 一起使用

kind: Pod
apiVersion: v1
metadata:
   name: mypod
   labels:
      name: frontendhttp
spec:
   containers:
   - name: myfrontend
      image: nginx
      ports:
      - containerPort: 80
         name: "http-server"
      volumeMounts: ----------------------------> 1
      - mountPath: "/usr/share/tomcat/html"
         name: mypd
   volumes: -----------------------> 2
      - name: mypd
         persistentVolumeClaim: ------------------------->3
         claimName: myclaim-1

在上面的程式碼中,我們定義了:

  • volumeMounts: → 這是將在其中進行掛載的容器中的路徑。

  • Volume: → 此定義定義了我們將要宣告的卷定義。

  • persistentVolumeClaim: → 在此之下,我們定義了將在定義的 Pod 中使用的卷名稱。

廣告