如何为OpenShift各项目创建专属服务目录并实现租户服务隔离?
没问题,这个需求完全可以在OpenShift多租户集群里实现!核心思路是通过自定义CatalogSource隔离 + 精细RBAC权限控制,让每个租户只能看到自己命名空间内的专属服务。下面是具体的实现方式:
一、基于命名空间级CatalogSource的专属服务目录
OpenShift的OperatorHub默认使用集群级的CatalogSource(通常在openshift-marketplace命名空间),我们可以给每个租户创建独立的命名空间级CatalogSource,只包含他们需要的服务,再通过RBAC限制租户只能访问自己的CatalogSource。
具体步骤:
限制租户访问集群级CatalogSource
首先要阻止租户查看集群默认的CatalogSource,避免他们看到所有服务。创建一个拒绝访问集群级CatalogSource的ClusterRole:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: deny-cluster-catalogsources rules: - apiGroups: ["operators.coreos.com"] resources: ["catalogsources"] verbs: ["list", "watch"] resourceNames: ["redhat-operators", "community-operators"] # 这里填集群默认的CatalogSource名称 effect: Deny然后把这个ClusterRole绑定到租户的用户组或ServiceAccount:
oc adm policy add-cluster-role-to-group deny-cluster-catalogsources tenant-a-group为租户构建专属Catalog镜像
用OpenShift的工具把租户需要的Operator打包成专属的Catalog镜像。比如给租户A打包MySQL和Apache Operator:oc adm catalog build \ --appregistry-org=redhat-operators \ # 源Operator所在的组织 --packages=mysql-operator,apache-operator \ # 指定需要的Operator包 --from=registry.redhat.io/openshift4/ose-operator-registry:v4.14 \ # 基础Operator镜像 --to=your-private-registry/tenant-a-catalog:v1 # 构建后的专属Catalog镜像把这个镜像推送到你的私有镜像仓库,确保OpenShift集群能拉取到。
在租户命名空间创建专属CatalogSource
进入租户A的命名空间(比如tenant-a-project),创建指向专属Catalog镜像的CatalogSource:apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: tenant-a-catalog namespace: tenant-a-project spec: sourceType: grpc image: your-private-registry/tenant-a-catalog:v1 displayName: Tenant A Exclusive Catalog publisher: Your Org赋予租户访问自身CatalogSource的权限
在租户命名空间创建一个Role,允许用户查看该命名空间内的CatalogSource和相关服务资源:apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: tenant-catalog-access namespace: tenant-a-project rules: - apiGroups: ["operators.coreos.com"] resources: ["catalogsources", "operatorgroups", "subscriptions"] verbs: ["list", "watch", "get"] - apiGroups: ["servicecatalog.k8s.io"] resources: ["serviceclasses", "serviceinstances"] verbs: ["list", "watch", "create", "delete"]把这个Role绑定到租户用户组:
oc adm policy add-role-to-group tenant-catalog-access tenant-a-group -n tenant-a-project
二、基于命名空间级Operator安装的服务隔离
如果不需要单独构建Catalog镜像,也可以直接在租户命名空间内安装他们需要的Operator,通过OperatorGroup限定Operator的作用范围,让租户只能看到自己命名空间内Operator提供的服务。
具体步骤:
在租户命名空间创建OperatorGroup
限定Operator只在当前租户命名空间生效:apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: tenant-a-operator-group namespace: tenant-a-project spec: targetNamespaces: - tenant-a-project安装租户需要的Operator
在租户命名空间创建Subscription,安装MySQL和Apache Operator:apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: mysql-operator namespace: tenant-a-project spec: channel: stable name: mysql-operator source: redhat-operators # 这里可以用集群默认的CatalogSource,前提是已经限制了租户查看其他Operator sourceNamespace: openshift-marketplace重复这个步骤安装Apache Operator。
RBAC权限控制
同样需要给租户分配只能访问自身命名空间内Operator、ServiceClass、ServiceInstance的权限,参考上面的Role配置即可。
关键注意事项
- 确保租户的用户组没有集群级的
view权限(默认的viewClusterRole允许查看所有命名空间的资源),如果有需要移除或覆盖。 - 如果你使用的是OpenShift传统的Service Catalog(而非OperatorHub),可以通过
ClusterServiceBroker和ServiceBroker的命名空间隔离来实现类似效果,核心还是RBAC和资源的命名空间化。
内容的提问来源于stack exchange,提问作者Muhammed Roshan

