GKE on AWS 1.6 及更高版本通过 EFS CSI 驱动程序支持 AWS Elastic File System (EFS)。本主题介绍如何将现有的 EFS 文件系统作为 PersistentVolume 装载到用户集群中。
准备工作
要执行本主题中的步骤,需要满足以下前提条件:
- 在 GKE on AWS 安装的 AWS VPC 中存在现有 EFS 文件系统。
- 在安装 GKE on AWS 的 AWS VPC 中至少有一个 EFS 装载目标。
- 所有 EFS 装载目标都必须属于以下子网:
- GKE on AWS 安装的专用子网。默认情况下,GKE on AWS 会创建名为
gke-CLUSTER_ID-private-AWS_ZONE
的子网,其中 CLUSTER_ID 是您的用户集群 ID,AWS_ZONE 是 AWS 可用性可用区。 - 节点池安全群组。默认情况下,GKE on AWS 会创建名为
gke-CLUSTER_ID-nodepool
的节点池,其中 CLUSTER_ID 是您的用户集群 ID。
- GKE on AWS 安装的专用子网。默认情况下,GKE on AWS 会创建名为
- 在
anthos-aws
目录中,使用anthos-gke
将上下文切换到用户集群。cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
将 CLUSTER_NAME 替换为用户集群名称。
使用 EFS PersistentVolume
如需将 EFS 文件系统用作 PersistentVolume 以便与用户集群结合使用,您首先要创建一个 PersistentVolume,然后创建一个要在工作负载中引用的 PersistentVolumeClaim。
创建 PersistentVolume
如需使用 EFS CSI 驱动程序创建 PersistentVolume,请执行以下步骤。
在
anthos-aws
目录中,使用anthos-gke
将上下文切换到用户集群。cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
将 CLUSTER_NAME 替换为用户集群名称。您使用的 PersistentVolume 配置取决于您是直接连接到 Elastic File System 还是透过接入点连接。请选择是直接连接到 Elastic File System 还是通过接入点连接。
直接连接
将以下 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_FILE_SYSTEM_ID
请替换以下内容:
- 将 VOLUME_NAME 替换为永久性卷的名称。
- 将 CLAIM_NAME 替换为您要用于 PersistentVolumeClaim 的名称。
- 将 EFS_FILE_SYSTEM_ID 替换为您的 EFS 文件系统 ID。例如
fs-12345678a
。
接入点
将以下 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_FILE_SYSTEM_ID::ACCESS_POINT_ID
请替换以下内容:
- 将 VOLUME_NAME 替换为永久性卷的名称。
- 将 CLAIM_NAME 替换为您要用于 PersistentVolumeClaim 的名称。
- 将 EFS_FILE_SYSTEM_ID 替换为您的 EFS 文件系统 ID。例如
fs-12345678a
。 - 将 ACCESS_POINT_ID 替换为您的接入点 ID。例如
fsap-1234567890abcde
。
将 YAML 应用到您的用户集群。
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f efs-volume.yaml
输出内容将确认 PersistentVolume 的创建。
persistentvolume/VOLUME_NAME created
创建 PersistentVolumeClaim
如需配合使用 EFS 文件系统与工作负载,请创建一个 PersistentVolumeClaim。
要创建 PersistentVolumeClaim,请将以下 YAML 清单复制到名为
efs-claim.yaml
的文件中。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: CLAIM_NAME spec: accessModes: - ReadWriteMany storageClassName: "" resources: requests: storage: 5Gi
将 CLAIM_NAME 替换为您的 PersistentVolumeClaim 的名称。例如
efs-claim1
。将 YAML 应用到您的用户集群。
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f efs-claim.yaml
输出内容将确认 PersistentVolumeClaim 的创建。
persistentvolumeclaim/CLAIM_NAME created
创建 StatefulSet
创建 PersistentVolumeClaim 后,您便可以在工作负载中使用它。本部分中的步骤将使用您装载的 EFS 文件系统创建一个示例 StatefulSet。您还可以通过引用 spec.volumes
中的声明,结合使用 PersistentVolumeClaim 与其他工作负载类型(例如 Pod 和 Deployment)。
如需创建 StatefulSet,以装载 PersistentVolumeClaim 中引用的 EFS 文件系统,请执行以下步骤。
将以下 YAML 清单复制到名为
efs-statefulset.yaml
的文件中。在此示例清单中,启动了一个 Ubuntu Linux 容器,用于将 EFS 文件系统装载到/efs-data
中。该容器每 5 秒将内容写入到 EFS 文件系统上名为out.txt
的文件中。apiVersion: apps/v1 kind: StatefulSet metadata: name: efs-shell spec: selector: matchLabels: app: test-efs serviceName: efs-app replicas: 1 template: metadata: labels: app: test-efs spec: terminationGracePeriodSeconds: 10 containers: - name: linux image: ubuntu:bionic command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /efs-data/out.txt; sleep 5; done"] volumeMounts: - name: efs-volume mountPath: /efs-data volumes: - name: efs-volume persistentVolumeClaim: claimName: CLAIM_NAME
请替换以下内容:
- 将 CLAIM_NAME 替换为您之前指定的 PersistentVolumeClaim 名称。例如
efs-claim1
。
- 将 CLAIM_NAME 替换为您之前指定的 PersistentVolumeClaim 名称。例如
将 YAML 应用到您的用户集群。
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f efs-statefulset.yaml
输出内容将确认 StatefulSet 的创建。
statefulset.apps/efs-shell created
StatefulSet 可能需要几分钟时间才能下载容器映像并启动。
使用
kubectl get pods
确认 StatefulSet 的 Pod 处于Running
状态。env HTTPS_PROXY=http://localhost:8118 \ kubectl get pods -l app=test-efs
输出包括 pod 的名称及其状态。在以下响应中,pod 的名称为
efs-shell-0
。NAME READY STATUS RESTARTS AGE efs-shell-0 1/1 Running 0 1m
pod 处于运行状态后,使用
kubectl exec
连接到托管 StatefulSet 的 pod。env HTTPS_PROXY=http://localhost:8118 \ kubectl exec -it efs-shell-0 -- bash
kubectl
命令会在该 pod 上启动 shell。如需确认已装载 EFS 文件系统,请使用
tail
命令检查out.txt
文件的内容。tail /efs-data/out.txt
输出内容包含最近时间(以世界协调时间格式显示)。
使用
exit
命令断开与 pod 的连接。exit
Shell 返回到本地机器。
如需移除 StatefulSet,请使用
kubectl delete
。env HTTPS_PROXY=http://localhost:8118 \ kubectl delete -f efs-statefulset.yaml
清理
如需移除您在前面部分创建的资源,请运行以下命令:
env HTTPS_PROXY=http://localhost:8118 \
kubectl delete -f efs-statefulset.yaml
env HTTPS_PROXY=http://localhost:8118 \
kubectl delete -f efs-claim.yaml
env HTTPS_PROXY=http://localhost:8118 \
kubectl delete -f efs-volume.yaml
后续步骤
- 请参阅
aws-efs-csi-driver
示例,了解使用 EFS 卷的其他方法。