即使我是所有者和管理员,也无法在GKE中创建群集角色

时间:2018-04-15 17:25:23

标签: kubernetes google-cloud-platform rbac google-kubernetes-engine

创建新的GKE群集后,创建群集角色失败,并显示以下错误:

Error from server (Forbidden): error when creating "./role.yaml":
clusterroles.rbac.authorization.k8s.io "secret-reader" is forbidden: 
attempt to grant extra privileges: [PolicyRule{Resources:["secrets"], 
APIGroups:[""], Verbs:["get"]} PolicyRule{Resources:["secrets"], 
APIGroups:[""], Verbs:["watch"]} PolicyRule{Resources:["secrets"], 
APIGroups:[""], Verbs:["list"]}] user=&{XXX@gmail.com  
[system:authenticated] map[authenticator:[GKE]]} ownerrules= . 
[PolicyRule{Resources:["selfsubjectaccessreviews" 
"selfsubjectrulesreviews"], APIGroups:["authorization.k8s.io"], Verbs: 
["create"]} PolicyRule{NonResourceURLs:["/api" "/api/*" "/apis" 
"/apis/*" "/healthz" "/swagger-2.0.0.pb-v1" "/swagger.json" 
"/swaggerapi" "/swaggerapi/*" "/version"], Verbs:["get"]}] 
ruleResolutionErrors=[]

我的帐户在IAM中具有以下权限:

  

Kubernetes Engine Admin

     

Kubernetes Engine Cluster Admin

     

所有者

这是我的role.yaml(来自Kubernetes docs)

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

根据RBAC docs of GCloud,我需要

  

创建一个RoleBinding,在尝试创建其他Role或ClusterRole权限之前,为您的Google身份提供群集管理员角色。

所以我尝试了this

export GCP_USER=$(gcloud config get-value account | head -n 1)
kubectl create clusterrolebinding cluster-admin-binding
--clusterrole=cluster-admin --user=$GCP_USER

成功了,但在创建集群角色时我仍然遇到同样的错误。

任何想法我可能做错了什么?

4 个答案:

答案 0 :(得分:9)

根据Google Container Engine docs,您必须首先创建一个RoleBinding,该角色将授予您要创建的角色中包含的所有权限。

获取当前的Google身份

$ gcloud info | grep Account

Account: [myname@example.org]

将cluster-admin授予您当前的身份

$ kubectl create clusterrolebinding myname-cluster-admin-binding --clusterrole=cluster-admin --user=myname@example.org

Clusterrolebinding "myname-cluster-admin-binding" created

现在,您可以毫无问题地创建ClusterRole。

我在CoreOS FAQ / Troubleshooting中找到了答案,请查看答案以获取更多信息。

答案 1 :(得分:2)

@ S.Heutmaker的评论使我找到了解决方案。

对我来说,解决方案是在电子邮件地址上使用正确的大小写创建cluster-admin-binding。检查错误消息中的大小写或Google Cloud Console IAM

$ kubectl create clusterrolebinding myname-cluster-admin-binding --clusterrole=cluster-admin --user=MyName@example.org

答案 2 :(得分:1)

这是正确的解决方案。 GCP_USER是否与角色创建错误消息中的XXX@gmail.com用户名相同?

答案 3 :(得分:0)

如果大小写正确,请尝试添加两个Googlemail域变体(即@gmail.com@googlemail.com)。对我来说,gcloud info | grep Account返回了<name>@googlemail.com,但是我必须与<name>@gmail.com创建一个clusterrole绑定才能使命令起作用。

相关问题