Доступ к кластеру 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 должен знать о:
- IP-адрес мастера кластера
- сертификат CA кластера
(Если вы используете GKE, вы можете увидеть эту информацию в $HOME/.kube/config
, населенный gcloud container clusters get-credentials
команда).
Я рекомендую вам либо:
- Иметь файл kubeconfig, который содержит эту информацию для кластеров A & B
- Используйте 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
- Не устанавливайте gcloud в среду вашей программы.
- Установите для вашего key.json переменную среды GOOGLE_APPLICATION_CREDENTIALS для вашей программы.
- Узнайте, как получить IP/CA кластера (объяснено выше), чтобы вы могли построить два разных
*rest.Config
объекты для кластера A & B. - Теперь ваша программа будет использовать указанный ключевой файл для получения access_token для API Google каждый раз, когда он истекает (каждые 1 час).
Надеюсь это поможет.
PS не забудь import _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
в вашей программе Go. Это загружает плагин gcp auth!