![](/img/trans.png)
[英]Kubernetes RBAC apiGroup field in RoleBinding and ClusterRoleBinding
[英]Kubernetes RBAC "Allowed by RoleBinding" but "cannot list resource"
我正在向我的 Kubernetes 集群部署一個應用程序,該應用程序使用 Kubernetes API 列出集群中的 pod(不僅是其命名空間中的 pod)。 該應用程序將位於其自己的命名空間中。
RBAC 規則如下;
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: kubecontrol-rbac-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: kubecontrol-rbac-role-binding
namespace: kubecontrol
subjects:
- kind: ServiceAccount
namespace: kubecontrol
name: default
roleRef:
kind: ClusterRole
name: kubecontrol-rbac-role
apiGroup: rbac.authorization.k8s.io
如您所見,我有一個 ClusterRole,它授予對“pods”資源的“list”、“get”和“watch”權限,以及一個 RoleBinding 將此 ClusterRole 應用於命名空間的default
ServiceAccount。
當我使用kubectl auth can-in
檢查授權時,這個配置看起來是正確的;
$ kubectl -n kubecontrol auth can-i --as=system:serviceaccount:kubecontrol:default list pods
yes
$ kubectl -n kubecontrol auth can-i --as=system:serviceaccount:kubecontrol:default list pods --v=8
...
I0326 23:17:05.125188 56505 request.go:947] Response Body: {"kind":"SelfSubjectAccessReview","apiVersion":"authorization.k8s.io/v1","metadata":{"creationTimestamp":null},"spec":{"resourceAttributes":{"namespace":"kubecontrol","verb":"list","resource":"pods"}},"status":{"allowed":true,"reason":"RBAC: allowed by RoleBinding \"kubecontrol-rbac-role-binding/kubecontrol\" of ClusterRole \"kubecontrol-rbac-role\" to ServiceAccount \"default/kubecontrol\""}}
RBAC:由 ClusterRole "kubecontrol-rbac-role" 的 RoleBinding "kubecontrol-rbac-role-binding/kubecontrol" 允許到 ServiceAccount "default/kubecontrol"
但是,當我實際嘗試執行操作時,卻被告知不允許這樣做;
$ kubectl get pod --as=system:serviceaccount:kubecontrol:default --all-namespaces
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:kubecontrol:default" cannot list resource "pods" in API group "" at the cluster scope
我在我的應用程序中看到相同的錯誤消息。
用戶( system:serviceaccount:kubecontrol:default
)在兩種情況下都是相同的,那么為什么我不能列出 pod,即使根據 Kubernetes 本身我應該能夠列出? 有什么我想念的嗎?
使用--all-namespaces
可以列出集群所有命名空間中的 pod。 但是由於您只使用了RoleBinding
,因此您僅對給定的命名空間(在您的情況下命名空間kubecontrol
)擁有來自ClusterRole
的權限。 您必須使用ClusterRoleBinding
來為您提供整個集群的ClusterRole
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.