【问题标题】:Getting "Permission denied" container.clusters.create when deployed but not on localhost部署时获取“权限被拒绝”container.clusters.create 但不在本地主机上
【发布时间】:2019-08-04 07:32:29
【问题描述】:

我正在尝试通过谷歌应用引擎上的 NodeJS 客户端创建一个 Kubernetes 集群。 Kubernetes 集群位于托管应用引擎项目的单独项目中,例如“my-node-project”和“my-k8-project”。

“my-node-project”拥有kubernetes项目的相关服务账号(Owner级访问权限)。

我使集群创建调用如下:

var client = new container.v1.ClusterManagerClient({
    projectId: projectId,
    key: serviceAccount
});

var zone = 'us-central1-b';

var password = "<some password>";

var clusterConfig = {
        "name": clusterName,
        "description": "api created cluster",
        "initialNodeCount": 3,
        "nodeConfig": {
                "oauthScopes": [
                    "https://www.googleapis.com/auth/compute",
                 "https://www.googleapis.com/auth/devstorage.read_only"
                ]
        }
        ,
        "masterAuth": {
            "username": "admin",
            "password": password
        },
        "zone": zone
    };

var request = {
projectId: projectId,
zone: zone,
cluster: clusterConfig,
};
return client.createCluster(request)
.then(responses => {
    var response = responses[0];
    console.log("response: ", response);
    return response;
})
.catch(err => {
    console.error(err);
    return err;
});

在上述代码中,serviceAccount 变量是一个包含服务帐户的 json 对象,包含所有私钥、项目 ID 字段等。

奇怪的是,当我在本地运行代码时,即调用运行上述函数的端点时,请求顺利通过,即创建了集群,我什至可以通过 api 添加工作负载。

但是,在我将 nodejs 项目部署到应用引擎标准并调用在应用引擎上运行的同一端点后,我收到错误:

Error: 7 PERMISSION_DENIED: Required "container.clusters.create" permission(s) for "projects/my-k8-project". See https://cloud.google.com/kubernetes-engine/docs/troubleshooting#gke_service_account_deleted for more info. at Object.exports.createStatusError (/srv/node_modules/grpc/src/common.js:91:15) at Object.onReceiveStatus (/srv/node_modules/grpc/src/client_interceptors.js:1204:28) at InterceptingListener._callNext (/srv/node_modules/grpc/src/client_interceptors.js:568:42) at InterceptingListener.onReceiveStatus (/srv/node_modules/grpc/src/client_interceptors.js:618:8) at callback (/srv/node_modules/grpc/src/client_interceptors.js:845:24) code: 7, metadata: Metadata { _internal_repr: {} }, details: 'Required "container.clusters.create" permission(s) for "projects/my-k8-project". See https://cloud.google.com/kubernetes-engine/docs/troubleshooting#gke_service_account_deleted for more info.' }

自从获得该故障排除链接后,我尝试创建一个新的服务帐户并使用它。此外,我尝试禁用和启用 kubernetes 和计算 API。我还尝试将服务帐户放在项目的根目录中,并以这种方式引用服务帐户。

不幸的是,我尝试的一切都导致完全相同的错误。但从 localhost 运行时仍然有效。

我缺少的地方是否有白名单?也许localhost默认被列入白名单,而“my-node-project”应用引擎项目不在名单上?

非常感谢任何提示、提示或指向正确方向。

【问题讨论】:

  • 你设置好你的GOOGLE_APPLICATION_CREDENTIALS了吗?
  • 我没有明确设置 GOOGLE_APPLICATION_CREDENTIALS,主要是因为我将更改服务帐户以在几个不同的项目上创建集群,在我的情况下,拥有一个服务帐户文件没有意义指向,我的意图是将其保留为 json 对象并动态提供给客户端。

标签: node.js kubernetes google-cloud-platform


【解决方案1】:

您还需要将服务帐户添加到您的“my-k8-project”作为成员并为其赋予相关角色。

在 Cloud Console 中,导航到项目“my-k8-project”。找到“IAM 和管理员”>“IAM”页面。单击“添加”按钮。在“新成员”字段中粘贴服务帐户的名称并为其赋予适当的角色。

【讨论】:

  • 感谢您的好建议,我试过了,但似乎没有什么不同。不过我会继续调查这条路线。我仍然不明白的是,为什么从 localhost 发送的服务帐户会设法创建一个集群,但从另一个域部署时却没有......尽管如此,它似乎是一个 IAM 的东西。再次感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
相关资源
最近更新 更多