EC2托管EKS工作节点执行kubectl命令报Forbidden权限错误如何解决?
问题本质
该报错是EKS工作节点默认使用的system:node身份权限不足导致的。K8s默认仅给工作节点所属的system:nodes用户组分配节点注册、状态上报、Pod调度信息拉取等基础运行必要权限,没有开放Pod查询、exec等操作权限,属于标准安全限制。
排查步骤
- 确认当前使用身份:在节点执行
kubectl config view,查看user字段是否为system:node:<节点实例名>,和报错信息中的用户名一致,排除身份误用问题 - 验证权限状态:执行
kubectl auth can-i create pods/exec -n default,返回no即可确认是RBAC权限不足导致的报错
解决方案
分两种场景选择对应方案:
方案1:临时调试使用(推荐)
不要直接修改节点默认权限,直接将管理员kubeconfig传到节点使用即可:
- 在你本地已配置EKS管理员权限的设备上执行
aws eks update-kubeconfig --name <你的EKS集群名> --region <AWS区域>生成管理员kubeconfig - 将本地
~/.kube/config文件传输到工作节点的~/.kube/目录覆盖原有配置,即可正常执行所有kubectl操作
注意:调试完成后及时删除节点上的管理员kubeconfig文件,避免节点被攻破后集群权限泄露
方案2:长期给节点开放指定权限(仅特殊场景使用)
如果业务确实需要工作节点本身具备kubectl操作权限,可通过RBAC配置给system:nodes用户组绑定对应权限:
- 创建ClusterRole配置文件
node-ops-role.yaml,内容如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: node-ops-role rules: # 按需调整需要开放的资源和操作权限 - apiGroups: [""] resources: ["pods", "pods/exec", "services", "endpoints"] verbs: ["get", "list", "watch", "create"]
- 应用配置:
kubectl apply -f node-ops-role.yaml - 创建ClusterRoleBinding配置文件
node-ops-binding.yaml,内容如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: node-ops-binding subjects: - kind: Group name: system:nodes apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: node-ops-role apiGroup: rbac.authorization.k8s.io
- 应用绑定配置:
kubectl apply -f node-ops-binding.yaml
配置完成后回到工作节点执行kubectl命令即可正常生效。
内容的提问来源于stack exchange,提问作者Cloud Delhi
相关产品推荐
相关产品推荐

