为啥@google-cloud/profiler 在 GKE 实例中运行时会抛出“permission_denied”错误?
Posted
技术标签:
【中文标题】为啥@google-cloud/profiler 在 GKE 实例中运行时会抛出“permission_denied”错误?【英文标题】:Why is @google-cloud/profiler throwing 'permission_denied' errors when running inside a GKE instance?为什么@google-cloud/profiler 在 GKE 实例中运行时会抛出“permission_denied”错误? 【发布时间】:2021-12-19 11:40:09 【问题描述】:我一直按照https://cloud.google.com/profiler/docs/profiling-nodejs#gke 上的说明进行操作 为我的 nodejs 应用程序使用 gcloud profiler:
我将RUN npm install @google-cloud/profiler
添加到我的 dockerfile 中。
我添加了
require('@google-cloud/profiler').start(
serviceContext:
service: 'your-service',
version: '1.0.1',
,
);
到我的 app.js 文件。
然后我在 GKE 集群上运行容器并收到以下错误:
@google-cloud/profiler 创建配置文件失败,等待 8.6 秒重试:错误:generic::permission_denied
根据我对文档的理解,在 gcloud 托管实例中运行代码时,我不需要显式身份验证或创建配置文件的权限。
错误本身并不是很有帮助,我在这里有点超出我的深度。
我已经尝试过使用--(autoprovisioning-)scopes "https://www.googleapis.com/auth/cloud-platform"
创建集群是否可以解决问题,但也没有运气。
有什么想法可能是这里的问题吗?
【问题讨论】:
【参考方案1】:您是正确的,文档表明您不需要凭据但我认为您需要(并且文档不完整)。
当应用程序(例如 Profiler)使用 Google 的应用程序默认凭据并在例如Compute Engine(App Engine、Cloud Run 等)能够从环境中获取 credentials automatically(在 GCP 上使用元数据服务;开发人员在本地使用将 GOOGLE_APPLICATION_CREDENTIALS
导出到密钥)。
在 GKE 上,我认为这不是正确的(除非 Google 在某处施展魔法)并且该应用将无法自动访问凭据除非你在 GKE 中代表他们。我认为(!?)您需要创建一个服务帐户并且:
或者创建一个Kubernetes Secret from the Service Account's key 或使用GKE's Workload Identity注意 Workload Identity 是一个简洁的功能,但它仅在您只打算使用 GKE(而不是其他一些 Kubernetes 实现)时才有用。
在继续之前,让我们看看其他人是否回复告诉我我错了。
我 wrote 关于使用当时称为 Stackdriver Profiler 的 GKE 部署应用程序。文章已过时,但它应该提供您需要做什么的大纲。
【讨论】:
正确的是,您的应用需要凭据才能访问 cloudprofiler.googleapis.com API。假设您没有为您的集群启用 Workload Identity(顺便说一下,我强烈建议您这样做),那么默认情况下 GKE 上的任何应用程序都将尝试使用默认的 Compute Engine 服务帐户 (cloud.google.com/compute/docs/access/…) 来访问 Google Cloud API .作为快速测试,您可以确保此帐户有权访问 cloudprofiler.googleapis.com API。 @DazWilkin 您的中篇文章解决了这个问题。谢谢 我很高兴听到这个消息!以上是关于为啥@google-cloud/profiler 在 GKE 实例中运行时会抛出“permission_denied”错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 glTranslatef?为啥不直接更改渲染坐标?
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?