是否可以授予 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.
所以它不应该能够访问像 customresourcedefinitions
或 clusterroles
这样的集群范围内的资源。我已经创建了一个 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' 以及 clusterroles
和 clusterrolebindings
,它们是集群范围的。
如果 Role 真的可以访问集群范围的资源,我有点困惑?任何人都可以帮助解释这种行为吗?
您完全正确,角色用于授予对命名空间内资源的访问权限,但我应该澄清几点:
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.
clusterroles
和 clusterrolebindings
不是资源,集群角色只是一组可以分配给给定集群内资源的权限,集群角色绑定是授予这些权限的方式 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
参考这个问题A Role can only be used to grant access to resources within a single namespace.
所以它不应该能够访问像 customresourcedefinitions
或 clusterroles
这样的集群范围内的资源。我已经创建了一个 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' 以及 clusterroles
和 clusterrolebindings
,它们是集群范围的。
如果 Role 真的可以访问集群范围的资源,我有点困惑?任何人都可以帮助解释这种行为吗?
您完全正确,角色用于授予对命名空间内资源的访问权限,但我应该澄清几点:
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.
clusterroles
和clusterrolebindings
不是资源,集群角色只是一组可以分配给给定集群内资源的权限,集群角色绑定是授予这些权限的方式 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