AWS EKS中ServiceAccount调用API访问Namespaces报403 Forbidden如何解决
问题根因
你遇到的403报错是Kubernetes RBAC权限控制的标准拦截结果:默认创建的ServiceAccount没有任何额外权限,自然无法访问集群级别的namespaces资源,该问题和AWS EKS环境本身无关,EKS的RBAC逻辑完全兼容标准Kubernetes规则。
你不需要将ServiceAccount加入用户组,直接为其绑定对应权限的角色即可解决问题。
方案说明
你后续补充的配置逻辑完全正确,可以解决访问权限问题,这里补充几点注意事项:
- 权限风险提示
你当前绑定的cluster-admin是集群最高权限角色,拥有所有资源的读写权限。如果你的使用场景仅为ServiceNow集群资源发现,建议自定义仅包含必要读权限的ClusterRole进行绑定,遵循最小权限原则降低安全风险。 - 配置内容说明
你提交的YAML配置完成了两项操作:
apiVersion: v1 kind: ServiceAccount metadata: name: svcacc namespace: default --- # Create ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: svcacc roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: svcacc namespace: default
- 第一部分:在default命名空间下创建了名为svcacc的ServiceAccount
- 第二部分:通过ClusterRoleBinding将cluster-admin集群角色和该ServiceAccount绑定,完成权限授予
- Token获取命令适配
你使用的token提取命令:
$(kubectl describe secrets "$(kubectl describe serviceaccount svcacc -n default| grep -i Tokens | awk '{print $2}')" -n default | grep token: | awk '{print $2}')
仅适用于Kubernetes 1.23及更早版本(1.24版本之后默认关闭了ServiceAccount自动创建Secret类型token的特性)。如果你使用的是更高版本集群,可以直接用以下命令生成有效token:
kubectl create token svcacc -n default
内容的提问来源于stack exchange,提问作者Brandon Wilson
相关产品推荐
相关产品推荐

