Этот подход не сработает.
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 кластера создания также есть ошибка, о которой я сообщу.