Kubernetes集群新建ServiceAccount无法exec进入Pod怎么解决
问题根因
kubectl exec操作本质是向pods/exec子资源发起create类型的API请求,你当前定义的readonlyuser ClusterRole仅为pods/exec配置了get、list、watch三类权限,缺少必要的create权限,因此触发了鉴权拒绝。你已创建的ClusterRoleBinding、命名空间维度的RoleBinding配置本身没有问题,不需要调整。
修复步骤
- 第一步:更新
readonlyuserClusterRole的权限规则,为pods/exec、pods/attach这类需要主动发起请求的操作新增create权限,可直接执行以下命令生效:
kubectl apply -f - <<EOF apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: readonlyuser rules: - nonResourceURLs: - '*' verbs: - get - list - watch - apiGroups: - "" resources: - pods - pods/attach - pods/exec - pods/port-forward - pods/proxy - services/proxy verbs: - get - list - watch - create EOF
也可以执行kubectl edit clusterrole readonlyuser,手动在对应resources项的verbs列表中添加create后保存即可生效。
- 第二步:验证权限配置是否生效,可先通过Kubernetes内置的鉴权预检命令确认:
# 将<namespace>替换为你的业务命名空间名称 kubectl auth can-i create pods/exec --as system:serviceaccount:default:username -n <namespace>
命令返回yes即说明权限配置正常,此时再执行kubectl exec操作即可正常进入Pod。
可选优化
如果你不需要该ServiceAccount具备集群全局的只读权限,可删除全局的ClusterRoleBinding,仅保留对应命名空间下的RoleBinding即可,避免权限范围过大:
kubectl delete clusterrolebinding username
内容的提问来源于stack exchange,提问作者zozo6015
相关产品推荐
相关产品推荐

