在kubernetes引擎中将数据从docker容器存储到GCS中时,得到 "权限不足 "的错误信息。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在kubernetes引擎中将数据从docker容器存储到GCS中时,得到 "权限不足 "的错误信息。相关的知识,希望对你有一定的参考价值。

我已经配置了gcloud的项目,服务账户和其他配置。启用google api并在GKE集群上运行应用程序。

我得到以下错误日志。

Exception in thread "Thread-10" com.google.cloud.storage.StorageException: Insufficient Permission
    at com.google.cloud.storage.spi.v1.HttpStorageRpc.translate(HttpStorageRpc.java:227)
    at com.google.cloud.storage.spi.v1.HttpStorageRpc.create(HttpStorageRpc.java:308)
    at com.google.cloud.storage.StorageImpl$3.call(StorageImpl.java:203)
    at com.google.cloud.storage.StorageImpl$3.call(StorageImpl.java:200)
    at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:105)
    at com.google.cloud.RetryHelper.run(RetryHelper.java:76)
    at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:50)
    at com.google.cloud.storage.StorageImpl.internalCreate(StorageImpl.java:199)
    at com.google.cloud.storage.StorageImpl.create(StorageImpl.java:161)
    at java.lang.Thread.run(Thread.java:748)
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
POST https://storage.googleapis.com/upload/storage/v1/b/my-bucket/o?projection=full&uploadType=multipart

  "code" : 403,
  "errors" : [ 
    "domain" : "global",
    "message" : "Insufficient Permission",
    "reason" : "insufficientPermissions"
   ],
  "message" : "Insufficient Permission"

    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:150)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:555)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:475)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:592)
    at com.google.cloud.storage.spi.v1.HttpStorageRpc.create(HttpStorageRpc.java:305)
    ... 12 more
答案

IIUC,看看这个。

https:/cloud.google.comkubernetes-enginedocstutorialsauthenticating-to-cloud-platform。

你需要创建一个代表GCP服务账户凭证的Kubernetes(!)秘密。

然后,您需要将该秘密卷装到需要使用该秘密的容器中,并设置为 GOOGLE_APPLICATION_CREDENTIALS 引用容器环境中的帐户。

另一答案

这不是一个与 rbac 相关的错误。你只是没有访问GCS的权限。 可能是作用域的问题?去任何节点,并检查你的节点是否有GCS范围。 - suren 5月15日 18:20

看起来@suren是对的,很可能是与GCS作用域有关的问题,因为...... 403错误 可能与授权问题有关。你可以通过在特定的计算引擎虚拟机上运行来检查它所设置的作用域,它将从元数据服务器上检索这些信息。

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/?recursive=true" -H "Metadata-Flavor: Google"

它将从元数据服务器中检索这些信息。storage-ro 范围,因为它是默认设置。

"scopes":["https://www.googleapis.com/auth/devstorage.read_only"

你可以看到 此处,您需要设置。

storage-rw  https://www.googleapis.com/auth/devstorage.read_write

在计算引擎实例上,可以按照以下方式进行设置。

$ gcloud beta compute instances set-scopes example-instance \
      --scopes=storage-rw --zone=us-central1-b \
      --service-account=example-account

不过这需要关闭实例,才能对服务账户进行更改。否则你会得到以下错误信息。

ERROR: (gcloud.beta.compute.instances.set-scopes) Could not fetch resource:
 - The instance must be stopped before the service account can be changed.

但当使用 GKE 您不能简单地停止单个工作节点,因为它是受管实例组的一部分。

然而,您可以设置作用域 创建新的GKE集群时 如:像这样。

gcloud container clusters create test --scopes=storage-rw --service-account default --zone europe-west3-c

以上是关于在kubernetes引擎中将数据从docker容器存储到GCS中时,得到 "权限不足 "的错误信息。的主要内容,如果未能解决你的问题,请参考以下文章

Docker从入门到初步掌握

Docker SwarmScale 扩(缩)容服务

Docker集群管理工具-Kubernetes部署记录

基于kubernetes构建Docker集群管理详解-转

如何通过科学的方式对 Docker 进行故障检测和排除?

IDC《2019容器技术及其应用发展白皮书》:让企业从“容”上云