使用 EFS 资源

Elastic File System (EFS) 是用于为集群提供存储空间(磁盘空间)的底层 AWS 机制。PersistentVolume 是一种集群资源,可让 EFS 存储空间供工作负载使用,并确保它在即使没有工作负载相连的情况下持续存在。本主题介绍工作负载如何使用 PersistentVolumeClaim 访问 PersistentVolume。

GKE on AWS 支持为所有受支持的 Kubernetes 版本静态预配 PersistentVolume。对于 Kubernetes 1.24 版或更高版本的集群,GKE on AWS 还支持动态预配。如需使用动态预配,您的集群管理员必须进行相应配置。如需了解具体方法,请参阅配置 PersistentVolume

创建一个 PersistentVolumeClaim

选择下面适当的标签页,具体取决于您是希望将工作负载连接到静态还是动态预配的永久性卷。

静态

以下说明假定您的集群管理员已预配至少一个 PersistentVolume。如需访问此 PersistentVolume 并将其底层 EFS 与您的工作负载一起使用,请创建一个 PersistentVolumeClaim。

如需为静态预配的 PersistentVolume 创建 PersistentVolumeClaim,请将以下 YAML 清单复制到名为 efs-claim.yaml 的文件中。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: CLAIM_NAME
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "" # Leave as empty string for static provisioning
  resources:
    requests:
      storage: 5Gi

您需要将其中的:

  • CLAIM_NAME:您为要绑定到的 PersistentVolumeClaim 选择的名称,例如 efs-claim1。留空可绑定到默认存储类别
  1. 将 YAML 应用到您的集群。

      kubectl apply -f efs-claim.yaml
    

    此输出内容将确认 PersistentVolumeClaim 的创建。

    persistentvolumeclaim/CLAIM_NAME created
    

Dynamic

以下说明假定您的集群管理员已为动态预配预配了至少一个 StorageClass。如需使用此 StorageClass 创建动态预配的 PersistentVolume,并将底层 EFS 接入点与工作负载结合使用,请创建 PersistentVolumeClaim。

如需创建 PersistentVolumeClaim,请按照以下步骤操作。EFS CSI 驱动程序将此 PersistentVolumeClaim 与指定的 StorageClass 结合使用来动态预配 PersistentVolume。

  1. 将以下 YAML 清单复制到名为 efs-claim.yaml 的文件中。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: CLAIM_NAME
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "EFS_STORAGE_CLASS_NAME"
  resources:
    requests:
      storage: 5Gi

您需要将其中的:

  • CLAIM_NAME:您为 PersistentVolumeClaim 选择的名称,例如 efs-claim1
  • EFS_STORAGE_CLASS_NAME:您希望 PersistentVolumeClaim 绑定到的 StorageClass 的名称。将此字段留空可绑定到默认存储类别
  1. 将 YAML 应用到您的集群。

      kubectl apply -f efs-claim.yaml
    

    输出内容将确认 PersistentVolumeClaim 的创建。

    persistentvolumeclaim/CLAIM_NAME created
    

创建 StatefulSet

创建 PersistentVolumeClaim 后,您便可以在工作负载中使用它。本部分将创建一个使用 PersistentVolumeClaim 的示例 StatefulSet。您还可以通过引用 spec.volumes 中的声明,将 PersistentVolumeClaim 与其他工作负载类型(例如 Pod 和 Deployment)搭配使用。

如需创建 StatefulSet,并装载 PersistentVolumeClaim 中引用的 EFS 资源,请执行以下步骤。

  1. 将以下 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

  2. 将 YAML 应用到您的集群。

     kubectl apply -f efs-statefulset.yaml
    

    输出内容将确认 StatefulSet 的创建。

    statefulset.apps/efs-shell created
    

    StatefulSet 可能需要几分钟时间来下载和启动容器映像。

  3. 使用 kubectl get pods 确认 StatefulSet 的 Pod 处于 Running 状态。

      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
    
  4. pod 处于运行状态后,使用 kubectl exec 连接到托管 StatefulSet 的 pod。

      kubectl exec -it efs-shell-0 -- bash
    

    kubectl 命令会在该 pod 上启动 shell。

  5. 如需确认已装载 EFS 资源,请使用 tail 命令检查 out.txt 文件的内容。

    tail /efs-data/out.txt
    

    输出内容包含最近时间(以世界协调时间格式显示)。

  6. 使用 exit 命令断开与 pod 的连接。

      exit
    

    Shell 返回到本地机器。

清理

如需移除 StatefulSet,请使用 kubectl delete

  kubectl delete -f efs-statefulset.yaml

后续步骤