0

首先,我想强调的是,这不是(例如)这个的重复。

问题描述:

我在 GKE 集群上运行 Kubeflow Pipelines(在 GCP AI Platform Pipelines 上设置)。每个管道由几个组件组成(即 docker 容器 / 即 Pods)。如果我强制每个节点只能有一个运行 Pod,那么一切都会按预期工作,并且文件可以从该节点上传到目标 gcs 存储桶。在我的结论中,首先不应该存在许可问题,对吧?

但是,当多个 Pod (>1) 在池中的同一节点上运行以并行化管道执行并实现最佳资源使用时,会发生错误:

google.api_core.exceptions.Forbidden: 403 POST 
https://storage.googleapis.com/upload/storage/v1/b/my_bucket/o?uploadType=resumable
: {
  "error": {
    "code": 403,
    "message": "Insufficient Permission",
    "errors": [
      {
        "message": "Insufficient Permission",
        "domain": "global",
        "reason": "insufficientPermissions"
      }
    ]
  }
}
: ('Request failed with status code', 403, 'Expected one of', <HTTPStatus.OK: 200>, <HTTPStatus.CREATED: 201>)

另外,值得一提的是,以前失败的上传到 GCS 的大部分时间都会成功,当我只是克隆失败的管道运行并重新启动它时。这可能是因为在新运行的同一节点上没有其他(冲突的)Pod。

我正在将文件从 VM(集群节点)上传到谷歌云存储桶,如下所示:

src_file = 'my_sourcefile_in_this_docker_container'
bucket_name = 'my_buckname'
gcs_target_path = 'my_gcs_path'

GCS_CLIENT = storage.Client()
gcs_bucket = GCS_CLIENT.bucket(bucket_name)
gcs_bucket.blob(gcs_target_path).upload_from_filename(src_file, timeout=300)

错误并不总是发生在同一个管道(即组件)中,而是某种随机发生的。我碰巧在尝试上传文件时容器或它们创建的 storage.Client() 连接之间可能存在一些冲突,但我可能在这里错了或遗漏了一些东西。

到目前为止我为解决这个问题所做的尝试(不幸的是没有成功):

  • 我用重试策略修饰了我的上传函数代码,该策略会触发多次调用上传函数,同时以指数方式将退避时间增加到 2 分钟,最多 20 次试验
  • 在上传文件之前,我会删除存储桶中的目标文件,以防它已经存在
  • 我创建了在其上执行管道的工作节点池,并设置了对存储的完全权限:
gcloud container node-pools create kfp-worker-pool \
--cluster=$KFP_CLUSTER_NAME \
--zone=$COMPUTE_ZONE \
--machine-type=$MACHINE_TYPE \
--scopes=cloud-platform,storage-full \
--num-nodes=$NUM_NODES

我还没有尝试过,因为我认为它不是很有希望,而且我的时间不多了:

  • 我没有按照这里的建议重新创建集群,因为我每次开始管道执行之前都在重新创建用于管道执行的节点池(不是默认池,它是单独的)(也没有权限问题,当我一次以每个节点一个 Pod 的方式运行管道)

我非常感谢任何解决方案,甚至是如何进一步调查该问题的想法。谢谢你的帮助。

4

0 回答 0