You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为OpenShift各项目创建专属服务目录并实现租户服务隔离?

实现OpenShift多租户专属服务目录隔离的方案

没问题,这个需求完全可以在OpenShift多租户集群里实现!核心思路是通过自定义CatalogSource隔离 + 精细RBAC权限控制,让每个租户只能看到自己命名空间内的专属服务。下面是具体的实现方式:

一、基于命名空间级CatalogSource的专属服务目录

OpenShift的OperatorHub默认使用集群级的CatalogSource(通常在openshift-marketplace命名空间),我们可以给每个租户创建独立的命名空间级CatalogSource,只包含他们需要的服务,再通过RBAC限制租户只能访问自己的CatalogSource。

具体步骤:

  1. 限制租户访问集群级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
    
  2. 为租户构建专属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集群能拉取到。

  3. 在租户命名空间创建专属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
    
  4. 赋予租户访问自身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提供的服务。

具体步骤:

  1. 在租户命名空间创建OperatorGroup
    限定Operator只在当前租户命名空间生效:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: tenant-a-operator-group
      namespace: tenant-a-project
    spec:
      targetNamespaces:
      - tenant-a-project
    
  2. 安装租户需要的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。

  3. RBAC权限控制
    同样需要给租户分配只能访问自身命名空间内Operator、ServiceClass、ServiceInstance的权限,参考上面的Role配置即可。

关键注意事项

  • 确保租户的用户组没有集群级的view权限(默认的viewClusterRole允许查看所有命名空间的资源),如果有需要移除或覆盖。
  • 如果你使用的是OpenShift传统的Service Catalog(而非OperatorHub),可以通过ClusterServiceBroker和ServiceBroker的命名空间隔离来实现类似效果,核心还是RBAC和资源的命名空间化。

内容的提问来源于stack exchange,提问作者Muhammed Roshan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:54:09