API 返回 Forbidden 说明身份认证通常已经成功,但授权规则不允许当前动作。排查的核心是明确主体、verb、资源、API Group 和命名空间五个要素。
复现授权判断
kubectl auth can-i get pods -n production --as=system:serviceaccount:ops:reader
kubectl auth can-i --list -n production --as=system:serviceaccount:ops:reader
kubectl api-resources | grep -i deployment
先从错误日志获取真实身份。Pod 默认使用其 ServiceAccount,用户经代理或 OIDC 登录后则可能带有额外 group,不能只按 kubeconfig 中的名字推断。
检查绑定链路
kubectl get role,rolebinding -n production -o yaml
kubectl get clusterrole,clusterrolebinding -o yaml
kubectl describe rolebinding app-reader -n production
RoleBinding 可以引用 ClusterRole,但权限仍限制在绑定所在命名空间。子资源需要单独授权,例如读取 Pod 日志对应 pods/log。
修复原则
- 仅添加报错所需的 verb 和 resource
- 能用 Role 就不要创建 ClusterRoleBinding
- 不用
cluster-admin验证后长期保留 - 对 impersonation、secrets 和 exec 权限进行额外审计
收尾清单
用原身份再次执行 kubectl auth can-i 和实际请求,并检查审计日志。将临时绑定设置负责人和到期时间,避免权限永久堆积。