Могу ли я написать однострочную команду kubectl exec -it в модуль GKE через хост-бастион, используя gcloud Compute ssh?

Мы запускаем наше производственное приложение Rails на GKE, и нам требуется, чтобы весь производственный доступ проходил через хост Bastion.

Чтобы получить к нему доступ, я подключаюсь к хосту Bastion по SSH:

      gcloud compute ssh --project=myproject --zone=myzone bastion-vm

Как только он подключается, я получаю имя нужного модуля, запускаю его и запускаю интерактивную консоль Rails:

      kubectl --context=prod exec -it $(kubectl get pods -n mynamespace --no-headers -o custom-columns=":metadata.name" --selector="app=my-app") -n mynamespace -- /bin/sh -c '/berglas/bin/berglas exec -- bundle exec rails c'

Я хотел бы превратить это в однострочник, который я мог бы запускать из своего местного места, но у меня возникают трудности. Моя первая попытка:

      gcloud compute ssh --project=myproject --zone=usmyzone bastion-vm --command 'kubectl --context=prod exec -it $(kubectl get pods -n mynamespace --no-headers -o custom-columns=":metadata.name" --selector="app=my-app") -n mynamespace -- /bin/sh -c "/berglas/bin/berglas exec -- bundle exec rails c"'

Когда я это запустил, я получил обычный результат, который получаю при подключении к Бастиону:

      External IP address was not found; defaulting to using IAP tunneling.
WARNING: 

To increase the performance of the tunnel, consider installing NumPy. For instructions,
please see https://cloud.google.com/iap/docs/using-tcp-forwarding#increasing_the_tcp_upload_bandwidth

А потом он просто висел, пока я не нажал ControlC. Я подумал: «О, ладно, мне нужен интерактивный сеанс SSH». Итак, я просмотрел документацию gcloud и не нашел для этого какой-либо встроенной опции, но я увидел, что вы можете передавать флаги в базовый ssh, и поэтому попробовал--ssh-flag='-t':

      gcloud compute ssh --project=myproject --zone=usmyzone bastion-vm --ssh-flag='-t' --command 'kubectl --context=prod exec -it $(kubectl get pods -n mynamespace --no-headers -o custom-columns=":metadata.name" --selector="app=my-app") -n mynamespace -- /bin/sh -c "/berglas/bin/berglas exec -- bundle exec rails c"'

Соединение было выполнено, как и прежде, а затем я перешел в командную строку терминала на хосте-бастионе, как будто я не указывал команду. я добавил-vк флагам ssh и запустил его снова; это указывает на то, что он выполняет команду:

      debug1: Sending command: kubectl --context=prod exec $(kubectl get pods -n mynamespace --no-headers -o custom-columns=":metadata.name" --selector="app=my-app") -n mynamespace -- /bin/sh -c "/berglas/bin/berglas exec -- bundle exec rails c"

Это конец вывода перед приглашением оболочки на хосте Bastion. Я не вижу никаких других результатов или свидетельств, указывающих на то, что команда действительно выполнялась. Я провел несколько дополнительных экспериментов, указав такие вещи, какls,/bin/dashи даже такие вещи, которые должны вызывать ошибку, например/bin/fooкак команда. Ничего не меняется; Я просто всегда получаю приглашение оболочки без дальнейшего вывода (или, если я опускаю-t, всегда просто зависает).

Я должен представить, что есть способ добиться этого. Что мне не хватает?

Если это имеет значение, я использую macOS Monterey, и моя локальная оболочка — ZSH.

0 ответов

Другие вопросы по тегам