# #ssh #google-kubernetes-engine #bitbucket-pipelines #ssh-tunnel
Вопрос:
У нас есть два частных кластера GKE, доступ к которым возможен только через ssh-прокси.
В местных условиях это работает следующим образом:
- Откройте ssh — соединение с перенаправлением порта 8888 на хост бастиона
gcloud compute ssh dev-cluster-bastion --project client-dev --zone xxxx -- -L 8888:127.0.0.1:8888
- На другой сессии
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 и т. Д.) — это:
- Создайте учетную запись службы и перейдите по этой ссылке для создания учетной записи службы.
- Создайте файл ключа для этой учетной записи службы и загрузите его. Пожалуйста, перейдите по ссылке для создания файла.
- Предоставьте этой учетной записи необходимые разрешения IAM, чтобы она могла подключиться по SSH к хосту Бастиона
- Сделайте файл ключа безопасным для среды конвейера (большинство систем CI/CD позволяют шифровать секретные файлы или конфиденциальные переменные среды).
- В конвейере используйте
gcloud auth activate-service-account --key-file=...
, чтобыgcloud
использовать учетную запись службы - Теперь запустите
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. К сожалению, ваши решения не работают