Как получить имя кластера Kubernetes из API K8s, используя client- go - PullRequest
2 голосов
/ 28 февраля 2020

Как получить имя кластера Kubernetes из K8s API упоминает, что

curl http://metadata/computeMetadata/v1/instance/attributes/cluster-name -H "Metadata-Flavor: Google"

(изнутри кластера) или

kubectl run curl --rm --restart=Never -it --image=appropriate/curl -- -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/cluster-name

(извне cluster), может использоваться для получения имени кластера. Это работает.

Есть ли способ выполнить то же самое программно с помощью библиотеки k8s client-go? Может быть, с помощью RESTClient ()? Я пытался, но продолжал получать the server could not find the requested resource.

ОБНОВЛЕНИЕ

Что я пытаюсь сделать, это получить cluster-name из приложения, которое запускается либо на локальном компьютере или в кластере k8s. k8s client-go позволяет инициализировать clientset через в кластере или вне кластера аутентификация.

с двумя упомянутыми вверху командами, которые достижимы , Мне было интересно, есть ли способ из библиотеки client-go добиться того же, вместо того, чтобы делать kubectl или curl в зависимости от того, откуда запускается служба.

1 Ответ

1 голос
/ 28 февраля 2020

Данные, которые вы ищете (название кластера), доступны на уровне GCP. Само название является ресурсом в GKE, а не Kubernetes. Это означает, что эта указанная c информация недоступна при использовании client- go. Поэтому, чтобы получить эти данные, вы можете использовать клиентские библиотеки Google Cloud для Go, предназначенные для взаимодействия с GCP.

В качестве отправной точки вы можете обратиться к этому документ .

Сначала вы должны загрузить пакет container:

➜  go get google.golang.org/api/container/v1        

Перед тем, как вы запустите свой код, вы должны будете пройти аутентификацию для получения данных: у Google очень хороший документ как этого добиться.

В основном у вас есть сгенерированный a ServiceAccount ключ и передача его в GOOGLE_APPLICATION_CREDENTIALS среду:

➜  export GOOGLE_APPLICATION_CREDENTIALS=sakey.json          

Что касается информации, которую вы хотите, вы можете получить информация о кластере (включая имя), следующая за этим примером .

Как только вы сделаете это, вы можете запустить свое приложение следующим образом:

➜  go run main.go -project <google_project_name> -zone us-central1-a

И результатом будет информация о вашем кластере:

Cluster "tom" (RUNNING) master_version: v1.14.10-gke.17  -> Pool "default-pool" (RUNNING) machineType=n1-standard-2 node_version=v1.14.10-gke.17 autoscaling=false% 

Также стоит упомянуть, что если вы выполните эту команду:

curl http://metadata/computeMetadata/v1/instance/attributes/cluster-name -H "Metadata-Flavor: Google"

Вы также взаимодействуете с API GCP и можете go не аутентифицироваться до тех пор, пока поскольку он работает в GCE-машине / кластере GKE. Это обеспечило автоматическую c аутентификацию.

Подробнее об этом можно прочитать в google`s Хранение и извлечение метаданных экземпляра document.

Наконец, одно большое преимущество в выполнении Это связано с тем, что в облачных клиентских библиотеках он может запускаться извне (если он аутентифицирован) или внутри модулей в развертывании.

Дайте мне знать, если это поможет.

...