如果多个 Pod 在同一个 GKE 节点 (VM) 上运行,则 GKE 上传到 GCS 失败错误 403:权限不足

问题描述

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

问题描述:

我在 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

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

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)