Могу ли я написать однострочную команду 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.