为啥@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,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?