使用 EFS 佈建永久磁碟區

本頁面說明如何使用 EFS CSI 驅動程式,在 AWS 上的 GKE 中設定以 EFS 為基礎的 PersistentVolume。Elastic File System (EFS) 是 AWS 的基礎機制,可為叢集提供網路檔案系統。以 EFS 為基礎的 PersistentVolume 是一種叢集資源,可透過 EFS 存取點為工作負載提供儲存空間,並確保儲存空間在沒有工作負載連線時仍會保留。

本頁適用於想要設定及管理儲存空間的運算子和儲存空間專家。如要進一步瞭解我們在 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

AWS 上的 GKE 支援靜態和動態佈建 PersistentVolume。動態佈建的設定方式稍有不同,但後續的管理工作較少。

事前準備

如要執行本頁的步驟,請先完成下列事項:

靜態佈建總覽

建立 Elastic File System (EFS),並透過靜態佈建提供給叢集中的工作負載,需要四個步驟:

  • 建立 EFS 資源
  • 設定網路
  • 建立掛接目標
  • 建立 PersistentVolume

最後一個步驟是依據工作負載發出 PersistentVolumeClaim,要求永久儲存空間。

動態佈建總覽

建立 EFS 資源並透過動態佈建功能提供使用,也需要四個步驟:

  • 建立 EFS 資源
  • 設定網路
  • 建立掛接目標
  • 建立 StorageClass

建立 StorageClass 是一次性作業。定義具有特定特徵的儲存空間類別後,工作負載即可發出 PersistentVolumeClaim,或要求永久儲存空間。具有這些特性的儲存空間的所有 PersistentVolumeClaim 都可以要求相同的 StorageClass

常見步驟

無論您在叢集中使用靜態或動態佈建,都必須先完成這裡列出的設定步驟,然後繼續執行適當的靜態或動態佈建步驟。建立 EFS 並開放存取後,工作負載必須完成最後的存取步驟。如要瞭解如何執行這項操作,請參閱「使用 EFS 儲存空間」。

建立 AWS EFS 資源

無論使用靜態或動態佈建,都需要 EFS 資源。 如果叢集同時使用這兩者,您可以分別建立 EFS 資源,也可以共用同一個資源。如要進一步瞭解如何建立 EFS 資源,請參閱「建立 Amazon EFS 檔案系統」。

您也可以重複使用現有的 EFS,在這種情況下,您可以略過本節,直接前往「建立掛接目標」。

  1. 取得叢集執行的 AWS 區域。

    gcloud container aws clusters describe CLUSTER_NAME \
      --location=LOCATION \
      --format="value(awsRegion)"
    

    更改下列內容:

    • CLUSTER_NAME:AWS 叢集的名稱。
    • LOCATION:AWS 叢集的位置 Google Cloud
  2. 使用下列指令,在相同 AWS 區域中建立 EFS 資源系統。

    aws efs create-file-system \
      --region AWS_REGION \
      --performance-mode generalPurpose \
      --query 'FileSystemId' \
      --output text
    

    更改下列內容:

    • AWS_REGION:叢集執行的 AWS 區域

輸出內容會包含檔案系統的 ID。請儲存這個值。稍後需使用這項資訊。

建立掛接目標

EFS 的 CSI 驅動程式會透過 EFS 掛接目標存取檔案系統。掛接目標是私人 IP 位址,可使用 AWS 安全性群組控管對基礎 EFS 的存取權。

如果叢集中的節點集區在不同子網路上執行,則必須在每個節點集區子網路上建立個別的掛接目標。

在本範例中,每個掛接目標的存取權都受到單一安全群組的保護,該群組同時包含掛接目標和節點集區機器。視虛擬私有雲設定和安全性需求而定,您可能會選擇將這項設定分成兩個以上的安全性群組,例如一個用於掛接目標,另一個用於節點集區工作節點。

  1. 建立專屬安全性群組,控管 EFS 的存取權

    取得叢集執行的 AWS VPC ID。

    gcloud container aws clusters describe CLUSTER_NAME \
      --location=LOCATION \
      --format="value(networking.vpcId)"
    

    更改下列內容:

    • CLUSTER_NAME
    • LOCATION

    輸出結果會包含 VPC 的 ID。請儲存這個值。稍後需使用這項資訊。

  2. 建立安全性群組,控管 EFS 掛載目標的存取權。

    aws ec2 create-security-group \
      --group-name gke-efs-security-group \
      --description "EFS security group" \
      --vpc-id VPC_ID \
      --output text
    

    VPC_ID 替換為叢集執行的 AWS VPC ID。

    輸出內容會包含新安全性群組的 ID。請儲存這個值。稍後需使用這項資訊。

  3. 根據預設,AWS 會建立安全性群組,並提供允許所有輸出流量的預設規則。移除預設輸出規則。

    aws ec2 revoke-security-group-egress \
      --group-id SECURITY_GROUP_ID
      --ip-permissions '[{"IpProtocol":"-1","FromPort":-1,"ToPort":-1,"IpRanges":[{"CidrIp":"0.0.0.0/0"}]}]'
    

    SECURITY_GROUP_ID 替換為 AWS 安全群組的 ID。

  4. 授權 EFS 的輸入和輸出流量 (通訊埠 2049)。

    aws ec2 authorize-security-group-ingress \
        --group-id SECURITY_GROUP_ID \
        --protocol tcp \
        --port 2049 \
        --source-group SECURITY_GROUP_ID
    
    aws ec2 authorize-security-group-egress \
        --group-id SECURITY_GROUP_ID \
        --protocol tcp \
        --port 2049 \
        --source-group SECURITY_GROUP_ID
    
  5. 在每個節點集區子網路上建立 EFS 掛接目標。

    列出與所有節點集區相關聯的子網路。

    gcloud container aws node-pools list \
      --cluster=CLUSTER_NAME \
      --location=LOCATION \
      --format="value(subnetId)"
    

    更改下列內容:

    • CLUSTER_NAME
    • LOCATION

    輸出內容為子網路 ID 清單。請儲存這個值。稍後需使用這項資訊。

  6. 為每個子網路建立相關聯的 EFS 掛接目標,並套用安全性群組。

    aws efs create-mount-target \
        --file-system-id EFS_ID \
        --subnet-id SUBNET_ID \
        --security-groups SECURITY_GROUP_ID
    

    更改下列內容:

    • EFS_ID:EFS 資源的 ID。
    • SUBNET_ID:節點集區子網路的 ID。
    • SECURITY_GROUP_ID
  7. 將 EFS 安全性群組新增至所有叢集節點集區。

    取得所有節點集區的清單。

    gcloud container aws node-pools list \
      --cluster=CLUSTER_NAME \
      --location=LOCATION
    

    更改下列內容:

    • CLUSTER_NAME
    • LOCATION

    輸出結果包含叢集的節點集區名稱。請儲存這個值。稍後需使用這項資訊。

  8. 更新每個節點集區,加入新的 EFS 安全性群組。

    gcloud container aws node-pools update NODE_POOL_NAME \
      --cluster=CLUSTER_NAME \
      --location=LOCATION  \
      --security-group-ids=SECURITY_GROUP_IDS
    

    更改下列內容:

    • NODE_POOL_NAME:節點集區的名稱。
    • CLUSTER_NAME:叢集名稱。
    • LOCATION
    • SECURITY_GROUP_IDS 工作站節點的安全性群組 ID 清單。

建立 PersistentVolume (靜態) 或 StorageClass (動態)

如果您使用靜態佈建,下一步是建立 PersistentVolume。 如果您使用動態佈建,EFS 驅動程式會為您執行這項操作;您只需定義 StorageClass,供工作負載在 PersistentVolumeClaim 中指定。選擇與所選佈建方法相符的分頁。

靜態佈建

如果您使用靜態佈建,下一步是建立 PersistentVolume,掛接 EFS 共用磁碟。

  1. 根據您是直接連線至 EFS 共用區,還是透過存取點連線,選擇適當的分頁。

    直接連線

    將下列 YAML 資訊清單複製到名為 efs-volume.yaml 的檔案。 資訊清單會參照您先前建立的 EFS 儲存空間類別。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: "" # storageClassName is not required, see note in the following section.
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_ID
    

    更改下列內容:

    • VOLUME_NAME 替換為永久磁碟區的名稱。
    • CLAIM_NAME 替換為您要用於 PersistentVolumeClaim 的名稱。
    • EFS_ID 替換為您的 EFS 資源 ID。例如:fs-12345678a

    存取點

    如要建立以存取點為基礎的磁碟區,您必須手動佈建。詳情請參閱「使用 EFS 存取點」。

    將下列 YAML 資訊清單複製到名為 efs-volume.yaml 的檔案。 資訊清單會參照您先前建立的 EFS 儲存空間類別。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: VOLUME_NAME
    spec:
      capacity:
        # Note: storage capacity is not used by the EFS CSI driver.
        # It is required by the PersistentVolume spec.
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      # Set storageClassName to empty string for static provisioning. See [Use an EFS resource](/kubernetes-engine/multi-cloud/docs/aws/how-to/use-efs)
      storageClassName: ""
      claimRef:
        name: CLAIM_NAME
        namespace: default
      csi:
        driver: efs.csi.aws.com
        volumeHandle: EFS_ID::ACCESS_POINT_ID
    

    更改下列內容:

    • VOLUME_NAME 替換為永久磁碟區的名稱。
    • CLAIM_NAME 替換為您要用於 PersistentVolumeClaim 的名稱。
    • EFS_ID 替換為您的 EFS 資源 ID。例如:fs-12345678a
    • ACCESS_POINT_ID 改成存取點的 ID。例如:fsap-1234567890abcde
  2. 將 YAML 套用至叢集。

    kubectl apply -f efs-volume.yaml
    

    輸出內容會確認 PersistentVolume 的建立作業。

    persistentvolume/VOLUME_NAME created
    
    

動態佈建

本節說明如何建立 StorageClass,並參照您先前建立的 EFS 資源。完成後,開發人員就能按照「使用 EFS 資源」一文所述步驟存取 EFS 資源。

  1. 建立參照 EFS 資源 ID 的 StorageClass。

    將下列 YAML 片段複製到名為 efs-storage-class.yaml 的新檔案。如要進一步瞭解如何調整這個檔案所描述的 StorageClass 特徵,請參閱 EFS StorageClass 參數說明文件。

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: EFS_STORAGE_CLASS_NAME
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: EFS_ID
      directoryPerms: "700"
    
    

    取代:

    • EFS_STORAGE_CLASS_NAME 改成您為 StorageClass 選擇的名稱。
    • EFS_ID,並換成 EFS 資源 ID,例如 fs-12345678a。
  2. 將 YAML 套用至叢集。

    kubectl apply -f efs-storage-class.yaml
    

    如果成功,這個指令的輸出內容會包含類似下列的行:

    storageclass/EFS_STORAGE_CLASS_NAME created

清除所用資源

如要移除您在先前章節中建立的資源,請執行下列指令:

  1. 使用 kubectl 從叢集移除 EFS 聲明資源:

    kubectl delete -f efs-claim.yaml
    
  2. 如果使用靜態佈建,請使用 kubectl 從叢集中移除相關資源:

    kubectl delete -f efs-volume.yaml
    
  3. 如果使用動態佈建,請使用 kubectl 從叢集中移除相關聯的資源:

    kubectl delete -f efs-storage-class.yaml
    
  4. 找出掛接目標的 ID:

    aws efs describe-mount-targets \
    --file-system-id EFS_ID \
    --profile adminuser \
    --region AWS_REGION
    

    更改下列內容:

    • EFS_ID:EFS 資源的 ID
    • AWS_REGION:叢集執行的 AWS 區域

    輸出結果會包含掛接目標 ID。請儲存這個值。稍後需使用這項資訊。

  5. 刪除 EFS 掛接目標:

    aws efs delete-mount-target \
    --mount-target-id MOUNT_TARGET_ID \
    --profile adminuser \
    --region AWS_REGION
    

    更改下列內容:

    • MOUNT_TARGET_ID:EFS 掛接目標的 ID
    • AWS_REGION:掛接目標的 AWS 區域
  6. 刪除您建立的所有安全性群組。

  7. 使用 delete-file-system CLI 指令刪除檔案系統。您可以使用 describe-file-systems CLI 指令,取得檔案系統清單。檔案系統 ID 位於回應中。

    aws efs delete-file-system \
      --file-system-id EFS_ID \
      --profile adminuser \
      --region AWS_REGION
    

    更改下列內容:

    • EFS_ID
    • AWS_REGION

後續步驟