使用 GKE 卷填充程序在动态预配期间从 Cloud Storage 传输数据


GKE 卷填充工具仅限受邀者使用。如果您想在 Google Cloud 项目中申请访问 GKE Volume Populator,请与您的销售代表联系。

借助 GKE 卷填充程序,您可以在动态预配期间将数据从源存储空间预加载到目标 PersistentVolumeClaim,而无需运行其他脚本或 CLI 命令来手动传输数据。此功能通过利用 Kubernetes Volume Populator 功能,自动执行并简化数据传输流程。它可实现无缝的数据可移性,以便您切换存储类型,从而获享更优惠的价格或性能。

如果您需要将大量数据从 Cloud Storage 存储分区转移到由其他Google Cloud 存储类型(例如 Parallelstore)支持的 PersistentVolumeClaim,请使用此功能。

您主要通过 gcloud CLI 和 kubectl CLI 与 GKE 卷填充工具进行交互。Autopilot 和 Standard 集群都支持 GKE 卷填充程序。您无需启用 GKE 卷填充程序。它是 GKE 管理的组件,默认处于启用状态。

优势

  • 如果您想利用托管式并行文件系统的性能,但您的数据存储在 Cloud Storage 中,则可以使用 GKE 卷填充程序来简化数据传输。
  • GKE 卷填充工具支持数据可移植性;您可以根据需要移动数据。
  • GKE 卷填充工具支持基于 IAM 的身份验证,因此您可以在传输数据的同时保持精细的访问权限控制。

使用 GKE 卷填充程序从源数据存储空间传输数据,并为目标存储空间创建 PV

该图展示了数据如何从源存储空间流向目标存储空间,以及如何使用 GKE Volume Populator 为目标存储空间创建 PersistentVolume。

限制

  • GKE 卷填充程序仅支持将 Cloud Storage 存储分区用作源存储空间,并将 Parallelstore 实例用作目标存储空间类型。
  • GKE Volume Populator 仅支持将 volumeBindingMode 设置为 Immediate 的 StorageClass 资源。
  • GCPDataSource 自定义资源必须与您的 Kubernetes 工作负载位于同一命名空间中。不支持使用跨命名空间数据源的卷。
  • GKE 卷填充程序仅支持将 IAM 服务账号绑定到 Kubernetes 服务账号的 Workload Identity Federation for GKE。不支持直接向 Kubernetes 服务账号授予 IAM 权限。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Parallelstore API 和 Google Kubernetes Engine API。
  • 启用 API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

使用要求

如需使用 GKE 卷填充程序,您的集群必须满足以下要求:

  • 使用 GKE 集群版本 1.31.1-gke.1729000 或更高版本。
  • 启用 Parallelstore CSI 驱动程序。在新的和现有的 GKE Autopilot 集群上,GKE 默认会为您启用 CSI 驱动程序。在新的和现有的 Standard 集群上,您需要启用 CSI 驱动程序

准备环境

本部分介绍了创建 GKE 集群并设置使用 GKE 卷填充器所需权限的步骤。

设置 VPC 网络

创建 Parallelstore 实例和客户端 Compute Engine 虚拟机或 GKE 集群时,您必须指定相同的 Virtual Private Cloud (VPC) 网络。若要让 VPC 能够以私密方式连接到 Google Cloud服务,而无需将流量公开到公共互联网,您需要一次性配置专用服务通道 (PSA)(如果尚未配置)。

如需配置 PSA,请按以下步骤操作:

  1. 配置 Compute Network Admin (roles/compute.networkAdmin) IAM 权限,以便为您的项目设置网络对等互连。

    如需授予该角色,请运行以下命令:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="user:EMAIL_ADDRESS" \
        --role=roles/compute.networkAdmin
    

    EMAIL_ADDRESS 替换为您的电子邮件地址。

  2. 启用服务网络:

    gcloud services enable servicenetworking.googleapis.com
    
  3. 创建 VPC 网络:

    gcloud compute networks create NETWORK_NAME \
      --subnet-mode=auto \
      --mtu=8896 \
      --project=PROJECT_ID
    

    替换以下内容:

    • NETWORK_NAME:您将在其中创建 Parallelstore 实例的 VPC 网络的名称。
    • PROJECT_ID:您的 Google Cloud 项目 ID
  4. 创建 IP 范围。

    若要设置专用服务访问通道,您需要提供一个前缀长度至少为 /24(256 个地址)的IP 地址范围 (CIDR 块)。Parallelstore 会为每个实例预留 64 个地址,这意味着您可以根据需要将此 IP 地址范围用于其他服务或其他 Parallelstore 实例。

    gcloud compute addresses create IP_RANGE_NAME \
      --global \
      --purpose=VPC_PEERING \
      --prefix-length=24 \
      --description="Parallelstore VPC Peering" \
      --network=NETWORK_NAME \
      --project=PROJECT_ID
    

    IP_RANGE_NAME 替换为 VPC 网络 IP 范围名称。

  5. 设置一个环境变量,其中包含与您在上一步中创建的范围关联的 CIDR 范围:

    CIDR_RANGE=$(
      gcloud compute addresses describe IP_RANGE_NAME \
        --global  \
        --format="value[separator=/](address, prefixLength)" \
        --project=PROJECT_ID \
    )
    
  6. 创建一条防火墙规则,以允许来自您创建的 IP 地址范围的 TCP 流量:

    gcloud compute firewall-rules create FIREWALL_NAME \
      --allow=tcp \
      --network=NETWORK_NAME \
      --source-ranges=$CIDR_RANGE \
      --project=PROJECT_ID
    

    FIREWALL_NAME 替换为防火墙规则的名称,以允许来自您将创建的 IP 地址范围的 TCP 流量。

  7. 建立对等连接:

    gcloud services vpc-peerings connect \
      --network=NETWORK_NAME \
      --ranges=IP_RANGE_NAME \
      --project=PROJECT_ID \
      --service=servicenetworking.googleapis.com
    

如果您在设置 VPC 网络时遇到问题,请参阅 Parallelstore 问题排查指南

创建 GKE 集群

我们建议您使用 Autopilot 集群获得全代管式 Kubernetes 体验。如需选择最适合您的工作负载需求的 GKE 操作模式,请参阅选择 GKE 操作模式

Autopilot

如需使用 Autopilot 创建 GKE 集群,请运行以下命令:

gcloud container clusters create-auto CLUSTER_NAME  \
    --network=NETWORK_NAME  \
    --cluster-version=CLUSTER_VERSION \
    --location=CLUSTER_LOCATION

默认情况下,GKE 会在 Autopilot 集群中启用适用于 GKE 的工作负载身份联合和 Parallelstore CSI 驱动程序。

替换以下值:

  • CLUSTER_NAME:您的集群的名称。
  • CLUSTER_VERSION:GKE 版本号。 您必须指定 1.31.1-gke.1729000 或更高版本。
  • NETWORK_NAME:您为 Parallelstore 实例创建的 VPC 网络的名称。如需了解详情,请参阅配置 VPC 网络
  • CLUSTER_LOCATION:您要在其中创建集群的区域。我们建议您在受支持的 Parallelstore 位置创建集群,以获得最佳性能。如果您想在不受支持的 Parallelstore 位置创建集群,则在创建 Parallelstore StorageClass 时,必须指定使用受支持 Parallelstore 位置的自定义拓扑,否则配置将会失败。

标准

使用以下命令创建启用了 Parallelstore CSI 驱动程序和适用于 GKE 的工作负载身份联合的 Standard 集群:

gcloud container clusters create CLUSTER_NAME \
    --addons=ParallelstoreCsiDriver \
    --cluster-version=CLUSTER_VERSION \
    --workload-pool=PROJECT_ID.svc.id.goog \
    --network=NETWORK_NAME \
    --location=CLUSTER_LOCATION

替换以下值:

  • CLUSTER_NAME:您的集群的名称。
  • CLUSTER_VERSION:GKE 版本号。您必须指定 1.31.1-gke.1729000 或更高版本。
  • PROJECT_ID:您的 Google Cloud 项目 ID
  • NETWORK_NAME:您为 Parallelstore 实例创建的 VPC 网络的名称。如需了解详情,请参阅配置 VPC 网络
  • CLUSTER_LOCATION:您要创建集群的区域或可用区。我们建议您在受支持的 Parallelstore 位置创建集群,以获得最佳性能。如果您想在不受支持的 Parallelstore 位置创建集群,则在创建 Parallelstore StorageClass 时,必须指定使用受支持 Parallelstore 位置的自定义拓扑,否则配置将会失败。

设置必要权限

如需从 Cloud Storage 存储桶传输数据,您需要为 适用于 GKE 的工作负载身份联合设置权限。

  1. 创建 Kubernetes 命名空间:

    kubectl create namespace NAMESPACE
    

    NAMESPACE 替换为工作负载将在其上运行的命名空间。

  2. 创建 Kubernetes 服务账号

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    

    KSA_NAME 替换为您的 Pod 用于向 Google Cloud API 进行身份验证的 Kubernetes 服务账号的名称。

  3. 创建 IAM 服务账号。 您还可以在组织中的任何项目中使用任何现有的 IAM 服务账号:

    gcloud iam service-accounts create IAM_SA_NAME \
        --project=PROJECT_ID
    

    替换以下内容:

    • IAM_SA_NAME:您的 IAM 服务账号的名称。
    • PROJECT_ID:您的 Google Cloud 项目 ID
  4. 向您的 IAM 服务账号授予 roles/storage.objectViewer 角色,以便其可以访问您的 Cloud Storage 存储桶:

    gcloud storage buckets \
        add-iam-policy-binding gs://GCS_BUCKET \
        --member "serviceAccount:IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role "roles/storage.objectViewer"
    

    GCS_BUCKET 替换为您的 Cloud Storage 存储桶名称。

  5. 创建 IAM 许可政策,向 Kubernetes 服务账号授予模拟 IAM 服务账号的权限:

    gcloud iam service-accounts \
        add-iam-policy-binding IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    
  6. 为 Kubernetes 服务账号添加注解,以便 GKE 看到服务账号之间的关联。

    kubectl annotate serviceaccount KSA_NAME \
        --namespace NAMESPACE \
        iam.gke.io/gcp-service-account=IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com
    
  7. 创建 Parallelstore 服务身份:

    gcloud beta services identity create \
        --service=parallelstore.googleapis.com \
        --project=PROJECT_ID
    
  8. 向 Parallelstore 服务身份授予 roles/iam.serviceAccountTokenCreator 角色,以允许其模拟 IAM 服务账号。设置 PROJECT_NUMBER 环境变量,以便在后续步骤中使用。

    export PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
    gcloud iam service-accounts \
        add-iam-policy-binding "IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --member=serviceAccount:"service-${PROJECT_NUMBER?}@gcp-sa-parallelstore.iam.gserviceaccount.com" \
        --role=roles/iam.serviceAccountTokenCreator
    

    PROJECT_NUMBER 值是系统为您的项目自动生成的唯一标识符。如需查找此值,请参阅创建和管理项目

  9. 向 Parallelstore 服务身份授予 roles/iam.serviceAccountUser 角色,以允许其访问 IAM 服务账号可以访问的所有资源:

    gcloud iam service-accounts \
        add-iam-policy-binding "IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --member=serviceAccount:"service-${PROJECT_NUMBER?}@gcp-sa-parallelstore.iam.gserviceaccount.com" \
        --role=roles/iam.serviceAccountUser
    
  10. 向 GKE 服务身份授予 roles/iam.serviceAccountUser 角色,以允许其访问 IAM 服务账号可以访问的所有资源。如果 GKE 集群和 IAM 服务账号位于同一项目中,则无需执行此步骤。

    gcloud iam service-accounts \
        add-iam-policy-binding "IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --member=serviceAccount:"service-${PROJECT_NUMBER?}@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/iam.serviceAccountUser
    

创建包含预加载数据的 Parallelstore 卷

以下几个部分介绍了使用 GKE 卷填充程序创建 Parallelstore 卷(其中包含从 Cloud Storage 存储桶预加载的数据)的典型过程。

  1. 创建 GCPDataSource 资源
  2. 创建 Parallelstore StorageClass
  3. 创建 PersistentVolumeClaim 以访问该卷
  4. 验证 PersistentVolumeClaim 预配是否已完成
  5. (可选)查看数据传输进度
  6. 创建使用该卷的工作负载

创建 GCPDataSource 资源

如需使用 GKE 卷填充程序,请创建 GCPDataSource 自定义资源。此资源定义了要用于填充卷的来源存储属性。

  1. 将以下清单保存在名为 gcpdatasource.yaml 的文件中。

    apiVersion: datalayer.gke.io/v1
    kind: GCPDataSource
    metadata:
      name: GCP_DATA_SOURCE
      namespace: NAMESPACE
    spec:
      cloudStorage:
        serviceAccountName: KSA_NAME
        uri: gs://GCS_BUCKET/
    

    替换以下值:

    • GCP_DATA_SOURCE:用于存储对 Cloud Storage 存储桶的引用的 GCPDataSource CRD 的名称。如需了解详情,请参阅 GCPDataSource CRD 参考文档
    • NAMESPACE:工作负载将在其中运行的命名空间。命名空间值应与您的工作负载命名空间相同。
    • KSA_NAME:您的 Pod 用于向 Google Cloud API 进行身份验证的 Kubernetes 服务账号的名称。cloudStorage.serviceAccountName 值应为您在设置必要的权限步骤中为 Workload Identity Federation for GKE 设置的 Kubernetes 服务账号。
    • GCS_BUCKET:您的 Cloud Storage 存储桶名称。或者,您也可以为 uri 字段指定 gs://GCS_BUCKET/PATH_INSIDE_BUCKET/
  2. 通过运行以下命令创建 GCPDataSource 资源:

    kubectl apply -f gcpdatasource.yaml
    

创建 Parallelstore StorageClass

创建 StorageClass,以指示 Parallelstore CSI 驱动程序在 GKE 集群所在的区域中预配 Parallelstore 实例。这可确保获得最佳 I/O 性能。

  1. 将以下清单保存为 parallelstore-class.yaml。确保 StorageClass 定义中的 volumeBindingMode 字段设置为 Immediate

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: parallelstore-class
    provisioner: parallelstore.csi.storage.gke.io
    volumeBindingMode: Immediate
    reclaimPolicy: Delete
    
  2. 运行以下命令以创建 StorageClass:

    kubectl apply -f parallelstore-class.yaml
    

如果您想使用特定拓扑创建自定义 StorageClass,请参阅 Parallelstore CSI 指南

创建 PersistentVolumeClaim 以访问卷

以下清单文件展示了如何在 ReadWriteMany 访问模式中创建引用您之前创建的 StorageClass 的 PersistentVolumeClaim 的示例。

  1. 将以下清单保存在名为 volume-populator-pvc.yaml 的文件中:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: PVC_NAME
      namespace: NAMESPACE
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: parallelstore-class
      resources:
        requests:
          storage: 12Gi
      dataSourceRef:
        apiGroup: datalayer.gke.io
        kind: GCPDataSource
        name: GCP_DATA_SOURCE
    

    替换以下值:

    • PVC_NAME:您要将数据传输到的 PersistentVolumeClaim 的名称。PersistentVolumeClaim 必须由 Parallelstore 实例提供支持。
    • NAMESPACE:工作负载将运行的命名空间。命名空间值应与您的工作负载命名空间相同。
    • GCP_DATA_SOURCE:用于存储对 Cloud Storage 存储桶的引用的 GCPDataSource CRD 的名称。如需了解详情,请参阅 GCPDataSource CRD 参考文档
  2. 运行以下命令以创建 PersistentVolumeClaim:

    kubectl apply -f volume-populator-pvc.yaml
    

在 PersistentVolumeClaim 预配完成之前,GKE 不会调度工作负载 Pod。如需查看数据传输进度,请参阅查看数据传输进度。如果您在预配过程中遇到错误,请参阅问题排查

验证 PersistentVolumeClaim 预配是否已完成

GKE Volume Populator 会在 gke-managed-volumepopulator 命名空间中使用临时 PersistentVolumeClaim 进行卷预配。

临时 PersistentVolumeClaim 本质上是仍在传输(等待数据完全加载)的 PersistentVolumeClaim 的快照。其名称的格式为 prime-YOUR_PVC_UID

如需查看其状态,请执行以下操作:

  1. 运行以下命令:

    PVC_UID=$(kubectl get pvc PVC_NAME -n NAMESPACE -o yaml | grep uid | awk '{print $2}')
    
    TEMP_PVC=prime-$PVC_UID
    
    echo $TEMP_PVC
    
    kubectl describe pvc ${TEMP_PVC?} -n gke-managed-volumepopulator
    

    如果输出为空,则表示未创建临时 PersistentVolumeClaim。在这种情况下,请参阅问题排查部分。

    如果配置成功,则输出类似于以下内容。查找 ProvisioningSucceeded 日志:

    Warning  ProvisioningFailed     9m12s                   parallelstore.csi.storage.gke.io_gke-10fedd76bae2494db688-2237-793f-vm_5f284e53-b25c-46bb-b231-49e894cbba6c  failed to provision volume with StorageClass "parallelstore-class": rpc error: code = DeadlineExceeded desc = context deadline exceeded
    Warning  ProvisioningFailed     3m41s (x11 over 9m11s)  parallelstore.csi.storage.gke.io_gke-10fedd76bae2494db688-2237-793f-vm_5f284e53-b25c-46bb-b231-49e894cbba6c  failed to provision volume with StorageClass "parallelstore-class": rpc error: code = DeadlineExceeded desc = Volume pvc-808e41a4-b688-4afe-9131-162fe5d672ec not ready, current state: CREATING
    Normal   ExternalProvisioning   3m10s (x43 over 13m)    persistentvolume-controller                                                                                  Waiting for a volume to be created either by the external provisioner 'parallelstore.csi.storage.gke.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
    Normal  Provisioning  8s (x13 over 10m)  "xxx"  External provisioner is provisioning volume for claim "xxx"
    Normal  ProvisioningSucceeded  7s  "xxx"  Successfully provisioned volume "xxx"
    
  2. 检查 Parallelstore 实例创建是否已开始。

    gcloud beta parallelstore instances list \
        --project=PROJECT_ID \
        --location=-
    

    输出类似于以下内容:请确认您的音量处于 CREATING 状态。Parallelstore 实例创建完成后,状态将更改为 ACTIVE

    "projects/PROJECT_ID/locations/<my-location>/<my-volume>"  12000  2024-10-09T17:59:42.582857261Z  2024-10-09T17:59:42.582857261Z  CREATING  projects/PROJECT_ID/global/NETWORK_NAME
    

如果预配失败,请参阅 Parallelstore 问题排查指南,获取更多指导。

(可选)查看数据传输进度

本部分介绍了如何跟踪从 Cloud Storage 存储桶到 Parallelstore 卷的数据传输进度。这样做可以监控转移状态,并确保数据成功复制。如果 PersistentVolumeClaim 绑定操作花费的时间过长,您也应运行此命令。

  1. 通过运行以下命令来验证 PersistentVolumeClaim 的状态:

    kubectl describe pvc PVC_NAME -n NAMESPACE
    
  2. 查看 PersistentVolumeClaim 事件消息,了解数据传输进度。GKE 大约每分钟记录一次消息。输出类似于以下内容:

    Reason                          Message
    ------                          -------
    PopulateOperationStartSuccess   Populate operation started
    PopulateOperationStartSuccess   Populate operation started
    Provisioning                    External provisioner is provisioning volume for claim "my-namespace/my-pvc"
    Provisioning                    Assuming an external populator will provision the volume
    ExternalProvisioning            Waiting for a volume to be created either by the external provisioner 'parallelstore.csi.storage.gke.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
    PopulateOperationStartSuccess   Populate operation started
    PopulatorPVCCreationProgress    objects found 7, objects copied 7, objects skipped 0. bytes found 1000020010, bytes copied 1000020010, bytes skipped 0
    PopulateOperationFinished       Populate operation finished
    PopulatorFinished               Populator finished
    

填充操作可能需要一些时间才能开始;此操作取决于文件大小。如果您在几分钟后没有看到任何数据传输进度,请参阅问题排查部分。

创建使用该卷的工作负载

本部分展示了如何创建使用您之前创建的 PersistentVolumeClaim 资源的 Pod 的示例。

  1. 将以下 Pod 的 YAML 清单另存为 pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
      namespace: NAMESPACE
    spec:
      volumes:
      - name: parallelstore-volume
        persistentVolumeClaim:
          claimName: PVC_NAME
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: parallelstore-volume
          mountPath: /mnt/data
    

    替换以下值:

    • POD_NAME:运行工作负载的 Pod 的名称。
    • NAMESPACE:工作负载将运行的命名空间。命名空间值应与您的工作负载命名空间相同。
    • PVC_NAME:您要将数据传输到的 PersistentVolumeClaim 的名称。PersistentVolumeClaim 必须由 Parallelstore 实例提供支持。
  2. 运行以下命令以将该清单应用于集群:

    kubectl apply -f pod.yaml
    
  3. 检查 pod 的状态,并等待状态变为 RUNNING。您的 PersistentVolumeClaim 应先绑定,然后工作负载才能运行。

    kubectl describe pod POD_NAME -n NAMESPACE
    
  4. 验证文件是否已成功传输,以及您的工作负载是否可以访问这些文件。

    kubectl exec -it POD_NAME -n NAMESPACE -c nginx -- /bin/sh
    

    切换到 /mnt/data 目录并运行 ls

    cd /mnt/data
    ls
    

    输出应列出 Cloud Storage 存储桶 URI 中存在的所有文件。

在动态预配期间删除 PersistentVolumeClaim

如果您需要在动态预配期间删除 PersistentVolumeClaim,而数据仍在传输,则有两种方法可供选择:正常删除和强制删除。

优雅删除所需的工作量较少,但可能需要更多时间,并且无法考虑导致数据传输无法完成的用户错误配置。强制删除是一种更快捷的替代方法,可提供更大的灵活性和控制力;当您需要快速重启或更正错误配置时,此选项非常适用。

优雅删除

使用此删除选项可确保在 GKE 删除关联的资源之前完成数据传输流程。

  1. 运行以下命令删除工作负载 Pod(如果存在):

    kubectl delete pod POD_NAME -n NAMESPACE
    
  2. 查找临时 PersistentVolumeClaim 的名称:

    PVC_UID=$(kubectl get pvc PVC_NAME -n NAMESPACE -o yaml | grep uid | awk '{print $2}')
    TEMP_PVC=prime-$PVC_UID
    
    echo $TEMP_PVC
    
  3. 查找 PersistentVolume 的名称:

    PV_NAME=$(kubectl describe pvc ${TEMP_PVC?} -n gke-managed-volumepopulator | grep "Volume:" | awk '{print $2}')
    
    echo ${PV_NAME?}
    

    如果输出为空,则表示尚未创建 PersistentVolume。

  4. 运行以下命令以删除 PersistentVolumeClaim。终结器会阻止您的删除操作。按 Ctrl+C,然后继续执行下一步。

    kubectl delete pvc PVC_NAME -n NAMESPACE
    

    等待数据传输完成。GKE 最终会删除 PersistentVolumeClaim、PersistentVolume 和 Parallelstore 实例。

  5. 检查临时 PersistentVolumeClaim、PersistentVolumeClaim 和 PersistentVolume 资源是否已删除:

    kubectl get pvc,pv -A | grep -E "${TEMP_PVC?}|PVC_NAME|${PV_NAME?}"
    
  6. 检查 Parallelstore 实例是否已删除。Parallelstore 实例将与 PersistentVolume 共用相同的名称。如果您在第 3 步中确认未创建 PersistentVolume,则无需运行此命令。

    gcloud beta parallelstore instances list \
        --project=PROJECT_ID \
        --location=- | grep ${PV_NAME?}
    

强制删除

如果您需要在数据传输流程完成之前删除 PersistentVolumeClaim 及其关联的资源,请使用此删除选项。如果数据传输花费的时间过长或遇到错误,或者您需要快速回收资源,则可能需要这样做。

  1. 删除工作负载 Pod(如果存在):

    kubectl delete pod POD_NAME -n NAMESPACE
    
  2. PersistentVolume 回收政策更新为 Delete。这样可确保在关联的 PersistentVolumeClaim 被删除时,PersistentVolume 及其底层存储也会自动删除。

    如果存在以下任一情况,请跳过以下命令:

    • 您不想删除 PersistentVolume 或底层存储空间。
    • 您当前的回收政策为 Retain,并且您希望保留底层存储空间。根据需要手动清理 PersistentVolume 和存储实例。
    • 以下 echo $PV_NAME 命令会输出一个空字符串,这表示 PersistentVolume 尚未创建。
    PV_NAME=$(kubectl describe pvc $TEMP_PVC -n gke-managed-volumepopulator | grep "Volume:" | awk '{print $2}')
    
    echo $PV_NAME
    
    kubectl patch pv $PV_NAME -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
    
  3. 查找临时 PersistentVolumeClaim 的名称,并设置环境变量以供后续步骤使用:

    PVC_UID=$(kubectl get pvc PVC_NAME -n NAMESPACE -o yaml | grep uid | awk '{print $2}')
    
    TEMP_PVC=prime-$PVC_UID
    
    echo $TEMP_PVC
    
  4. 运行以下命令以删除 PersistentVolumeClaim。终结器将阻止您的删除操作。按 Ctrl+C,然后继续执行下一步。

    kubectl delete pvc PVC_NAME -n NAMESPACE
    
  5. 从 PersistentVolumeClaim 中移除 datalayer.gke.io/populate-target-protection 终结器。删除 PersistentVolumeClaim 后,需要执行此步骤,否则 gke-volume-populator 会将终结器重新添加到 PersistentVolumeClaim。

    kubectl get pvc PVC_NAME -n NAMESPACE -o=json | \
    jq '.metadata.finalizers = null' | kubectl apply -f -
    
  6. 删除 gke-managed-volumepopulator 命名空间中的临时 PersistentVolumeClaim。

    kubectl delete pvc $TEMP_PVC -n gke-managed-volumepopulator
    
  7. 检查临时 PersistentVolumeClaim、PersistentVolumeClaim 和 PersistentVolume 资源是否已删除:

    kubectl get pvc,pv -A | grep -E "${TEMP_PVC?}|PVC_NAME|${PV_NAME?}"
    
  8. 检查 Parallelstore 实例是否已删除。Parallelstore 实例将与 PersistentVolume 共用相同的名称。如果您在第 2 步中确认未创建 PersistentVolume,则无需运行此命令。

    gcloud beta parallelstore instances list \
        --project=PROJECT_ID \
        --location=- | grep ${PV_NAME?}
    

问题排查

本部分介绍如何解决与 GKE 卷填充程序相关的问题。

在继续操作之前,请运行以下命令检查 PersistentVolumeClaim 事件警告:

kubectl describe pvc PVC_NAME -n NAMESPACE

错误:An internal error has occurred

如果您遇到以下错误,则表示 Parallelstore API 内部发生了错误。

Warning
PopulateOperationStartError
gkevolumepopulator-populator                                                            Failed to start populate operation: populate data for PVC "xxx". Import data failed, error: rpc error: code = Internal desc = An internal error has occurred ("xxx")

如需解决此问题,您需要按照以下步骤为支持团队收集数据:

  1. 运行以下命令以获取临时 PersistentVolumeClaim 的名称,将占位符替换为实际名称:

    PVC_UID=$(kubectl get pvc PVC_NAME -n NAMESPACE -o yaml | grep uid | awk '{print $2}')
    
    TEMP_PVC=prime-${PVC_UID?}
    
    echo ${TEMP_PVC?}
    
  2. 运行以下命令以获取卷名称:

    PV_NAME=$(kubectl describe pvc ${TEMP_PVC?} -n gke-managed-volumepopulator | grep "Volume:" | awk '{print $2}')
    
  3. 请与支持团队联系,并提供错误消息、项目名称和卷名称。

权限问题

如果您在填充卷内容时遇到如下错误,则表示 GKE 遇到了权限问题:

  • Cloud Storage 存储桶不存在PopulateOperationStartErrorcode = PermissionDenied
  • 缺少对 Cloud Storage 存储桶或服务账号的权限PopulateOperationFailed"code: "xxx" message:"Verify if bucket "xxx" exists and grant access"
  • 找不到服务账号PopulateOperationStartErrorcode = Unauthenticated

如需解决这些问题,请仔细核查以下内容:

  • Cloud Storage 存储桶访问权限:验证存储桶是否存在,以及服务账号是否具有 roles/storage.objectViewer permission
  • 服务账号:确认 Kubernetes 服务账号和 IAM 服务账号均存在且已正确关联。
  • Parallelstore 服务账号:确保该账号存在且具有必要的权限(IAM 账号上的 roles/iam.serviceAccountTokenCreatorroles/iam.serviceAccountUser)。

如需了解详细步骤和验证命令,请参阅设置必要的权限。如果错误仍然存在,请与支持团队联系,并提供错误消息、项目名称和 Cloud Storage 存储桶名称。

参数无效错误

如果您遇到 InvalidArgument 错误,则表示您在 GCPDataSource 或 PersistentVolumeClaim 中提供的值可能不正确。错误日志会指出包含无效数据的确切字段。检查您的 Cloud Storage 存储桶 URI 和其他相关字段是否准确无误。

后续步骤