Gcloud - невозможно выделить несколько виртуальных машин с помощью одной учетной записи службы

Я использую Gcloud для запуска Prow (сервера непрерывной интеграции). Одна из моих задач создает виртуальную машину, выполняет несколько тестов, а затем удаляет этот экземпляр. Я использую сервисный аккаунт для создания ВМ, запуска тестов.

#!/bin/bash

set -o errexit

cleanup() {
    gcloud compute instances delete kyma-integration-test-${RANDOM_ID}
}


gcloud config set project ...
gcloud auth activate-service-account --key-file ...

gcloud compute instances create <vm_name> \
    --metadata enable-oslogin=TRUE \
    --image debian-9-stretch-v20181009 \
    --image-project debian-cloud --machine-type n1-standard-4 --boot-disk-size 20 \

trap cleanup exit

gcloud compute scp --strict-host-key-checking=no --quiet <script.sh> <vm_name>:~/<script.sh>

gcloud compute ssh --quiet <vm_name> -- ./<script.sh>

Через некоторое время я получил следующую ошибку:

ERROR: (gcloud.compute.scp) INVALID_ARGUMENT: Login profile size exceeds 32 KiB. Delete profile values to make additional space.

Действительно, для этой учетной записи службы команда describe возвращает много данных, например ~ 70 записей в разделе sshPublicKeys.

gcloud auth activate-service-account --key-file ... gcloud compute os-login describe-profile

Большинство этих открытых ключей относятся к уже удаленным экземплярам виртуальных машин. Как выполнить очистку этого списка? Или можно вообще не хранить эти открытые ключи?


person Adam Szecowka    schedule 06.11.2018    source источник
comment
Я бы не стал использовать scp для копирования файлов в экземпляр и не подключался бы с помощью ssh для запуска скрипта. Поместите файлы для своего экземпляра в облачное хранилище, а затем используйте сценарий запуска метаданных, чтобы загрузить файл (ы) и запустить свой сценарий.   -  person John Hanley    schedule 29.11.2018


Ответы (4)


Очень грубый способ сделать то же самое, что сработало для меня:

for i in $(gcloud compute os-login ssh-keys list); do echo $i; gcloud compute os-login ssh-keys remove --key $i; done

Я остановил это (с помощью Control-C) после удаления нескольких десятков ключей, и затем он снова заработал.

На самом деле в метаданных проекта в графическом интерфейсе я не вижу много ключей. Только :

  • gke ... cidr: имя-сети ...
  • sshKeys: gke-e9 ...
  • Ключи SSH => peter_v: ssh-rsa мой открытый ключ
person peter_v    schedule 24.01.2019
comment
Спасибо, эта команда отлично работала с gcloud version Google Cloud SDK 331.0.0 alpha 2021.03.05 beta 2021.03.05 bq 2.0.65 core 2021.03.05 gsutil 4.59 - person Fabrice Jammes; 23.04.2021

Эти ключи хранятся в метаданных проекта, которые вы можете удалите их, удалив через пользовательский интерфейс консоли Google.

person Alioua    schedule 11.11.2018

Увидев, что вы упомянули вход в ОС в своем вопросе: есть способ удалить определенные ключи SSH из профиля пользователя с помощью эту команду. В качестве альтернативы, вместо выполнения SCP, я бы посоветовал вам, как и Джон Хэнли, поместить файл, который вы копируете, в экземпляр в хранилище и получить его с помощью сценария запуска (вы также можете использовать пользовательский образ Compute).

person Lopson    schedule 22.01.2019

Постоянное решение - использовать --ssh-key-expire-after 30s. Вам все равно нужно очистить существующие ключи с помощью описанных выше решений или еще немного команды kungfu, подобной этой (без grep).

for i in $(gcloud compute os-login ssh-keys list --format="table[no-heading](value.fingerprint)"); do 
  echo $i; 
  gcloud compute os-login ssh-keys remove --key $i || true; 
done

ПРИМЕЧАНИЕ: вы должны использовать неправильную учетную запись. gcloud config account activate ACCOUNT и / или gcloud auth activate-service-account --key-file=FILE или gcloud auth login

Нужен новый ключ ssh в скрипте:

# KEYNAME should be something like $HOME/.ssh/google_compute_engine
ssh-keygen -t rsa -N "" -f "${KEYNAME}" -C "${USERNAME}" || true
chmod 400 ${KEYNAME}*

cat > ssh-keys <<EOF
${USERNAME}:$(cat ${KEYNAME}.pub)
EOF

Тестирование этого решения:

while :; do
  [email protected]
  KEYNAME=~/.ssh/google_compute_engine
  rm -f ~/.ssh/google_compute_engine*
  ssh-keygen -t rsa -N "" -f "${KEYNAME}" -C "${USERNAME}" || true
  chmod 400 ${KEYNAME}*
  cat > ssh-keys <<EOF
  ${USERNAME}:$(cat ${KEYNAME}.pub)
EOF
  gcloud --project=test-project compute ssh --ssh-key-expire-after 30s one-bastion-to-rule-them-all -- date
  gcloud --project=test-project compute os-login ssh-keys list --format="table[no-heading](value.fingerprint)" \
    |wc -l
done
person Jeremiah    schedule 26.05.2021