#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-вещь. Еще раз спасибо за предложение.