是否可以授予 Kubernetes 角色以访问集群范围内的资源,例如 CRD 和 ClusterRole?

Can a Kubernetes Role be granted to access cluster scoped resources such as CRD and ClusterRole?

参考这个问题。我明白 A Role can only be used to grant access to resources within a single namespace. 所以它不应该能够访问像 customresourcedefinitionsclusterroles 这样的集群范围内的资源。我已经创建了一个 Role 并像这样将所有资源授予它。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: myaccount
  namespace: test
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: testadmin
  namespace: test
rules:
  - apiGroups: ['*']
    resources: ['*']
    verbs: ['*']
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: testadminbinding
  namespace: test
subjects:
  - kind: ServiceAccount
    name: myaccount
    namespace: test
roleRef:
  kind: Role
  name: testadmin
  apiGroup: rbac.authorization.k8s.io

然后我尝试了这个,但它得到了 'yes'(带有警告)。

$ kubectl auth can-i create customresourcedefinitions --as=system:serviceaccount:test:myaccount
Warning: resource 'customresourcedefinitions' is not namespace scoped in group 'apiextensions.k8s.io'
yes

还有 'yes' 以及 clusterrolesclusterrolebindings,它们是集群范围的。

如果 Role 真的可以访问集群范围的资源,我有点困惑?任何人都可以帮助解释这种行为吗?

您完全正确,角色用于授予对命名空间内资源的访问权限,但我应该澄清几点:

  1. customresourcedefinitions 可以是命名空间或 cluster-scoped,并且可用于所有命名空间,这就是为什么它在测试时返回为 yes,根据 official documentation:

When you create a new CustomResourceDefinition (CRD), the Kubernetes API Server creates a new RESTful resource path for each version you specify. The CRD can be either namespaced or cluster-scoped, as specified in the CRD's scope field. As with existing built-in objects, deleting a namespace deletes all custom objects in that namespace. CustomResourceDefinitions themselves are non-namespaced and are available to all namespaces.

  1. clusterrolesclusterrolebindings 不是资源,集群角色只是一组可以分配给给定集群内资源的权限,集群角色绑定是授予这些权限的方式 cluster-wide.

要正确测试创建的 Role 和 RoleBinding,您可以使用 Pod 等资源来完成:

您应该能够使用服务帐户“myaccount”在命名空间“test”中创建 pod,但不能使用任何其他用户。

kubectl auth can-i create pod --as=system:serviceaccount:test:myaccount --namespace=test
yes
kubectl auth can-i create pod --as=system:serviceaccount:test:otheraccount --namespace=test
no

并且您不能在“test”之外的任何名称空间中与任一用户创建相同的资源。

kubectl auth can-i create pod --as=system:serviceaccount:test:myaccount
no
kubectl auth can-i create pod --as=system:serviceaccount:test:otheraccount
no