使用 EFS 文件系统

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。
  • 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,请执行以下步骤。

  1. anthos-aws 目录中,使用 anthos-gke 将上下文切换到用户集群。

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    CLUSTER_NAME 替换为用户集群名称。

  2. 您使用的 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
  3. 将 YAML 应用到您的用户集群。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f efs-volume.yaml
    

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

    persistentvolume/VOLUME_NAME created
    

创建 PersistentVolumeClaim

如需配合使用 EFS 文件系统与工作负载,请创建一个 PersistentVolumeClaim。

  1. 要创建 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

  2. 将 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 文件系统,请执行以下步骤。

  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 应用到您的用户集群。

    env HTTPS_PROXY=http://localhost:8118 \
     kubectl apply -f efs-statefulset.yaml
    

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

    statefulset.apps/efs-shell created
    

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

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

    env HTTPS_PROXY=http://localhost:8118 \
      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 返回到本地机器。

  7. 如需移除 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

后续步骤