Get-Credentials кластеров Python gcloud возвращает ошибку разрешения - PullRequest
0 голосов
/ 29 июня 2018

Я работаю над проектом Python (3.6), в котором я реализовал Google Cloud API, у меня есть учетные данные для настройки Google Cloud через учетную запись службы. Вот что я попробовал:

Получить учетные данные:

def prepare_credentials(cred_file):
    from google.oauth2 import service_account
    credentials = service_account.Credentials.from_service_account_file(cred_file)
    return credentials

А потом я попытался запустить gcloud container clusters get-credentials $CLUSTER_NAME --zone $ZONE --project $PROJECT как показано ниже:

Запустите команду gcloud через подпроцесс Python:

print(subprocess.call(
            'gcloud container clusters get-credentials ' + data['cluster_name'] + ' --zone '
            + data['zone_region']
            + ' --project ' + data['project_id'],
            shell=True))

возвращает эту ошибку:

Извлечение конечной точки кластера и данных аутентификации.

ОШИБКА: (gcloud.container.clusters.get-credentials) ResponseError: code = 403, message = Обязательное разрешение «container.clusters.get» для проектов / brain-183103 / zone / europe-west1-d / clusters /numpy".

1

W0629 04: 12: 00.776926 2222 factory_object_mapping.go: 423] Не удалось загрузить OpenAPI (Get https://104.197.10.169/swagger-2.0.0.pb-v1: dial tcp 104.197.10.169:443: тайм-аут ввода / вывода), возвращаясь к чванству Невозможно подключиться к серверу: наберите tcp 104.197.10.169:443: тайм-аут ввода-вывода

Учетные данные учетной записи службы работают хорошо, так как я использую эти учетные данные для различных других вызовов API Google Cloud, а также я установил разрешение owner для проекта для этой service_account.

Я что-то не так настроил?

Помогите мне, пожалуйста!

Спасибо, Абдул

1 Ответ

0 голосов
/ 28 июля 2018

Этот подход не сработает.

Python subprocess предоставляет способ запуска, например. gcloud команды и связь между вашим процессом Python и, например, gcloud с использованием каналов ввода-вывода (и ошибок).

В своем коде вы показываете создание объекта Python credential, представляющего вашу учетную запись службы и , а затем ваш запуск gcloud в подпроцессе. Между этими двумя процессами нет общего доступа к учетным данным, поэтому gcloud использует все, что имеет в контексте, вероятно, $HOME/.config/gcloud.

пользователя.

Это еще более усложняется тем фактом, что gcloud container clusters get-credentials выполняет набор magic с учетными данными gcloud пользователя и указанным кластером для настройки $HOME/.kube/config, чтобы последующие команды kubectl проходили аутентификацию с использованием Open ID Подключение.

Учитывая, что вы используете служебную учетную запись, я полагаю, поскольку для этого требуется распространение ключа учетной записи службы, чтобы вы не собирались иметь много | динамических копий кода, выполняющих эту проверку подлинности. Если это правильно, то вы можете рассмотреть возможность выполнения gcloud container cluster get-credentials вне (и до) вашего кода Python (либо вручную, либо через скрипт оболочки), а затем (после того, как вы правильно настроили $HOME/.kube/config для своего кластера), используйте клиент Python Kubernetes (!) для выполнения любой работы, которую вы хотите выполнить в кластере.

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

Вот пример Python с использованием облачной клиентской библиотеки и учетных данных приложения по умолчанию. Библиотека не (кажется) решает задачу эффективного преобразования учетных данных учетной записи службы GCP в учетные данные (через ~ / .kube / config), которые вы можете использовать для доступа к кластеру Kubernetes. Но вы можете применять операции к кластерам, используя эту библиотеку:

requirements.txt:

google-cloud-container==0.1.1

python.py:

from google.cloud import container_v1

client = container_v1.ClusterManagerClient()

project_id = "[[YOUR-PROJECT-ID]]"
zone = "[[YOUR-ZONE]]"

cluster_id = "[[YOUR-CLUSTER-ID]]"

cluster = {
   "name": cluster_id,
    "initial_node_count": 1,
    "master_auth":{
      #"username": "admin",
      "client_certificate_config": {
      },
    },
    #logging_service = "logging.googleapis.com",
    #monitoring_service = "monitoring.googleapis.com",
    "initial_cluster_version": "1.10.5-gke.3",
}
response = client.create_cluster(project_id, zone, cluster)

response = client.list_clusters(project_id, zone)

response = client.delete_cluster(project_id, zone, cluster_id)

Примечание: имя пользователя отсутствует в инструкции по отключению имени пользователя и пароля. client_certificate_config пусто ({}) до не выдать сертификат клиента. Вы можете изменить это. Я думаю, что в ответе JSON кластера создания также есть ошибка, о которой я сообщу.

...