多用户设置
SUSE® Rancher Prime Continuous Delivery 在可能的情况下使用 Kubernetes RBAC。
RBAC 的一个附加功能是 GitRepoRestriction 资源,可以用于控制名称空间中的 GitRepo 资源。
多用户 Fleet 设置如下:
-
租户不共享名称空间,每个租户在上游集群中拥有一个或多个名称空间,可以在其中创建 GitRepo 资源。
-
租户无法部署集群范围的资源,并且仅限于下游集群上的一组名称空间。
-
集群位于单独的名称空间中。
|
重要信息
租户的隔离并不完全,依赖于正确设置的 Kubernetes RBAC。如果没有操作员的手动设置,租户仍然可以部署集群范围的资源。即使在现有的 SUSE® Rancher Prime Continuous Delivery 限制下,用户仅限于名称空间,但名称空间本身并没有提供太多隔离。例如,他们仍然可以消耗任意多的资源。 然而,现有的 SUSE® Rancher Prime Continuous Delivery 限制允许用户共享集群,并且在不冲突的情况下部署资源。 |
示例 SUSE® Rancher Prime Continuous Delivery 独立
这将创建一个用户 'fleetuser',他只能管理 'project1' 名称空间中的 GitRepo 资源。
kubectl create serviceaccount fleetuser
kubectl create namespace project1
kubectl create -n project1 role fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --role=fleetuser
如果我们想要授予对多个名称空间的访问权限,可以使用一个集群角色和两个角色绑定:
kubectl create clusterrole fleetuser --verb=get --verb=list --verb=create --verb=delete --resource=gitrepos.fleet.cattle.io
kubectl create -n project1 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
kubectl create -n project2 rolebinding fleetuser --serviceaccount=default:fleetuser --clusterrole=fleetuser
这确保了租户无法干扰其他租户的 GitRepo 资源,因为他们无法访问其他租户的名称空间。
Rancher 中的隔离工作区
属于公司特定组/组织的用户,可能希望禁用对同一公司其他组/组织用户的集群可见性。
为了实现这种隔离,Rancher 提供了 GlobalRoles 以允许用户对某些 Kubernetes 资源的权限。GlobalRoles 能够限制对集群中特定名称空间的访问,这得益于 NamespacedRules。
当创建一个新的 Fleet 工作区时,会在 Rancher 本地群集内自动生成一个具有相同名称的名称空间。 为了让用户在特定工作区中查看和部署 Fleet 资源,他们需要至少以下权限:
-
在本地群集中列出/获取
fleetworkspace集群范围的资源 -
在本地群集的工作区的后端名称空间中创建 Fleet 资源(如
bundles、gitrepos、…)的权限。
让我们授予在 project1 和 project2 Fleet 工作区中部署 Fleet 资源的权限:
apiVersion: management.cattle.io/v3
kind: FleetWorkspace
metadata:
name: project1
apiVersion: management.cattle.io/v3
kind: FleetWorkspace
metadata:
name: project2
-
创建一个
GlobalRole,授予在project1和project2Fleet 工作区中部署 Fleet 资源的权限:
apiVersion: management.cattle.io/v3
kind: GlobalRole
metadata:
name: fleet-projects1and2
namespacedRules:
project1:
- apiGroups:
- fleet.cattle.io
resources:
- gitrepos
- bundles
- clusterregistrationtokens
- gitreporestrictions
- clusters
- clustergroups
verbs:
- '*'
project2:
- apiGroups:
- fleet.cattle.io
resources:
- gitrepos
- bundles
- clusterregistrationtokens
- gitreporestrictions
- clusters
- clustergroups
verbs:
- '*'
rules:
- apiGroups:
- management.cattle.io
resourceNames:
- project1
- project2
resources:
- fleetworkspaces
verbs:
- '*'
用户现在可以访问 Rancher 中的 Continuous Delivery 选项卡,并可以向 project1 和 project2 工作区部署资源。
为了拥有一个组织良好的环境,每个工作区应有其相关的 GlobalRole,以帮助分离职责和满足客户所需的隔离。这样,每个用户可以根据需要被分配到一个或多个 GlobalRoles。
允许访问集群
这假设所有由 'fleetuser' 创建的 GitRepos 都具有 team: one 标签。可以使用不同的标签,以选择集群中的不同名称空间。
在每个用户的名称空间中,作为管理员创建一个 BundleNamespaceMapping。
kind: BundleNamespaceMapping
apiVersion: fleet.cattle.io/v1alpha1
metadata:
name: mapping
namespace: project1
# Bundles to match by label.
# The labels are defined in the fleet.yaml # labels field or from the
# GitRepo metadata.labels field
bundleSelector:
matchLabels:
team: one
# or target one repo
#fleet.cattle.io/repo-name: simpleapp
# Namespaces, containing clusters, to match by label
namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: fleet-default
# the label is on the namespace
#workspace: prod
GitRepo 资源中的 target 部分 可用于仅向匹配集群的子集进行部署。
限制对下游集群的访问
管理员可以通过在每个名称空间中创建一个 GitRepoRestriction 进一步限制租户。
kind: GitRepoRestriction apiVersion: fleet.cattle.io/v1alpha1 metadata: name: restriction namespace: project1 allowedTargetNamespaces: - project1simpleapp
这将拒绝创建集群范围的资源,这可能会干扰其他租户并限制部署到 'project1simpleapp' 名称空间。
一个示例 GitRepo 资源
一个由租户创建的 GitRepo 资源,没有管理员访问权限,可能看起来像这样:
kind: GitRepo
apiVersion: fleet.cattle.io/v1alpha1
metadata:
name: simpleapp
namespace: project1
labels:
team: one
spec:
repo: https://github.com/rancher/fleet-examples
paths:
- bundle-diffs
targetNamespace: project1simpleapp
# do not match the upstream/local cluster, won't work
targets:
- name: dev
clusterSelector:
matchLabels:
env: dev
这包括 team: one 标签和所需的 targetNamespace。
与之前的 BundleNamespaceMapping 一起,它将针对 'fleet-default' 名称空间中具有 env: dev 标签的所有集群。
|
|