在 GKE 中使用独立 'gsutil'

Using standalone 'gsutil' from within GKE

我正在尝试在 GKE 集群的容器 运行 中使用独立的 gsutil 工具,但我无法让它工作。我相信集群有足够的权限(见下文)。但是,运行

./gsutil ls gs://my-bucket/

产量

ServiceException: 401 Anonymous users does not have storage.objects.list access to bucket my-bucket.

我错过了什么吗?我没有 .boto 文件,因为我认为没有必要——或者是吗?这是集群和节点池具有的范围列表:

- https://www.googleapis.com/auth/compute
- https://www.googleapis.com/auth/devstorage.full_control
- https://www.googleapis.com/auth/logging.write
- https://www.googleapis.com/auth/monitoring.write
- https://www.googleapis.com/auth/pubsub
- https://www.googleapis.com/auth/servicecontrol
- https://www.googleapis.com/auth/service.management.readonly
- https://www.googleapis.com/auth/trace.append

简答:
是的,您需要 一些 类型的 boto 文件。

长答案:
通常,对于 GCE 实例,您不需要 ~/.boto 文件,因为 /etc/boto.cfg 文件已经存在——GSUtil 使用的 Boto 库知道默认查找它。在 Debian 映像上,它包含这些行:

# This file is automatically created at boot time by the /usr/lib/python
# 2.7/dist-packages/google_compute_engine/boto/boto_config.pyc script.
# Do not edit this file directly. If you need to add items to this file,
# create or edit /etc/boto.cfg.template instead and then re-run the
# script.

[GSUtil]
default_project_id = <PROJECT NUMBER HERE>
default_api_version = 2

[GoogleCompute]
service_account = default

[Plugin]
plugin_directory = /usr/lib/python2.7/dist-packages/google_compute_engine/boto

如果你想在你的 GKE 容器上模仿这种行为,你必须安装 google-compute-engine python 包,以及一个告诉 gsutil 加载它的 boto 文件插件从安装到的位置,如上所示。在 GCE 上(我假设 GKE 也是如此,虽然我没有测试过),这个插件允许 VM 与其元数据服务器对话以获取指定服务帐户的凭据。

您可以使用 service account 或您自己的凭据在 GKE 上的 docker 容器内使用 gsutil。

服务帐号

1)service-account.json 文件添加到您的项目中。

2).boto 文件添加到指向 service-account.json 文件的项目中:

[Credentials]
gs_service_key_file = /path/to/service-account.json

3) 在您的 Dockerfile 中,将 BOTO_CONFIG 环境变量设置为指向此 .boto 文件:

ENV BOTO_CONFIG=/path/to/.boto


自己的凭证

1) 在本地,运行 gcloud auth 登录。将在 ~/.config/gcloud/legacy_credentials/your@account.com/.boto 处创建一个 .boto 文件,其结构如下:

[OAuth2]
client_id = <id>.apps.googleusercontent.com
client_secret = <secret>

[Credentials]
gs_oauth2_refresh_token = <token>

2) 将此 .boto 文件复制到您的项目中

3) 在您的 Dockerfile 中,将 BOTO_CONFIG 环境变量设置为指向此 .boto 文件:

ENV BOTO_CONFIG=/path/to/.boto


我使用 pip install gsutil

在 docker 容器中安装了独立的 gsutil