運用 GKE 適用的 Filestore 多共用區來最佳化儲存空間


本指南說明如何使用 GKE Filestore CSI 驅動程式,透過 Filestore 多重共用功能搭配 Google Kubernetes Engine。

事前準備

  1. 開始操作前,請先完成使用 Filestore 服務所需的設定步驟

  2. 啟用 GKE Filestore CSI 驅動程式,版本為 1.23 以上:

    • 1.23 至 1.26 版的驅動程式,每個執行個體最多支援 10 個共用項目。

    • 1.27 以上版本的驅動程式,每個執行個體最多可支援 80 個共用項目。

    如要瞭解最新的 GKE Filestore CSI 驅動程式需求,請參閱「透過 Filestore CSI 驅動程式存取 Filestore 執行個體」。

搭配多個應用程式使用 Filestore 多共用區

本節說明如何部署兩個應用程式,分別是 DeploymentStatefulset,兩者都使用 Filestore 多重共用 StorageClass。您也會看到 GKE 如何將容器封裝 (有效率地將應用程式封裝至 GKE 節點的程序) 至相同基礎 Filestore 企業版執行個體中的所有磁碟區。

  1. 使用 GKE 提供的 StorageClass (enterprise-multishare-rwx),建立最多支援 10 個共用的執行個體。

    • 如要建立最多支援 80 個共用的執行個體,請建立自訂 StorageClass。在本指南中,您將使用每個執行個體限制為十個共用的 StorageClass。

    啟用 GKE Filestore CSI 驅動程式後,使用者可以透過下列設定存取 GKE 提供的多共用 StorageClass enterprise-multishare-rwx。參考這個 StorageClass 時,GKE Filestore CSI 驅動程式會使用動態磁碟區佈建,在 GKE 工作負載需要時,自動為新的永久磁碟區要求 (PVC) 建立永久磁碟區 (PV):

    kubectl describe sc enterprise-multishare-rwx
    Name:                  enterprise-multishare-rwx
    IsDefaultClass:        No
    Annotations:           components.gke.io/component-name=filestorecsi,components.gke.io/component-version=0.7.2,components.gke.io/layer=addon
    Provisioner:           filestore.csi.storage.gke.io
    Parameters:            instance-storageclass-label=enterprise-multishare-rwx,multishare=true,tier=enterprise
    AllowVolumeExpansion:  True
    MountOptions:          <none>
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                <none>
    

建立自訂 StorageClass

如要使用每個 Filestore 執行個體最多 80 個共用的最新容量限制,請根據下列範本建立自訂 StorageClass:

  apiVersion: storage.k8s.io/v1
  kind: StorageClass
  metadata:
    name: csi-filestore-multishare-128
  provisioner: filestore.csi.storage.gke.io
  parameters:
    tier: enterprise
    multishare: "true"
    max-volume-size: "128Gi"
    network: default
  allowVolumeExpansion: true

重新命名 StorageClass 時,請注意下列規定:

  • StorageClass 名稱必須是有效的 DNS 子網域名稱

  • 多重共用 StorageClass 名稱也會做為執行個體標籤,且應遵循標籤命名規範

  • 如果應用程式需要立即佈建磁碟區,請加入 Immediate 磁碟區繫結模式:

    volumeBindingMode: Immediate

    舉例來說,如果您不希望磁碟區佈建作業取決於 GKE 叢集中的 Pod 建立作業,請使用這項規格。

  • 從驅動程式 1.27 版開始,如要為每個例項指派超過 10 個共用項目,請加入 max-volume-size 參數,並從第一欄中指派一個可接受的值:

    磁碟區大小上限 (共用大小) 每個執行個體的分享數上限
    128 GiB 80
    256 GiB 40
    512 GiB 20
    1024 GiB 10

    舉例來說,新增鍵值組 max-volume-size: "128Gi" 可確保 StorageClass 將最多 80 個共用區 (每個共用區的大小介於 10 GiB 到 128 GiB 之間),對應至單一 10 TiB 的企業級執行個體。

    • 這項功能可回溯相容於 GKE Filestore CSI 驅動程式 1.23 至 1.26 版建立的 Filestore 執行個體。

    • 現有執行個體可建立新的 PVC 或共用磁碟,但共用磁碟的最小大小必須為 10 GiB。

    • GKE Filestore CSI 驅動程式 1.27 以上版本會辨識舊版企業執行個體,並指派 1024 GiB (1 TiB) 的預設分享大小上限。因此,舊版執行個體每個執行個體的分享次數上限為 10 次。

    詳情請參閱「GKE 適用的 Filestore 多共用區」。

  1. 使用單一 PVC 建立具有多個 Pod 副本的 Deployment。

    建立類似下列內容的 YAML 設定檔:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: test-pvc-fs
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: enterprise-multishare-rwx
      resources:
        requests:
          storage: 100Gi
    
    EOF
    
  2. 檢查 Pod 副本。

    a. 在指令列執行下列指令,檢查 PVC 狀態:

    kubectl get pvc
    

    您應該會看到類似以下的回應:

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs   Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx  35m
    

    b. 在指令列執行下列指令,檢查 Pod 狀態:

    kubectl get pod
    

    您應該會看到類似以下的回應:

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-csdbd   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-rgx82   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-zjl27   1/1     Running   0          35m
    
  3. 調度副本資源。

    a. 在指令列執行下列指令,編輯 Deployment:

    kubectl edit deployment web-server-multishare
    

    b. 系統會在指令列中開啟檔案。找出 spec.replicas 欄位,並將值更新為 10

    c. 在指令列執行下列指令,查看套用的變更:

    kubectl get pod
    

    您應該會看到類似以下的回應:

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-5ctkf   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-8dwmw   1/1     Running   0          2s
    web-server-multishare-76c9ffb4b5-csdbd   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-lndcq   1/1     Running   0          2s
    web-server-multishare-76c9ffb4b5-rgx82   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-vtd6p   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-xm49s   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-zjl27   1/1     Running   0          36m
    

    請注意,有 10 個 Pod 正在執行。

    d. 在指令列執行下列指令:

    kubectl get deployment
    

    您應該會看到類似以下的回應:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    web-server-multishare   10/10   10           10          36m
    

    e. 在指令列執行下列指令,檢查 PVC 的繫結狀態:

    kubectl get pvc
    

    您應該會看到類似以下的回應:

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs   Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx  37m
    

    f. 在指令列執行下列指令,編輯 Deployment:

    kubectl edit deployment web-server-multishare
    

    g. 系統會在指令列中開啟檔案。找出 spec.replicas 欄位,並將值更新為 2

    h. 在指令列執行下列指令,查看套用的變更:

    kubectl get pod
    

    您應該會看到類似以下的回應:

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          38m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          38m
    
  4. 部署 StatefulSet。

    部署第二個應用程式,與底層 Filestore 執行個體共用。

    如要這麼做,請佈建 200 GiB 的空間,並驗證該空間是否與第一個應用程式使用相同的基礎 Filestore 執行個體。

    接著,您會使用總共 900 GiB (9 個副本,每個副本使用 100 GiB) 將應用程式擴展至九個副本,並透過共用執行個體,確認 GKE 使用相同的 Filestore 執行個體。

    建立類似下列內容的 YAML 設定檔:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "nginx"
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.k8s.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: test-pvc-multishare
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: test-pvc-multishare
        spec:
          accessModes: [ "ReadWriteMany" ]
          storageClassName: enterprise-multishare-rwx
          resources:
            requests:
              storage: 100Gi
    
    EOF
    
    
  5. 檢查 Statefulset 副本和磁碟區。

    在指令列執行下列指令:

    kubectl get pod
    

    您應該會看到類似以下的回應:

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-0                                    1/1     Running   0          4m48s
    web-1                                    1/1     Running   0          3m32s
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          57m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          57m
    

    請注意,前兩個 Pod 與 StatefulSet 相關聯。 最後兩個 Pod 與 Deployment 相關聯。

    在指令列執行下列指令:

    kubectl get statefulset
    

    您應該會看到類似以下的回應:

    NAME   READY   AGE
    web    2/2     2m8s
    

    在指令列執行下列指令:

    kubectl get pvc
    

    您應該會看到類似以下的回應:

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs                 Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx   54m
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   100Gi      RWX            enterprise-multishare-rwx   114s
    test-pvc-multishare-web-1   Bound    pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe   100Gi      RWX            enterprise-multishare-rwx   38s
    

    PVC test-pvc-fs 與 Deployment web-server-multishare 相關聯。

    PVC test-pvc-multishare-web-0test-pvc-multishare-web-1 與 Statefulset 相關聯。

  6. 調度 StatefulSet 副本。

    將備用資源數量增加到九個。數量增加時,系統會建立對應的 PVC。

    a. 在指令列執行下列指令:

    kubectl  edit statefulset web
    

    b. 系統會在指令列中開啟檔案。找出 spec.replicas 欄位,並將值更新為 9

    c. 在指令列執行下列指令,查看套用的變更:

    kubectl get statefulset
    

    您應該會看到類似以下的回應:

    NAME   READY   AGE
    web    9/9     13m
    

    d. 在指令列執行下列指令:

    kubectl get deployment
    

    您應該會看到類似以下的回應:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    web-server-multishare   2/2     2            2           65m
    

    e. 在指令列執行下列指令:

    kubectl get pvc
    

    您應該會看到類似以下的回應:

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs                 Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx   65m
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   100Gi      RWX            enterprise-multishare-rwx   13m
    test-pvc-multishare-web-1   Bound    pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe   100Gi      RWX            enterprise-multishare-rwx   12m
    test-pvc-multishare-web-2   Bound    pvc-3fcbd132-939f-4364-807a-7c8ac6a3e64e   100Gi      RWX            enterprise-multishare-rwx   5m12s
    test-pvc-multishare-web-3   Bound    pvc-5894afa5-2502-4ee7-9d5c-b7378cb85479   100Gi      RWX            enterprise-multishare-rwx   4m57s
    test-pvc-multishare-web-4   Bound    pvc-ebbe452b-bc8f-4624-a830-a2094cce0d67   100Gi      RWX            enterprise-multishare-rwx   4m36s
    test-pvc-multishare-web-5   Bound    pvc-5a73a698-d174-44cb-a3a1-e767966c3417   100Gi      RWX            enterprise-multishare-rwx   4m20s
    test-pvc-multishare-web-6   Bound    pvc-102da6a9-2ca6-4f9e-9896-8fe14709db7a   100Gi      RWX            enterprise-multishare-rwx   3m55s
    test-pvc-multishare-web-7   Bound    pvc-160e81cd-c5bf-4ae6-966e-518e8249e02d   100Gi      RWX            enterprise-multishare-rwx   3m38s
    test-pvc-multishare-web-8   Bound    pvc-9b52d773-2e9a-40de-881c-dc06945ba3d7   100Gi      RWX            enterprise-multishare-rwx   118s
    
  7. 確認 Filestore 執行個體狀態。

    現在您有一個 Deployment,其中包含兩個 Pod 副本;還有一個 StatefulSet,其中包含九個 Pod 副本,以及總共 10 個 PVC,每個大小為 100 GiB。所有磁碟區都會封裝到單一 Filestore 多重共用執行個體。

    a. 在指令列執行下列 instances list 指令:

    gcloud beta filestore instances list --project=YOUR_PROJECT_ID --region=REGION
    

    其中:

    • YOUR_PROJECT_ID 是所用專案的名稱。例如:my-project

    • REGION 是所用區域的名稱。例如:us-central1

    您應該會看到類似以下的回應:

    INSTANCE_NAME                            LOCATION     TIER        CAPACITY_GB  FILE_SHARE_NAME  IP_ADDRESS   STATE  CREATE_TIME
    fs-a767cef8-738e-4c8e-b70b-09cbb872d016  us-central1  ENTERPRISE  1024         N/A              10.192.53.2  READY  2022-06-21T21:15:30
    

    b. 在指令列執行下列 instances describe 指令:

    gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION
    capacityGb: '1024'
    capacityStepSizeGb: '256'
    createTime: '2022-06-21T21:15:30.464237089Z'
    labels:
      storage_gke_io_created-by: filestore_csi_storage_gke_io
      storage_gke_io_storage-class-id: enterprise-multishare-rwx
    maxCapacityGb: '10240'
    maxShareCount: '10'
    multiShareEnabled: true
    name: projects/YOUR_PROJECT_ID/locations/REGION/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016
    networks:
    - connectMode: DIRECT_PEERING
      ipAddresses:
      - 10.192.53.2
      modes:
      - MODE_IPV4
      network: csi-filestore-test-network
      reservedIpRange: 10.192.53.0/26
    state: READY
    tier: ENTERPRISE
    
    

    其中:

    • YOUR_PROJECT_ID 是所用專案的名稱。例如:my-project

    • REGION 是所用區域的名稱。例如:us-central1

展開 PVC 並驗證 Filestore 執行個體

本節說明如何擴充現有 PVC,以及驗證 Filestore 執行個體大小。

  1. 展開 PVC。

    PVC (由 Filestore 多重共用執行個體中的共用區支援) 可以成長至 max-volume-size 參數中指定的大小上限。如要驗證這一點,請在 Pod 使用與 StatefulSet 相關聯的磁碟區時,展開其中一個磁碟區。

    在指令列執行下列指令,檢查副本 0 目前的 PVC 大小:

    kubectl get pvc test-pvc-multishare-web-0 -o json
    {
        "apiVersion": "v1",
        "kind": "PersistentVolumeClaim",
        "metadata": {
            "annotations": {
                "pv.kubernetes.io/bind-completed": "yes",
                "pv.kubernetes.io/bound-by-controller": "yes",
                "volume.beta.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io",
                "volume.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io"
            },
            "creationTimestamp": "2022-06-21T22:07:42Z",
            "finalizers": [
                "kubernetes.io/pvc-protection"
            ],
            "labels": {
                "app": "nginx"
            },
            "name": "test-pvc-multishare-web-0",
            "namespace": "default",
            "resourceVersion": "48395",
            "uid": "7aa21b5a-5343-4547-b7d7-414c16af15a7"
        },
        "spec": {
            "accessModes": [
                "ReadWriteMany"
            ],
            "resources": {
                "requests": {
                    "storage": "100Gi"
                }
            },
            "storageClassName": "enterprise-multishare-rwx",
            "volumeMode": "Filesystem",
            "volumeName": "pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7"
        },
        "status": {
            "accessModes": [
                "ReadWriteMany"
            ],
            "capacity": {
                "storage": "100Gi"
            },
            "phase": "Bound"
        }
    }
    
    
  2. 在指令列執行下列指令,將大小增加至 500 GiB:

    kubectl edit pvc test-pvc-multishare-web-0
    
  3. 系統會在指令列中開啟檔案。找出 spec.resources.requests.storage 欄位,並將值更新為 500Gi

  4. 在指令列執行下列指令,查看套用的變更:

    kubectl get pvc test-pvc-multishare-web-0
    

    您應該會看到類似以下的回應:

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   500Gi      RWX            enterprise-multishare-rwx   28m
    

    Filestore CSI 驅動程式接受要求,先擴充基礎 Filestore 執行個體,然後擴充支援 PVC 的共用區。

    具體來說,Filestore CSI 驅動程式會自動將執行個體擴充至 1536 Gi,以容納 500 Gi 的新共用大小。

  5. 在指令列執行下列 instances describe 指令,驗證 Filestore 執行個體的容量:

    gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION
    capacityGb: '1536'
    capacityStepSizeGb: '256'
    createTime: '2022-06-21T21:15:30.464237089Z'
    labels:
      storage_gke_io_created-by: filestore_csi_storage_gke_io
      storage_gke_io_storage-class-id: enterprise-multishare-rwx
    maxCapacityGb: '10240'
    maxShareCount: '10'
    multiShareEnabled: true
    name: projects/YOUR_PROJECT_ID/locations/us-central1/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016
    networks:
    - connectMode: DIRECT_PEERING
      ipAddresses:
      - 10.192.53.2
      modes:
      - MODE_IPV4
      network: csi-filestore-test-network
      reservedIpRange: 10.192.53.0/26
    state: READY
    tier: ENTERPRISE
    

    其中:

    • YOUR_PROJECT_ID 是所用專案的名稱。例如:my-project

    • REGION 是所用區域的名稱。例如:us-central1

共用虛擬私有雲的動態佈建

GKE 的 Filestore CSI 驅動程式支援在共用 VPC 下的服務專案中動態佈建磁碟區。以下章節說明如何使用 Filestore CSI 驅動程式,在共用虛擬私有雲網路下的服務專案中,動態佈建 Filestore 多重共用執行個體上的磁碟區。

  1. 完成共用虛擬私有雲網路和私人服務存取權的設定步驟

  2. 建立 StorageClass,動態佈建由共用 VPC 上的 Filestore 多重共用執行個體支援的磁碟區。

    執行下列指令來部署 StorageClass 資源:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-multishare-sharedvpc
    provisioner: filestore.csi.storage.gke.io
    parameters:
      network: "projects/HOST_PROJECT_ID/global/networks/SHARED_VPC_NAME"
      connect-mode: PRIVATE_SERVICE_ACCESS
      tier: enterprise
      multishare: "true"
    allowVolumeExpansion: true
    
    EOF
    

    其中:

    • HOST_PROJECT_ID 是共用虛擬私有雲網路主專案的 ID 或名稱。例如:my-host-project

    • SHARED_VPC_NAME 共用虛擬私有雲網路的名稱。 例如:my-shared-vpc

    如要在保留的 IP 位址範圍內部署資源,請在指令中使用的參數中加入下列程式碼:

    reserved-ip-range: RESERVED_NAME
    

    其中 RESERVED_NAME 是預留 IP 位址範圍的名稱,Filestore 執行個體可在該範圍內佈建。例如:filestore-reserved-ip-range。如果指定保留的 IP 範圍,則必須是具名位址範圍,而非直接 CIDR 值。

    詳情請參閱「分配 IP 位址範圍」或「設定保留的 IP 位址範圍」。如要查看如何使用 Google Cloud 控制台建立保留名稱的範例,請參閱「建立 IP 配置」。

  3. 建立 Deployment。

    執行下列指令來建立 Deployment 資源:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: test-pvc-fs-sharedvpc
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs-sharedvpc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-multishare-sharedvpc
      resources:
        requests:
          storage: 100Gi
    
    EOF
    

已啟用 CMEK 的 Filestore 執行個體

您可以建立裝載於啟用 CMEK 的 Filestore 多共用執行個體上的 GKE 磁碟區。在本節中,您將瞭解如何為 Filestore 執行個體設定客戶管理的加密金鑰 (CMEK)

您可以在 StorageClass 中提供客戶管理的金鑰詳細資料。凡是 Filestore CSI 驅動程式動態建立的執行個體,只要參照這個 StorageClass,都會啟用 CMEK。

  1. 建立啟用 CMEK 的 StorageClass。

    a. 執行下列指令:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-multishare-cmek
    provisioner: filestore.csi.storage.gke.io
    parameters:
      tier: enterprise
      multishare: "true"
      instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/REGION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    allowVolumeExpansion: true
    
    EOF
    

    其中:

    • KEY_PROJECT_ID 是金鑰所在的專案名稱。例如:my-key-project

    • REGION 是所用區域的名稱。例如:us-central1

    • RING_NAME 金鑰環名稱。例如:my-key-ring-name

    • KEY_NAME 金鑰名稱。例如:my-key-name

  2. 建立 Deployment。

    b. 執行下列指令來建立 Deployment 資源:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: test-pvc-fs-cmek
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs-cmek
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-multishare-cmek
      resources:
        requests:
          storage: 100Gi
    
    EOF
    

將 PVC 對應至 Filestore 執行個體

本節將說明如何將 PVC 對應至 Filestore 執行個體。

使用 Filestore 多共用執行個體時,每個 PVC 都會由 Filestore CSI 驅動程式代管在 Filestore 執行個體上。永久磁碟區規格的 volumeHandle 欄位會擷取代管磁碟區的基礎 Filestore 執行個體詳細資料,以及代表 Kubernetes 磁碟區的共用區。音量控點格式如下:

modeMultishare/<storageclass-prefix>/<project>/<region>/<filestore-instance-name>/<filestore-share-name>

您可以使用下列 kubectl 指令,快速判斷 PVC、PV、Filestore 執行個體和 Filestore 共用資源之間的對應關係。

在指令列執行下列指令:

kubectl get pv -o jsonpath='{range .items[*]}{"pv="}{.metadata.name}{",pvc="}{.spec.claimRef.name}{",volumeHandle="}{.spec.csi.volumeHandle}{"\n"}{end}'

您應該會看到類似以下的回應:

pv=pvc-67ad9abd-f25e-4130-b7ca-64d28bd29525,pvc=test-pvc-multishare,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_67ad9abd_f25e_4130_b7ca_64d28bd29525

pv=pvc-c80f4de0-9916-4957-b8ae-b21206650ac0,pvc=test-pvc-fs-sharedvpc,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_c80f4de0_9916_4957_b8ae_b21206650ac0

其中:

  • YOUR_PROJECT_ID 是所用專案的名稱。例如:my-project

請注意,叢集中的兩個永久磁碟區都託管在單一 Filestore 執行個體上。

後續步驟