配置 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 服务帐户凭据的主要内容,如果未能解决你的问题,请参考以下文章
千分尺暴露执行器指标 vs kube-state-metrics vs metrics-server 以设置 pod 请求/限制