我正在一个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
如下:
通过Python的子进程运行gcloud命令:
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:代码= 403,消息=“ projects / brain-183103 / zones / europe-west1-d / clusters所需的” container.clusters.get”权限/ numpy”。
1
W0629 04:12:00.776926 2222 factory_object_mapping.go:423]无法下载OpenAPI(获取https://104.197.10.169/swagger-2.0.0.pb-v1:拨打TCP 104.197.10.169:443:I/O超时),回退到招摇 无法连接到服务器:拨打TCP 104.197.10.169:443:I/O超时
服务帐户凭据运行良好,因为我将这些凭据用于其他各种Google Cloud API调用,并且我已经为此service_account设置了对项目的owner
权限。
我配置错了吗?
请帮帮我!
谢谢, 阿卜杜勒
答案 0 :(得分:0)
这种方法行不通。
Python的<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.2" />
提供了一种运行例如subprocess
命令,并在您的Python进程与gcloud
使用I / O(和错误)管道。
在代码中,您将显示创建一个Python gcloud
对象的过程,该对象代表您的服务帐户 ,然后在子流程中运行credential
。这两个过程之间没有凭据共享,因此gcloud
正在使用上下文中可能使用的任何内容,可能是用户的gcloud
。
由于$HOME/.config/gcloud
使用用户的gcloud container clusters get-credentials
凭据和指定的集群执行一堆 magic 来配置gcloud
,从而使情况变得更加复杂随后的kubectl命令将使用Open ID Connect进行身份验证。
假设您正在使用服务帐户,因为这需要分发服务帐户的密钥以进行身份验证,因此您不希望执行此身份验证的代码具有多个动态副本。如果是正确的话,那么您可能希望考虑在Python代码之外(以及之前)执行$HOME/.kube/config
(手动或通过Shell脚本),然后(一旦您已经正确配置了gcloud container cluster get-credentials
您的群集),请使用Kubernetes' Python client(!)来执行您要在群集上进行的任何工作。
尽管不是专门解决此问题的方法,但我建议您在代码中使用Application Default Credentials(ADC)。无论您的代码是在Google Cloud Platform上运行还是在外部运行,还是使用用户帐户或服务帐户,ADC都会以一种方式进行身份验证。
这是使用Cloud Client Library和Application Default Credentials的Python示例。该库不会出现(出现)来解决将GCP服务帐户凭据有效转换为凭据(通过〜/ .kube / config)(可用于访问Kubernetes集群)的挑战。但是,您可以使用此库将操作应用于集群:
requirements.txt:
$HOME/.kube/config
python.py:
google-cloud-container==0.1.1
字典中不存在 NB用户名以禁用用户名|密码。 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响应中也存在一个错误,我将进行报告。