我需要创建可以访问GKE群集的ServiceAccounts。在内部,我使用以下命令执行此操作:
kubectl create serviceaccount onboarding --namespace kube-system
kubectl apply -f onboarding.clusterrole.yaml
kubectl create clusterrolebinding onboarding --clusterrole=onboarding --serviceaccount=kube-system:onboarding
文件onboarding.clusterrole.yaml
的内容如下:
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: onboarding
rules:
- apiGroups:
- '*'
resources:
- 'namespace,role,rolebinding,resourcequota'
verbs:
- '*'
ServiceAccount资源已按预期创建,并且ClusterRole和ClusterRoleBinding看起来也正确,但是当我尝试使用此新角色访问API时,身份验证失败。
curl -k -X GET -H "Authorization: Bearer [REDACTED]" https://36.195.83.167/api/v1/namespaces
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "namespaces is forbidden: User \"system:serviceaccount:kube-system:onboarding\" cannot list namespaces at the cluster scope: Unknown user \"system:serviceaccount:kube-system:onboarding\"",
"reason": "Forbidden",
"details": {
"kind": "namespaces"
},
"code": 403
响应提示未知用户,但我确认ServiceAccount存在并且在ClusterRoleBinding的主题中。是否可以通过这种方式为GKE定义ServiceAccount?
我正在数据中心中运行的kubernetes集群上成功使用了确切的过程。
答案 0 :(得分:2)
GKE应该具有相同的过程。您的kubectl
版本是否与GKE集群的版本匹配?不确定是否是问题所在,但是ClusterRole
的资源需要使用复数形式,并且资源表示为列表:
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: onboarding
rules:
- apiGroups:
- '*'
resources:
- namespaces
- roles
- rolebindings
- resourcequotas
verbs:
- '*'
在K8s 1.11.x上为我工作:
curl -k -X GET -H "Authorization: Bearer [REDACTED]" https://127.0.0.1:6443/api/v1/namespaces
{
"kind": "NamespaceList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces",
"resourceVersion": "12345678"
},
...
答案 1 :(得分:1)
我看到您正在创建服务帐户,角色和角色绑定,以具有对您的kubernetes集群的API访问权限,唯一的“缺点”是资源配置不正确。检查this document,了解如何配置rbac角色,资源动词及其定义和示例。
答案 2 :(得分:0)
您可以显示kubectl get clusterrolebinding onboarding -o yaml
的输出吗?
这可能是版本不匹配,因为您创建了rbac.authorization.k8s.io/v1beta1 ClusterRole
,而kubectl create clusterrole
将创建rbac.authorization.k8s.io/v1 ClusterRoleBinding
。
您应该将ClusterRole
升级到版本rbac.authorization.k8s.io/v1
。