第 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 实例用于集群配置,并将租户用例委派给其他命名空间中的一个或多个单独的实例。