必须使用ClusterRole定义仅允许get/list/watch pods及pods/log权限,再通过RoleBinding绑定到app命名空间的dev-logger ServiceAccount,从而实现开发人员仅能查看该命名空间Pod日志、无法删除Pod或访问其他命名空间资源的精确RBAC控制。

你需要让开发人员能用kubectl查看特定命名空间(比如app)里的Pod日志,但不能删Pod、不能进shell、不能看其他命名空间资源——这必须靠RBAC精确控制,不能靠改kubeconfig或加参数绕过。
创建只读日志访问的ClusterRole
先定义一个集群角色,它只允许读取Pod日志,不带exec权限,也不开放delete或create。这个角色必须用ClusterRole,因为后续要绑定到任意namespace(如app),而Role只能绑定在同名namespace内。
新建文件role-log-reader.yaml:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: log-reader
rules:
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
注意:【pods/log必须单独列出,仅写pods不会自动包含log子资源】。如果漏掉这一条,kubectl logs会报错“Forbidden: pods/log is forbidden”。
在目标Namespace中创建ServiceAccount
为该开发人员创建专属账号,不复用default或admin账号。执行命令:
kubectl create serviceaccount dev-logger -n app
这条命令会在app命名空间下生成ServiceAccount,并自动关联一个secret——后续生成kubeconfig要用到其中的token。
将角色与账号绑定到指定Namespace
使用RoleBinding(不是ClusterRoleBinding),把log-reader角色限定在app命名空间内授予dev-logger账号:
kubectl create rolebinding dev-logger-binding \
--clusterrole=log-reader \
--serviceaccount=app:dev-logger \
--namespace=app
这一步是关键:RoleBinding + ClusterRole组合,实现了“跨namespace定义权限,但在单个namespace内生效”。若误用ClusterRoleBinding,该账号将获得整个集群所有namespace的pods/log权限。
生成专用kubeconfig文件
第一步:提取ServiceAccount的token
kubectl get secret $(kubectl get serviceaccount dev-logger -n app -o jsonpath='{.secrets[0].name}') -n app -o jsonpath='{.data.token}' | base64 -d
第二步:获取集群CA证书内容(假设集群API Server地址为https://k8s-api.example.com:6443)
kubectl get secret $(kubectl get serviceaccount dev-logger -n app -o jsonpath='{.secrets[0].name}') -n app -o jsonpath='{.data.ca\.crt}' | base64 -d
第三步:用kubectl config命令组装配置
kubectl config set-cluster my-cluster --server=https://k8s-api.example.com:6443 --certificate-authority=/dev/stdin $(kubectl get secret $(kubectl get serviceaccount dev-logger -n app -o jsonpath='{.secrets[0].name}') -n app -o jsonpath='{.data.ca\.crt}' | base64 -d)
EOF
kubectl config set-credentials dev-logger --token=$(kubectl get secret $(kubectl get serviceaccount dev-logger -n app -o jsonpath='{.secrets[0].name}') -n app -o jsonpath='{.data.token}' | base64 -d)
kubectl config set-context dev-logger@my-cluster --cluster=my-cluster --user=dev-logger --namespace=app
kubectl config use-context dev-logger@my-cluster
最后导出配置:
kubectl config view --raw > dev-logger.kubeconfig
把这个文件发给开发人员,他就能执行kubectl logs -n app my-pod,但执行kubectl delete pod -n app my-pod会提示permission denied,执行kubectl get pods -n default也会被拒绝。


















