当前位置: 首页 > 知识库问答 >
问题:

Google Cloud Kubernetes无法正确读取应用程序凭据

谭俊
2023-03-14

我正在尝试托管一个使用谷歌Kubernetes引擎的应用程序。我的docker映像在本地运行时可以工作,但当我将其放到Google Cloud上并使用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.

有没有人能猜到这里出了什么问题?

更新:看起来我已经让它工作了。我猜测发生错误的原因是,我使用valuefrom设置google_application_credentials,就像在bokeh.yaml文件中一样。这似乎将Google_Application_Credentials设置为等于bokeh.yaml的内容。这种格式似乎适用于教程代码中使用的pandas.io.gbq.read_gbq,但不适用于实例化google.cloud.storage.client()。将google_application_credential指向一个卷挂载的文件,就像DazWilkin建议的和Eric Guan所展示的那样。

共有1个答案

秦光启
2023-03-14

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

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

这将创建一个名为gac-keys的秘密。它包含在 中找到的json文件。如果要重命名json文件,可以执行以下操作:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      volumes:
      - name: google-cloud-keys
        secret:
          secretName: gac-keys
      containers:
      - name: my-app
        image: us.gcr.io/my-app
        volumeMounts:
        - name: google-cloud-keys
          mountPath: /var/secrets/google
          readOnly: true
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/secrets/google/new-file-name.json

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

 类似资料:
  • 我创建了一个具有并发gcloud应用程序的Dialogflow代理。但是,当我尝试将它集成到Node.js后端时,它似乎访问了错误的应用程序默认凭据。 我可以确认它正在验证身份验证是否成功,因为当我运行以下代码时,它的控制台记录了正确的项目ID(diagnosistest-56e81): null 当我执行此操作时,会得到不同的错误消息:

  • 我的android应用程序没有正确构建和部署。当启动一个新实例时,它会将我的应用程序启动到我的物理移动设备上,并且我能够在Visual Studio中进行调试。但现在它不会将应用程序启动到移动设备,而且当我手动运行应用程序时,它也不会在Visual Studio中调试。这个项目有可移植的类,并且正在使用Xamarin.Forms。 我确实更改了对AndroidManifest.xml的构建操作。

  • 它说要使用以下命令: 在Google Shell中,我尝试了以下操作: 我知道命令指向的是正确的文件位置。如何成功验证应用程序默认凭据?

  • 我无法读取项目中作为bean从另一个项目注入的类中的application.properties值。我的项目正在使用另一个项目,该项目的类需要从application.properties中读取配置。Mine是一个maven项目和一个Spring Boot应用程序,在src/main/resources文件夹中有application.properties,这些属性值在其中定义。我错过了什么,它无

  • 我有一个cucumber测试: 这是一个测试,它不是在测试文件夹中定义的,而是一个seprate文件夹(作为源集,其他人创建了这个结构)。 源集(测试所在)的gradle配置如下: 看看gradle文件,有三件事, 有一个源集定义为 编译CLassPath, runTimeClassPath, srcDir已被定义为相同的 甚至resources.srcDir也在设置中(我有应用ymls) 我已经