配置 gsutil 以在 pod 内使用 kubernetes 服务帐户凭据

Posted

技术标签:

【中文标题】配置 gsutil 以在 pod 内使用 kubernetes 服务帐户凭据【英文标题】:Configure gsutil to use kubernetes service account credentials inside of pod 【发布时间】:2019-03-13 14:01:13 【问题描述】:

我有一个执行一些备份作业的 kubernetes Cronjob,备份文件需要上传到存储桶。 pod 在 /var/run/secrets/kubernetes.io/serviceaccount 的 pod 中安装了服务帐户凭据,但是我如何指示 gsutil 使用 /var/run/secrets/kubernetes.io/ 中的凭据服务帐户?

lrwxrwxrwx 1 root root   12 Oct  8 20:56 token -> ..data/token
lrwxrwxrwx 1 root root   16 Oct  8 20:56 namespace -> ..data/namespace
lrwxrwxrwx 1 root root   13 Oct  8 20:56 ca.crt -> ..data/ca.crt
lrwxrwxrwx 1 root root   31 Oct  8 20:56 ..data -> ..2018_10_08_20_56_04.686748281
drwxr-xr-x 2 root root  100 Oct  8 20:56 ..2018_10_08_20_56_04.686748281
drwxrwxrwt 3 root root  140 Oct  8 20:56 .
drwxr-xr-x 3 root root 4096 Oct  8 20:57 ..

【问题讨论】:

【参考方案1】:

简短的回答是,那里的令牌不是 gsutil 知道如何使用的格式,所以你不能使用它。您需要一个 JSON 密钥文件,如教程中所述(但您将无法使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量):

https://cloud.google.com/kubernetes-engine/docs/tutorials/authenticating-to-cloud-platform

Gsutil 不是从 GOOGLE_APPLICATION_CREDENTIALS 环境变量中读取,而是使用 Boto 配置文件来加载凭据。它知道查找这些 Boto 配置文件的常见位置是 /etc/boto.cfg$HOME/.boto。请注意,后一个值会根据运行命令的用户而变化($HOME 针对不同的用户扩展为不同的值);由于 cron 作业通常以与设置配置文件的用户不同的用户身份运行,因此我不建议依赖此路径。

因此,在您的 pod 上,您需要首先创建一个引用密钥文件的 Boto 配置文件:

# This option is only necessary if you're running an installation of
# gsutil that came bundled with gcloud. It tells gcloud that you'll be
# managing credentials manually via your own Boto config files.

$ gcloud config set pass_credentials_to_gsutil False


# Set up your boto file at /path/to/my/boto.cfg - the setup will prompt
# you to supply the /path/to/your/keyfile.json.  Alternatively, to avoid
# interactive setup prompts, you could set up this config file beforehand
# and copy it to the pod.

$ gsutil config -e -o '/path/to/my/boto.cfg'

最后,无论何时运行 gsutil,都需要告诉它在哪里可以找到引用 JSON 密钥文件的 Boto 配置文件(并确保运行该命令的用户有权读取 Boto 配置文件和JSON 密钥文件)。如果您将 Boto 配置文件写入我上面提到的知名路径之一,gsutil 将尝试自动找到它;如果没有,您可以通过在为您的 cron 作业提供的命令中导出 BOTO_CONFIG 环境变量来告诉 gsutil 在哪里可以找到 Boto 配置文件:

export BOTO_CONFIG=/path/to/my/boto.cfg; /path/to/gsutil cp <src> <dst>

编辑

请注意,GCE VM 映像在 /etc/boto.cfg 中带有一个预填充的文件。此配置文件告诉 gsutil 加载一个插件,该插件允许 gsutil 以这种方式联系 GCE 元数据服务器并获取身份验证令牌(对应于该 VM 的 default 机器人服务帐户)。如果您的 pod 能够读取主机 VM 的 /etc/boto.cfg 文件,您就可以联系 GCE 元数据服务器,并且您可以通过 VM 的 default 服务帐户执行的操作,这个解决方案应该开箱即用。

【讨论】:

【参考方案2】:

请注意,您的 Kubernetes 服务帐户与您的 Google Cloud Storage 服务帐户不同。

gsutil 使用 boto 配置,因此您可以在 /etc/boto.cfg~/.boto 下挂载 Kubernetes 机密

您可以使用令牌或服务帐户向 GCP 进行身份验证。您可以使用gsutil config -f 生成令牌,也可以使用gsutil config -e 生成服务帐户凭据。它将生成一个~/.boto 文件,然后您可以将其作为 Kubernetes 机密挂载到您的 pod 上。

更多信息here。

【讨论】:

是的。我很清楚我正在混淆 Kubernetes 服务帐户和 Google Cloud 服务帐户。事实是,在没有任何配置的情况下,我成功地执行了 gsutil ls 并列出了所有 Google Cloud 项目存储桶。

以上是关于配置 gsutil 以在 pod 内使用 kubernetes 服务帐户凭据的主要内容,如果未能解决你的问题,请参考以下文章

k8s 如何使用kube-dns实现服务发现

podip网段不同servicename不通

千分尺暴露执行器指标 vs kube-state-metrics vs metrics-server 以设置 pod 请求/限制

如何在集群外部通过ip直连Pod?

如何在 prometheus 中获取最近 3 个月内运行的 pod

Prometheus 查询 Kubernetes pod 正常运行时间