Доступ к кластеру GKE Kubernetes вне кластера GKE с помощью client-go?

  • У меня есть несколько кластеров kubernetes, работающих на GKE (скажем, clusterA и clusterB)
  • Я хочу получить доступ к обоим этим кластерам с клиента-go в приложении, которое выполняется в одном из этих кластеров (например, доступ к clusterB из приложения, которое работает на clusterA)

В общем, для аутентификации с кластерами kubernetes из client-go я вижу, что у меня есть два варианта:

  • Конфигурация InCluster
  • или из конфигурационного файла kube

Таким образом, легко получить доступ к clusterA из clusterA, но не clusterB из clusterA.

Какие у меня варианты здесь? Кажется, я просто не могу пройти GOOGLE_APPLICATION_CREDENTIALS и надеюсь, что клиент-позаботится о себе.

Итак, мои мысли:

  • создать выделенную учетную запись службы IAM
  • создать конфигурацию kube с токенами для обоих кластеров, выполнив gcloud container clusters get-credentials clusterA а также gcloud container clusters get-credentials clusterB
  • используйте этот конфигурационный файл kube в клиенте через BuildConfigFromFlags на кластере А

Это правильный подход, или есть более простой способ? Я вижу, что токены имеют срок действия?

Обновить:

Кажется, я также могу использовать CLOUDSDK_CONTAINER_USE_CLIENT_CERTIFICATE=True gcloud beta container clusters get-credentials clusterB --zone, Который добавил бы сертификаты к Kube Conf, которые я мог бы использовать. Но AFAIK эти сертификаты не могут быть отозваны

1 ответ

Решение

client-go должен знать о:

  1. IP-адрес мастера кластера
  2. сертификат CA кластера

(Если вы используете GKE, вы можете увидеть эту информацию в $HOME/.kube/config, населенный gcloud container clusters get-credentials команда).

Я рекомендую вам либо:

  1. Иметь файл kubeconfig, который содержит эту информацию для кластеров A & B
  2. Используйте GKE API для получения этой информации для кластеров A и B ( пример здесь) (для этого вам понадобится служебная учетная запись, объяснено ниже.)

После того, как вы можете создать *rest.Config объект в client-go, client-go будет использовать плагин auth, указанный в файле kubeconfig (или его эквивалент в памяти, который вы создали). В gcp Плагин auth, он знает, как получить токен.

Затем создайте учетную запись службы Cloud IAM и назначьте ей роль "Разработчик контейнера". Загрузите его ключ.

Теперь у вас есть два варианта:

Вариант 1: ваша программа использует gcloud

gcloud auth activate-service-account --key-file=key.json
KUBECONFIG=a.yaml gcloud container clusters get-credentials clusterA
KUBECONFIG=b.yaml gcloud container clusters get-credentials clusterB

Затем создайте 2 разных *rest.Client объекты, созданные из a.yamlдругой из b.yaml в вашей программе.

Теперь ваша программа будет опираться на gcloud двоичный файл для получения токена каждый раз, когда истекает срок действия вашего токена (каждые 1 час).

Вариант 2: используйте GOOGLE_APPLICATION_CREDENTIALS

  1. Не устанавливайте gcloud в среду вашей программы.
  2. Установите для вашего key.json переменную среды GOOGLE_APPLICATION_CREDENTIALS для вашей программы.
  3. Узнайте, как получить IP/CA кластера (объяснено выше), чтобы вы могли построить два разных *rest.Config объекты для кластера A & B.
  4. Теперь ваша программа будет использовать указанный ключевой файл для получения access_token для API Google каждый раз, когда он истекает (каждые 1 час).

Надеюсь это поможет.

PS не забудь import _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" в вашей программе Go. Это загружает плагин gcp auth!

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