Kubernetes授权,只有在运行hello-server

时间:2019-04-17 07:51:35

标签: python authentication kubernetes

我一直在致力于与Kubernetes交互的python项目。我遇到的问题之一是身份验证过程。与this问题类似,我得到了错误

  

google.auth.exceptions.DefaultCredentialsError:无法自动确定凭据。请设置GOOGLE_APPLICATION_CREDENTIALS或明确创建凭据,然后重新运行该应用程序。有关更多信息,请参见https://cloud.google.com/docs/authentication/getting-started

我知道这可能是由于我使用了pycharm。但是,当我从终端运行它时,出现此错误:

  

kubernetes.client.rest.ApiException:(403)   原因:禁止   HTTP响应标头:HTTPHeaderDict({'Audit-Id':'XXXXXXXXXXX','Content-Type':'application / json','X-Content-Type-Options':'nosniff','Date':'XXXXXXXXXXXXXXXX' ,'Content-Length':'XXX'})   HTTP响应正文:{“种类”:“状态”,“ apiVersion”:“ v1”,“元数据”:{},“状态”:“故障”,“消息”:“ deployments.extensions:用户\” XXXXXXXXXXXXXXXXXXX \“无法在名称空间\” default \“中创建Deployments.extensions:必需\” container.deployments.create \“权限。”,“ reason”:“ Forbidden”,“ details”:{“ group”:“ extensions “,”种类“:”部署“},”代码“:403}

但是,当我从以下位置更改代码时

os.system(f"gcloud container clusters get-credentials {cluster_name} --zone {zone} --project {project}")

os.system(f"gcloud container clusters get-credentials {cluster_name} --zone {zone} --project {project}")
os.system("kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080")
os.system("kubectl delete deployments hello-server")

我可以进行身份​​验证,所有其他功能都应正确执行。我不明白为什么会这样。我认为这可能表明出现了问题,请在继续操作之前先进行修复。有谁知道这里发生了什么,以及如何解决?

2 个答案:

答案 0 :(得分:1)

从您的错误描述中可以看出,您没有遇到身份验证问题,但是对Kubernetes的授权。这是两件事。

您发布的错误消息应通过以下方式进行解释:
您无权在“部署”对象上执行“创建”操作。

阻止用户访问群集资源上特定操作的机制称为RBAC-基于角色的访问控制(RBAC),它内置在GKE中,通常在Kubernetes 1.6及更高版本中启用。

如何解决您的问题:

  1. 授予您的GCP用户/ GCP服务帐户适当的角色。

最简单的方法是使用预定义的Cloud AIM roles for Kubernetes clusters中的一种,例如“角色/ container.admin”,它将自动映射到ClusterRole(cluster-admin)。请记住要应用“最小特权原则”,尤其是对于生产集群。

  1. 如果您在步骤#1中创建了GCP服务帐户

    • 以JSON格式下载其密钥

    • 通过设置环境变量GOOGLE_APPLICATION_CREDENTIALS

    • 为应用程序代码提供身份验证凭据

    我直接在我的python应用程序中对其进行设置:

  

导入操作系统
  os.environ [“ GOOGLE_APPLICATION_CREDENTIALS”] ='gke-admin-svc-key.json'

从现在开始,您应该能够在GCP服务帐户的背景下从外部与群集进行交互,这应该反映在审核日志中:

authenticationInfo: {
   principalEmail:  "<id_of_your_svc_account>"    
  }
  authorizationInfo: [
   0: {
    granted:  true     
    permission:  "io.k8s.core.v1.pods.list"     
    resource:  "core/v1/pods"     
   }
  ]

答案 1 :(得分:0)

如何将kubernetes客户端用于python?

https://github.com/kubernetes-client/python

检查此示例以进行远程集群访问:

https://github.com/kubernetes-client/python/blob/master/examples/remote_cluster.py