將既有的永久磁碟做為 PersistentVolumes 使用


本頁面說明如何使用已填入資料的現有永久磁碟建立 PersistentVolume,以及如何在 Pod 中使用 PersistentVolume。

總覽

使用現有永久磁碟的常見情境有兩種。

本頁面的範例使用現有的 Compute Engine 永久磁碟

ext4 是預設的檔案系統類型,但只要節點映像檔支援,您也可以使用具有 xfs 檔案系統的現有永久磁碟。如要使用 xfs 磁碟,請在 PersistentVolume 資訊清單中將 spec.csi.fsType 變更為 xfs

Windows 不支援 ext4 檔案系統類型。您必須使用 Windows Server 節點集區的 NTFS 檔案系統。如要使用 NTFS 磁碟,請在 PersistentVolume 資訊清單中將 spec.csi.fsType 變更為 NTFS

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

使用繫結至 PersistentVolume 的 PersistentVolumeClaim

如要讓容器存取現有的永久磁碟,請完成下列步驟:

  1. 將現有的永久磁碟佈建為 PersistentVolume。
  2. 將 PersistentVolume 繫結至 PersistentVolumeClaim。
  3. 讓 Pod 中的容器存取 PersistentVolume。

建立 PersistentVolume 和 PersistentVolumeClaim

您可以透過幾種方式,將 PersistentVolumeClaim 繫結至特定 PersistentVolume。舉例來說,下列 YAML 資訊清單會建立新的 PersistentVolume 和 PersistentVolumeClaim,然後使用 PersistentVolume 上定義的 claimRef,將磁碟區繫結至要求。

如要將 PersistentVolume 繫結至 PersistentVolumeClaim,這兩項資源的storageClassName必須相符,capacityaccessModesvolumeMode 也必須相符。您可以省略 storageClassName,但必須指定 "",才能避免 Kubernetes 使用預設的 StorageClass。

storageClassName 不一定要參照現有的 StorageClass 物件。如果您只需要將聲明繫結至磁碟區,可以使用任何名稱。不過,如果您需要 StorageClass 設定的額外功能 (例如調整磁碟區大小),則 storageClassName 必須參照現有的 StorageClass 物件。

詳情請參閱 Kubernetes 說明文件中的 PersistentVolumes

  1. 儲存下列 YAML 資訊清單:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: PV_NAME
    spec:
      storageClassName: "STORAGE_CLASS_NAME"
      capacity:
        storage: DISK_SIZE
      accessModes:
        - ReadWriteOnce
      claimRef:
        name: PV_CLAIM_NAME
        namespace: default
      csi:
        driver: pd.csi.storage.gke.io
        volumeHandle: DISK_ID
        fsType: FS_TYPE
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      namespace: default
      name: PV_CLAIM_NAME
    spec:
      storageClassName: "STORAGE_CLASS_NAME"
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: DISK_SIZE
    

    更改下列內容:

    • PV_NAME:新 PersistentVolume 的名稱。
    • STORAGE_CLASS_NAME:新 StorageClass 的名稱。
    • DISK_SIZE:現有永久磁碟的大小。例如:500G
    • PV_CLAIM_NAME:新 PersistentVolumeClaim 的名稱。
    • DISK_ID:現有永久磁碟的 ID。格式為區域永久磁碟projects/{project_id}/zones/{zone_name}/disks/{disk_name},或地區永久磁碟projects/{project_id}/regions/{region_name}/disks/{disk_name}
    • FS_TYPE:檔案系統類型。您可以保留預設值 (ext4),或使用 xfs。 如果叢集使用 Windows Server 節點集區,您必須將此值變更為 NTFS
  2. 如要套用設定並建立 PersistentVolume 和 PersistentVolumeClaim 資源,請執行下列指令:

    kubectl apply -f FILE_PATH
    

    FILE_PATH 替換為 YAML 檔案的路徑。

在 Pod 中使用 PersistentVolume

建立並繫結 PersistentVolume 和 PersistentVolumeClaim 後,您可以在 volumeMounts 欄位中指定值,讓 Pod 的容器存取磁碟區。

下列 YAML 設定會建立新的 Pod 和執行 nginx 映像檔的容器,然後將 PersistentVolume 掛接至 Pod:

kind: Pod
apiVersion: v1
metadata:
  name: POD_NAME
spec:
  volumes:
    - name: VOLUME_NAME
      persistentVolumeClaim:
        claimName: PV_CLAIM_NAME
  containers:
    - name: CONTAINER_NAME
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: VOLUME_NAME

更改下列內容:

  • POD_NAME:新 Pod 的名稱。
  • VOLUME_NAME:磁碟區名稱。
  • PV_CLAIM_NAME:您在上一個步驟中建立的 PersistentVolumeClaim 名稱。
  • CONTAINER_NAME:新容器的名稱。

套用設定:

kubectl apply -f FILE_PATH

FILE_PATH 改為 YAML 檔案的路徑。

如要確認磁碟區已掛接,請執行下列指令:

kubectl describe pods POD_NAME

在輸出內容中,確認 PersistentVolumeClaim 已掛接:

...
Volumes:
  VOLUME_NAME:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  PV_CLAIM_NAME
    ReadOnly:   false
Events:
  Type    Reason                  Age   From                     Message
  ----    ------                  ----  ----                     -------
  Normal  Scheduled               29s   default-scheduler        Successfully assigned default/POD_NAME to gke-cluster-1-default-pool-d5cde866-o4g4
  Normal  SuccessfulAttachVolume  21s   attachdetach-controller  AttachVolume.Attach succeeded for volume "PV_NAME"
  Normal  Pulling                 19s   kubelet                  Pulling image "nginx"
  Normal  Pulled                  19s   kubelet                  Successfully pulled image "nginx"
  Normal  Created                 18s   kubelet                  Created container CONTAINER_NAME
  Normal  Started                 18s   kubelet                  Started container CONTAINER_NAME

在 StatefulSet 中使用現有磁碟

您可以使用 PersistentVolumes,在 StatefulSet 中使用既有的 Compute Engine 永久磁碟。StatefulSet 會自動為每個副本產生 PersistentVolumeClaim。您可以預測產生的 PersistentVolumeClaim 名稱,並使用 claimRef 將其繫結至 PersistentVolume。

在下列範例中,您會使用兩個現有的永久磁碟、建立 PersistentVolumes 來使用這些磁碟,然後在預設命名空間中,將磁碟區掛接至具有兩個副本的 StatefulSet。

  1. 決定新 StatefulSet 的名稱、PersistentVolumeClaim 範本的名稱,以及 StatefulSet 中的副本數量。
  2. 找出自動產生的 PersistentVolumeClaim 名稱。StatefulSet 會使用下列格式命名 PersistentVolumeClaim:

    PVC_TEMPLATE_NAME-STATEFULSET_NAME-REPLICA_INDEX
    

    更改下列內容:

    • PVC_TEMPLATE_NAME:新 PersistentVolumeClaim 範本的名稱。
    • STATEFULSET_NAME:新 StatefulSet 的名稱。
    • REPLICA_INDEX:StatefulSet 副本的索引。本範例使用的是 01
  3. 建立 PersistentVolume。您必須為 StatefulSet 中的每個副本建立 PersistentVolume。

    1. 儲存下列 YAML 資訊清單:

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-ss-demo-0
      spec:
        storageClassName: "STORAGE_CLASS_NAME"
        capacity:
          storage: DISK1_SIZE
        accessModes:
          - ReadWriteOnce
        claimRef:
          namespace: default
          name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-0
        csi:
          driver: pd.csi.storage.gke.io
          volumeHandle: DISK1_ID
          fsType: FS_TYPE
       ---
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: pv-ss-demo-1
      spec:
        storageClassName: "STORAGE_CLASS_NAME"
        capacity:
          storage: DISK2_SIZE
        accessModes:
          - ReadWriteOnce
        claimRef:
          namespace: default
          name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-1
        csi:
          driver: pd.csi.storage.gke.io
          volumeHandle: DISK2_ID
          fsType: FS_TYPE
      

      更改下列內容:

      • DISK1_SIZE and DISK2_SIZE:現有永久磁碟的大小。
      • DISK1_ID and DISK2_ID:現有永久磁碟的 ID。
      • PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 and PVC_TEMPLATE_NAME-STATEFULSET_NAME-1:自動產生的 PersistentVolumeClaim 名稱,格式如上一個步驟所定義。
      • STORAGE_CLASS_NAME:StorageClass 的名稱。
    2. 套用設定:

      kubectl apply -f FILE_PATH
      

      FILE_PATH 改為 YAML 檔案的路徑。

  4. 使用您在步驟 1 中選擇的值建立 StatefulSet。請確認您在 volumeClaimTemplates 中指定的儲存空間小於或等於 PersistentVolumes 的總容量。

    1. 儲存下列 YAML 資訊清單:

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: STATEFULSET_NAME
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        replicas: 2
        template:
          metadata:
            labels:
              app: nginx
          spec:
            terminationGracePeriodSeconds: 10
            containers:
            - name: nginx
              image: registry.k8s.io/nginx-slim:0.8
              ports:
              - containerPort: 80
                name: web
              volumeMounts:
              - name: PVC_TEMPLATE_NAME
                mountPath: /usr/share/nginx/html
        volumeClaimTemplates:
        - metadata:
            name: PVC_TEMPLATE_NAME
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "STORAGE_CLASS_NAME"
            resources:
              requests:
                storage: 100Gi
      

      更改下列內容:

      • STATEFULSET_NAME:新 StatefulSet 的名稱。
      • PVC_TEMPLATE_NAME:新 PersistentVolumeClaim 範本的名稱。
      • STORAGE_CLASS_NAME:StorageClass 的名稱。
    2. 套用設定:

      kubectl apply -f FILE_PATH
      

      FILE_PATH 改為 YAML 檔案的路徑。

後續步驟