多租户
了解 GitOps 中的多租户支持
摘要
第 1 章 GitOps 中的多租户支持 复制链接链接已复制到粘贴板!
多租户是一种软件架构,其中单个软件实例服务于多个不同的用户组或租户。使用多租户,您可以共享单个 Argo CD 实例来部署资源,同时维护用户之间的隔离。本节帮助集群管理员了解 Argo CD 实例范围,以及何时选择特定模式。
以集群管理员身份使用 OpenShift Container Platform 上的 Red Hat OpenShift GitOps Operator,您可以为应用程序交付团队(租户)为集群提供多租户访问。您可以允许租户在用户定义的命名空间中创建和管理专用 Argo CD 实例,而无需管理权限。租户具有完全的自主权,可以根据自己的需求和要求定制此实例,而不干扰其他租户。
对于多租户集群,管理 Argo CD 实例的个人可能不是管理集群及其用户的人员。因此,您不能将 Argo CD Application Controller (argocd-application-controller 组件)作为集群中的超级用户。
Argo CD Application Controller 协调受管集群中的资源。因此,要在 GitOps Operator 中使用多租户,根据您的用例、租户和要求,您必须配置、授予、扩展或限制特定权限,以针对 Argo CD 实例、应用程序和远程集群执行某些操作。
1.1. Argo CD 实例范围 复制链接链接已复制到粘贴板!
Red Hat OpenShift GitOps Operator 创建实例,您可以广泛分为以下模式,所有支持多租户模式:
- 命名空间范围的实例(应用程序交付实例)
- 集群范围的实例
- 默认集群范围的实例
1.1.1. 命名空间范围的实例(应用程序交付实例) 复制链接链接已复制到粘贴板!
在其中一个命名空间中创建 Argo CD 自定义资源(CR)后,GitOps Operator 在此命名空间中启动 Argo CD,可用于应用程序交付。在其初始状态下,此实例有权仅在安装它的同一命名空间中部署资源。但是,您可能需要配置实例来满足您的特定要求。
使用 GitOps Operator,您可以扩展 Argo CD 实例的权限,使 Argo CD Application Controller 在安装的位置外将资源部署到其他命名空间中。
命名空间中的 GitOps Operator 的角色是命名空间范围的,只能访问命名空间资源。Operator 无法执行它管理的命名空间之外的任何操作。
此方法是如何工作的?
GitOps Operator 允许 OpenShift 用户在其命名空间中实例化 Argo CD 实例,只要他们有权在 argoproj.io/v1alpha1 或 argoproj.io/v1beta1 API 中创建 Argo CD 资源。目前,命名空间范围的实例具有其管理的一个或多个命名空间的完整管理权限,类似于允许该命名空间中的所有资源的所有操作。
对于 Argo CD Application Controller 将资源部署到任何其他命名空间中,您需要 Kubernetes 角色和角色绑定来标记这些命名空间,并指示您要管理命名空间范围的实例的命名空间。GitOps Operator 支持使用 argocd.argoproj.io/managed-by 标签来自动创建这些角色和角色绑定。使用此标签并设置值来指示受管命名空间。然后,使用 argocd.argoproj.io/managed-by 标签,当您以命名空间范围的实例模式部署 GitOps Operator 时,它会在实例管理的每个命名空间中创建一组角色和角色绑定。
argocd.argoproj.io/managed-by 标签仅适用于与 GitOps Operator 位于同一集群中的命名空间。对于远程集群,您必须手动定义权限。
默认情况下,当使用 managed-by 标签标记命名空间时,GitOps Operator 提供了与标记命名空间的 Kubernetes 默认 admin 集群角色等效的 Argo CD Application Controller 权限。但是,您可以选择在 Operator 的 Subscription 资源中使用 CONTROLLER_CLUSTER_ROLE 和 CONTROLLER_SERVER_ROLE 环境变量来定义用于控制器和服务器组件的备用集群角色。当您提供这些变量时,Operator 不会在命名空间中创建默认角色,而是仅在对应集群角色的命名空间中创建角色绑定。管理员最多需要创建集群角色,对权限具有完全控制权限。
-
在定义角色时,Argo CD 会尝试与所有资源交互。因此,您必须提供
查看、获取和监视自定义集群角色中的所有资源的权限,或通过角色中定义的resourceInclusions或resourceExclusions字段来包括或排除特定资源。 - 无法管理集群范围的资源,如命名空间、自定义资源定义(CRD)或具有命名空间范围的实例的集群角色。
1.1.2. 集群范围的实例 复制链接链接已复制到粘贴板!
集群范围的实例旨在在集群中部署和管理资源。
如果要在 任何命名空间功能中使用 Applications,请选择 Argo CD 实例范围模式作为集群范围的实例。
集群范围的实例可以访问集群级别的资源,因此通常并不总是用于集群配置。您可以选择提升某些命名空间范围的 Argo CD 实例,以成为集群范围的。要提升实例,您必须修改 GitOps Operator 的 Subscription 资源。
- 确保在提升实例时仔细考虑。
- 不要提升由应用程序交付团队自我管理的实例。提升此类实例会对集群造成严重的安全风险,因为此操作使用户自助管理的实例集群管理员,并为他们完全控制权限。
在 Argo CD 中设置多租户配置时,必须小心。例如,如果集群管理员希望设置在多个应用程序交付团队之间共享的 Argo CD 实例,并由集群管理员管理,具有自定义集群范围的实例可能是您需要的。
此方法是如何工作的?
要防止用户使用 cluster-admin 权限部署 Argo CD 实例,您必须使用 Subscription 资源中的 ARGOCD_CLUSTER_CONFIG_NAMESPACES 环境变量来识别具有集群特权的命名空间。
因为非集群管理员无法访问订阅资源,所以它们无法提升其实例的权限并绕过集群安全性。
当实例指定为集群范围的时,Operator 会自动为该命名空间中的 Argo CD Application Controller 和服务器服务帐户创建一组集群角色和集群角色绑定。此默认角色不应等同于标准 cluster-admin 角色。它被授予一组较小的权限。这些权限可以通过创建额外的集群角色或集群角色绑定来扩展。
1.1.3. 默认集群范围的实例 复制链接链接已复制到粘贴板!
安装 GitOps Operator 后,它默认在 openshift-gitops 命名空间中实例化一个集群范围的实例。此实例以非常建议的方式设置,旨在让集群管理员管理某些集群配置资源。
- 不要将默认的集群范围的实例用于任何其他集群,如应用程序交付。
-
不要为没有
cluster-admin角色的用户授予权限,以访问默认的集群范围的实例。
默认实例没有完整的 cluster-admin 权限。它对集群的所有资源具有读取访问权限,但只能部署有限的资源集合。
将 openshift-gitops 命名空间中的默认 Argo CD 实例用于集群配置,并将租户用例委派给其他命名空间中的一个或多个单独的实例。
1.2. 采用多租户模型时的重要注意事项 复制链接链接已复制到粘贴板!
授予多租户集群管理特权可能会允许租户绕过任何多租户工作和权限限制,因为它们可能会使用 Argo CD 向应用程序授予的权限提升其权限。要防止这种情况,您必须了解通过 Red Hat OpenShift GitOps Operator 安装的 Argo CD 的权限模型,以及如何使用 OpenShift GitOps 成功进行应用程序交付。
1.2.1. Argo CD 基于角色的访问控制(RBAC) 复制链接链接已复制到粘贴板!
Red Hat OpenShift GitOps 中的访问控制以两个不同的级别管理,如下所示:
- 在 Kubernetes 级别中,GitOps Argo CD Application Controller 与一个或多个集群交互,通过使用每个集群的单个 Kubernetes 服务帐户来部署各种资源。此服务帐户必须具有足够的权限来为这个 Argo CD 实例管理的所有租户和用例部署资源。
- 在 Argo CD 级别,GitOps Argo CD Application Controller 包括自己的 RBAC 权限模型,独立于 Kubernetes。要管理用户级别访问权限,您可以独立于底层 Kubernetes 权限使用此 RBAC 模型。您可以使用此功能来提供用户从纯 Kubernetes 视角无法访问 Argo CD 应用程序的访问权限。
由于这两个访问控制和组件之间的交互是不同的和独立的,因此在使用 Argo CD 设计多租户解决方案时,权限升级会成为问题。当租户利用应用控制器的服务帐户的权限增加时,特权升级是执行通常不允许执行的操作。您可以使用 Argo CD RBAC 或单独的 Argo CD 实例缓解 Argo CD 实例中特权升级。
1.2.2. Argo CD 项目 复制链接链接已复制到粘贴板!
Argo CD 项目(而不是与 OpenShift Container Platform 项目混淆)提供了一种将应用程序分组到一起的方法。使用 Argo CD 项目,您可以指定 Applications 对可部署哪些资源以及可以部署哪些资源的限制。另外,您可以通过在项目级别和 Argo CD 自定义资源(CR)中的全局级别定义它们来启用 Argo CD 基于角色的访问控制(RBAC)规则和权限。
虽然您可以在 Operator 的 Argo CD CR 中全局定义租户 RBAC,但您应该在 AppProject CR 中定义租户 RBAC 和限制。
如果您有大量租户,尝试管理带有全局 RBAC 的所有租户可能会导致大量重复。
如果您有许多租户实例,则一些项目配置可能在租户项目之间很常见。要减少重复操作并最小化维护,请将全局项目用于常见配置,并在租户项目中继承它们。
始终定义您的项目,且不要使用 Operator 通过 Argo CD 安装创建的默认项目。