本頁面說明如何使用 EFS CSI 驅動程式,在 AWS 上的 GKE 中設定以 EFS 為基礎的 PersistentVolume。Elastic File System (EFS) 是 AWS 的基礎機制,可為叢集提供網路檔案系統。以 EFS 為基礎的 PersistentVolume 是一種叢集資源,可透過 EFS 存取點為工作負載提供儲存空間,並確保儲存空間在沒有工作負載連線時仍會保留。
本頁適用於想要設定及管理儲存空間的運算子和儲存空間專家。如要進一步瞭解我們在 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
AWS 上的 GKE 支援靜態和動態佈建 PersistentVolume。動態佈建的設定方式稍有不同,但後續的管理工作較少。
事前準備
如要執行本頁的步驟,請先完成下列事項:
- 熟悉 Kubernetes 和 GKE on AWS 如何處理工作負載儲存空間。如要瞭解這些主題,請參閱「在 GKE on AWS 工作負載中使用永久儲存空間」和「建立 Amazon EFS 資源」。
- 如要使用 EFS 動態佈建 PersistentVolume,請升級至 Kubernetes 1.25 以上版本。如果您使用 Kubernetes 1.24 版,請與支援團隊聯絡,取得這項功能的存取權。
靜態佈建總覽
建立 Elastic File System (EFS),並透過靜態佈建提供給叢集中的工作負載,需要四個步驟:
- 建立 EFS 資源
- 設定網路
- 建立掛接目標
- 建立
PersistentVolume
最後一個步驟是依據工作負載發出 PersistentVolumeClaim
,要求永久儲存空間。
動態佈建總覽
建立 EFS 資源並透過動態佈建功能提供使用,也需要四個步驟:
- 建立 EFS 資源
- 設定網路
- 建立掛接目標
- 建立
StorageClass
建立 StorageClass
是一次性作業。定義具有特定特徵的儲存空間類別後,工作負載即可發出 PersistentVolumeClaim,或要求永久儲存空間。具有這些特性的儲存空間的所有 PersistentVolumeClaim 都可以要求相同的 StorageClass
。
常見步驟
無論您在叢集中使用靜態或動態佈建,都必須先完成這裡列出的設定步驟,然後繼續執行適當的靜態或動態佈建步驟。建立 EFS 並開放存取後,工作負載必須完成最後的存取步驟。如要瞭解如何執行這項操作,請參閱「使用 EFS 儲存空間」。
建立 AWS EFS 資源
無論使用靜態或動態佈建,都需要 EFS 資源。 如果叢集同時使用這兩者,您可以分別建立 EFS 資源,也可以共用同一個資源。如要進一步瞭解如何建立 EFS 資源,請參閱「建立 Amazon EFS 檔案系統」。
您也可以重複使用現有的 EFS,在這種情況下,您可以略過本節,直接前往「建立掛接目標」。
取得叢集執行的 AWS 區域。
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(awsRegion)"
更改下列內容:
- CLUSTER_NAME:AWS 叢集的名稱。
- LOCATION:AWS 叢集的位置 Google Cloud
使用下列指令,在相同 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 的存取權。
如果叢集中的節點集區在不同子網路上執行,則必須在每個節點集區子網路上建立個別的掛接目標。
在本範例中,每個掛接目標的存取權都受到單一安全群組的保護,該群組同時包含掛接目標和節點集區機器。視虛擬私有雲設定和安全性需求而定,您可能會選擇將這項設定分成兩個以上的安全性群組,例如一個用於掛接目標,另一個用於節點集區工作節點。
建立專屬安全性群組,控管 EFS 的存取權
取得叢集執行的 AWS VPC ID。
gcloud container aws clusters describe CLUSTER_NAME \ --location=LOCATION \ --format="value(networking.vpcId)"
更改下列內容:
- CLUSTER_NAME
- LOCATION
輸出結果會包含 VPC 的 ID。請儲存這個值。稍後需使用這項資訊。
建立安全性群組,控管 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。請儲存這個值。稍後需使用這項資訊。
根據預設,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。
授權 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
在每個節點集區子網路上建立 EFS 掛接目標。
列出與所有節點集區相關聯的子網路。
gcloud container aws node-pools list \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format="value(subnetId)"
更改下列內容:
- CLUSTER_NAME
- LOCATION
輸出內容為子網路 ID 清單。請儲存這個值。稍後需使用這項資訊。
為每個子網路建立相關聯的 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
將 EFS 安全性群組新增至所有叢集節點集區。
取得所有節點集區的清單。
gcloud container aws node-pools list \ --cluster=CLUSTER_NAME \ --location=LOCATION
更改下列內容:
- CLUSTER_NAME
- LOCATION
輸出結果包含叢集的節點集區名稱。請儲存這個值。稍後需使用這項資訊。
更新每個節點集區,加入新的 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 共用磁碟。
根據您是直接連線至 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
。
將 YAML 套用至叢集。
kubectl apply -f efs-volume.yaml
輸出內容會確認 PersistentVolume 的建立作業。
persistentvolume/VOLUME_NAME created
動態佈建
本節說明如何建立 StorageClass,並參照您先前建立的 EFS 資源。完成後,開發人員就能按照「使用 EFS 資源」一文所述步驟存取 EFS 資源。
建立參照 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。
將 YAML 套用至叢集。
kubectl apply -f efs-storage-class.yaml
如果成功,這個指令的輸出內容會包含類似下列的行:
storageclass/EFS_STORAGE_CLASS_NAME created
清除所用資源
如要移除您在先前章節中建立的資源,請執行下列指令:
使用
kubectl
從叢集移除 EFS 聲明資源:kubectl delete -f efs-claim.yaml
如果使用靜態佈建,請使用
kubectl
從叢集中移除相關資源:kubectl delete -f efs-volume.yaml
如果使用動態佈建,請使用
kubectl
從叢集中移除相關聯的資源:kubectl delete -f efs-storage-class.yaml
找出掛接目標的 ID:
aws efs describe-mount-targets \ --file-system-id EFS_ID \ --profile adminuser \ --region AWS_REGION
更改下列內容:
- EFS_ID:EFS 資源的 ID
- AWS_REGION:叢集執行的 AWS 區域
輸出結果會包含掛接目標 ID。請儲存這個值。稍後需使用這項資訊。
刪除 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 區域
刪除您建立的所有安全性群組。
使用 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
後續步驟
- 瞭解如何使用工作負載存取 EFS 磁碟區
PersistentVolumeClaim
- 如要瞭解使用 EFS 磁碟區的其他方式,請參閱
aws-efs-csi-driver
範例。