Используйте kubectl через ssh хост бастиона, выполняйте развертывание из конвейеров bitbucket

# #ssh #google-kubernetes-engine #bitbucket-pipelines #ssh-tunnel

Вопрос:

У нас есть два частных кластера GKE, доступ к которым возможен только через ssh-прокси.

В местных условиях это работает следующим образом:

  1. Откройте ssh — соединение с перенаправлением порта 8888 на хост бастиона
    gcloud compute ssh dev-cluster-bastion --project client-dev --zone xxxx -- -L 8888:127.0.0.1:8888
  2. На другой сессии
    HTTPS_PROXY=localhost:8888 kubectl get pods

Это возвращает список запущенных модулей.

Когда мы делаем это внутри конвейера bitbucket, ssh подключается, но затем закрывается, и kubectl вызов завершается неудачно. Сообщение от ssh-соединения выглядит так:

Pseudo-terminal will not be allocated because stdin is not a terminal

Так что портфорвард тоже закрыт.

Добавление -fN в запуск ssh не помогает, переадресация портов не работает.

gcloud compute ssh dev-cluster-bastion --project client-dev --zone xxxx -- -fN -L 8888:127.0.0.1:8888

затем ssh говорит мне client_loop: send disconnect: Connection reset by peer

Есть идеи, как открыть tcp-туннель порта 8888 внутри конвейера bitbucket, чтобы мы могли отправлять команды kubectl в кластер?

Ответ №1:

Рекомендуемый способ использования облачных API Google в неинтерактивных условиях (например, конвейеры Bitbucket, действия на GitHub и т. Д.) — это:

  1. Создайте учетную запись службы и перейдите по этой ссылке для создания учетной записи службы.
  2. Создайте файл ключа для этой учетной записи службы и загрузите его. Пожалуйста, перейдите по ссылке для создания файла.
  3. Предоставьте этой учетной записи необходимые разрешения IAM, чтобы она могла подключиться по SSH к хосту Бастиона
  4. Сделайте файл ключа безопасным для среды конвейера (большинство систем CI/CD позволяют шифровать секретные файлы или конфиденциальные переменные среды).
  5. В конвейере используйте gcloud auth activate-service-account --key-file=... , чтобы gcloud использовать учетную запись службы
  6. Теперь запустите gcloud compute ssh конвейер и используйте переадресацию портов SSH, как обычно.

Обратите внимание, что:

  • шаги 1.—4. выполняются только один раз;
  • шаги 5. и 6. являются частью конвейера и будут выполняться при каждом запуске конвейера
  • Единственное отличие заключается в наличии -fN флагов, которые выполняют SSH в фоновом режиме и не запускают никаких команд на удаленном хосте (т. Е. Выполняют только переадресацию портов).

Вы также можете обратиться к разделу Создание учетной записи службы и начать работу с Bitbucket-конвейером для получения дополнительной информации.

Ответ №2:

Для исправления этой ошибки псевдотерминал не будет выделен, поскольку stdin не является терминалом. выполните одно из следующих действий:

Ошибка произошла из-за того, что вы используете SSH с опцией single-t, когда стандартный ввод в процесс SSH не является TTY. SSH печатает это сообщение специально в этом случае, одно-t эквивалентно «да», в то время как два из них эквивалентны «сила запроса».

Если вы хотите, чтобы ваши удаленные команды выполнялись с помощью TTY, дважды укажите-t. Если вы делаете это, то в вашей команде вместо-t используйте-t-t или используйте -tt .

Чтобы исправить эту ошибку client_loop: отправить отключение: Сброс соединения одноранговым узлом, выполните следующие действия:

Вы должны посмотреть эти параметры на стороне клиента /etc/ssh/ssh_config
ServerAliveИнтервал
ServerAliveCountMax
Чтобы установить интервал в значение 60 и попробовать
ServerAliveИнтервал 60

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

1. Не уверен, что вы поняли проблему, я не хочу выполнять удаленные команды, мне просто нужно, чтобы работала переадресация порта 8888, поэтому kubectl команды отправляются удаленной цели.

2. К сожалению, ваши решения не работают