GKE 中的服务帐户身份验证失败



我需要创建可以访问GKE集群的服务帐户。在内部,我使用以下命令执行此操作:

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:
- '*'

服务帐户资源按预期创建,群集角色和群集角色绑定看起来也正确,但是当我尝试使用此新角色访问 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

响应建议存在未知用户,但我确认服务帐户存在并且位于群集角色绑定的主题中。是否可以以这种方式为 GKE 定义服务帐户?

我在数据中心运行的 kubernetes 集群上成功使用了确切的过程。

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"
},
...

我看到您正在创建服务帐户、角色和角色绑定以对您的 kubernetes 集群进行 API 访问,唯一的"hic"是资源配置不佳。 查看本文档,了解如何配置 RBAC 角色、资源谓词及其定义和示例。

你能显示kubectl get clusterrolebinding onboarding -o yaml的输出吗?

这可能是版本不匹配,因为您创建了rbac.authorization.k8s.io/v1beta1 ClusterRolekubectl create clusterrole将创建一个rbac.authorization.k8s.io/v1 ClusterRoleBinding

您应该将ClusterRole升级到版本rbac.authorization.k8s.io/v1

相关内容

最新更新