Получение «Отказано в разрешении» container.clusters.create при развертывании, но не на localhost

#node.js #kubernetes #google-cloud-platform

#node.js #kubernetes #google-облачная платформа

Вопрос:

Я пытаюсь создать кластер Kubernetes через клиент NodeJS в Google App engine. Кластер Kubernetes находится в отдельном проекте, где размещен проект app engine, скажем «my-node-project» и «my-k8-project».

«my-node-project» имеет соответствующую учетную запись службы (доступ на уровне владельца) для проекта kubernetes.

Я выполняю вызов cluster create следующим образом:

 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, содержащий учетную запись службы со всеми полями закрытого ключа, идентификатора проекта и т.д.

Странно то, что когда я запускаю код локально, т. Е. вызываю конечную точку, которая запускает вышеупомянутую функцию, запрос проходит просто отлично, т. Е. кластеры создаются, и я даже могу добавлять рабочие нагрузки через api.

Однако, после развертывания проекта nodejs в app engine standard и вызова той же конечной точки, запущенной в app engine, я получаю сообщение об ошибке:

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.' }

Поскольку я получил эту ссылку для устранения неполадок, я попытался создать новую учетную запись службы и использовать ее. Кроме того, я попытался отключить и включить оба API kubernetes и compute. Я также попытался поместить учетную запись службы в корневой каталог проекта и ссылаться на учетную запись службы таким образом.

К сожалению, все, что я пробовал, приводило к точно такой же ошибке. Но все еще работало при запуске с localhost.

Есть ли где-нибудь белый список, которого мне не хватает? Возможно, localhost включен в белый список по умолчанию, а проекта app engine «my-node-project» нет в списке?

Мы были бы очень признательны за любые советы, намеки или указание в правильном направлении.

Комментарии:

1. Вы настроили свои GOOGLE_APPLICATION_CREDENTIALS ?

2. Я явно не настраивал GOOGLE_APPLICATION_CREDENTIALS, в основном потому, что я буду менять учетную запись службы для создания кластеров в нескольких разных проектах, и в моем случае нет смысла указывать на файл учетной записи службы, мое намерение — сохранить его как объект json и динамически предоставлять его клиенту.

Ответ №1:

Вам также необходимо добавить учетную запись службы в свой «my-k8-project» в качестве участника и назначить ей соответствующую роль.

В облачной консоли перейдите к проекту «my-k8-project». Найдите страницу «IAM amp; admin» > «IAM». Нажмите кнопку «Добавить». В поле «Новые участники» вставьте имя учетной записи службы и присвоите ей соответствующую роль. введите описание изображения здесь

Комментарии:

1. Спасибо за отличное предложение, я попробовал это, и, похоже, это ничего не изменило. Однако я продолжу исследовать этот маршрут. Чего я все еще не понимаю, так это почему учетной записи службы, отправленной с localhost, удалось бы создать кластер, но при развертывании из другого домена этого не происходит… Тем не менее, это похоже на IAM-вещь. Еще раз спасибо за предложение.