Google Cloud Kubernetes没有正确读取应用程序凭据

2024-04-24 11:13:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用googlekubernetes引擎托管一个应用程序。我的docker镜像在本地运行时可以工作,但是当我把它放到Google云上并使用kubernetes集群设置它时,它会以一种非常奇怪的方式失败。在

我能够连接到应用程序,并且它一直工作,直到我触发一个google.cloud.storage.Client()的调用。然后它试图读取我通过GOOGLE_APPLICATION_CREDENTIALS环境变量提供的文件,但出现了问题。我得到了这个(删节和修订)回溯:

self.gcs_client = storage.Client()
  File "/usr/local/lib/python3.6/site-packages/google/cloud/storage/client.py", line 71, in __init__
    _http=_http)
  File "/usr/local/lib/python3.6/site-packages/google/cloud/client.py", line 215, in __init__
    _ClientProjectMixin.__init__(self, project=project)
  File "/usr/local/lib/python3.6/site-packages/google/cloud/client.py", line 169, in __init__
    project = self._determine_default(project)
  File "/usr/local/lib/python3.6/site-packages/google/cloud/client.py", line 182, in _determine_default
    return _determine_default_project(project)
  File "/usr/local/lib/python3.6/site-packages/google/cloud/_helpers.py", line 179, in _determine_default_project
    _, project = google.auth.default()
  File "/usr/local/lib/python3.6/site-packages/google/auth/_default.py", line 294, in default
    credentials, project_id = checker()
  File "/usr/local/lib/python3.6/site-packages/google/auth/_default.py", line 165, in _get_explicit_environ_credentials
    os.environ[environment_vars.CREDENTIALS])
  File "/usr/local/lib/python3.6/site-packages/google/auth/_default.py", line 89, in _load_credentials_from_file
    'File {} was not found.'.format(filename))
google.auth.exceptions.DefaultCredentialsError: File {--redacted--} was not found.

我编辑的是包含我服务帐户私钥的JSON。当docker容器在云端运行时,我检查了它,GOOGLE_APPLICATION_CREDENTIALS按预期设置为一个文件名。不知何故,当我的docker容器在云上运行时,它使用引用文件的内容作为文件名,而不是使用环境变量作为文件名。浏览器控制台也会报告此错误,因此导航到应用程序的任何人都可以获取我的服务帐户凭据。在

有人能猜出这里出了什么问题吗?在

更新: 看来我已经开始工作了。我猜是因为我使用valueFrombokeh.yaml文件中设置了GOOGLE_APPLICATION_CREDENTIALS。这似乎将GOOGLE_APPLICATION_CREDENTIALS设置为bokeh.yaml的内容。这种格式似乎适用于教程代码中使用的pandas.io.gbq.read_gbq,但不是像我尝试的那样实例化{}。将GOOGLE_APPLICATION_CREDENTIALS指向像DazWilkin建议和Eric Guan这样的卷装入文件。在


Tags: inpyprojectdefaultcloudlibpackagesusr
1条回答
网友
1楼 · 发布于 2024-04-24 11:13:57

我注意到你没有提到使用库伯内特斯的秘密。我是这样做的。在

  1. 在本地计算机上使用kubectl创建机密。在
$ kubectl create secret generic gac-keys  from-file=<PATH_TO_SERVICE_ACCOUNT_FILE> 

这将创建一个名为gac-keys的秘密。它包含位于<PATH_TO_SERVICE_ACCOUNT_FILE>的json文件。如果要重命名json文件,可以这样做

from-file=new-file-name.json=<PATH_TO_SERVICE_ACCOUNT_FILE>

  1. 配置部署以使用机密。在
^{pr2}$

指定具有任意名称google-cloud-keys的卷,以便以后引用。这卷书与秘密有关。在容器规范中,将google-cloud-keys卷装入路径/var/secrets/google。这会将文件放在路径上,因此/var/secrets/google/new-file-name.json应该在运行时存在于容器中。然后指定一个名为GOOGLE_APPLICATION_CREDENTIALS的环境变量,该变量指向路径。现在你的客户端库可以通过google认证了。在

文档:https://kubernetes.io/docs/concepts/configuration/secret/

相关问题 更多 >