Skip to content

ApplicationSet 控制器简介

简介

ApplicationSet 控制器是一个Kubernetes 控制器,它增加了对 "ApplicationSet"CustomResourceDefinition (CRD) 的支持。该控制器/CRD 可实现自动化和更大的灵活性,在大量集群和单核中管理Argo CD应用程序,还可在多租户 Kubernetes 集群上实现自服务使用。

ApplicationSet 控制器与现有的 [Argo CD 安装](.../.../index.md)一起工作。 Argo CD 是一个声明式的 GitOps 持续交付工具,它允许开发人员在现有的 Git 工作流中定义和控制 Kubernetes 应用程序资源的部署。

从 Argo CD v2.3 版开始,ApplicationSet 控制器与 Argo CD 捆绑。

ApplicationSet 控制器是 Argo CD 的补充,增加了更多支持集群管理员的功能。 ApplicationSet 控制器提供以下功能:

  • 通过 Argo CD,使用单个 Kubernetes 配置清单就能瞄准多个 Kubernetes 集群
  • 通过 Argo CD,可使用单个 Kubernetes 配置清单从一个或多个 Git 仓库部署多个应用程序
  • 改进了对 monorepos 的支持:在 Argo CD 中,monorepo 是指在单个 Git 仓库中定义的多个 Argo CD 应用程序资源。
  • 在多租户集群中,提高了单个集群租户使用 Argo CD 部署应用程序的能力(无需集群管理员启用目标集群/名称空间)。

注意 在被引用之前,请了解 ApplicationSet 的 安全影响

ApplicationSet 资源

本例定义了一个新的 guestbook 资源,其类型为 ApplicationSet

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  generators:
  - list:
      elements:
      - cluster: engineering-dev
        url: https://1.2.3.4
      - cluster: engineering-prod
        url: https://2.4.6.8
      - cluster: finance-preprod
        url: https://9.8.7.6
  template:
    metadata:
      name: '{{.cluster}}-guestbook'
    spec:
      project: my-project
      source:
        repoURL: https://github.com/infra-team/cluster-deployments.git
        targetRevision: HEAD
        path: guestbook/{{.cluster}}
      destination:
        server: '{{.url}}'
        namespace: guestbook

在这个示例中,我们要将我们的 guestbook 应用程序(该应用程序的 Kubernetes 资源来自 Git,因为这是 GitOps)部署到 Kubernetes 集群列表(目标集群列表定义在 ApplicationSet 资源的 List items 元素中)。

虽然有多种类型的_生成器可与 ApplicationSet 资源一起使用,但本示例使用的是 List 生成器,它只包含一个固定的、字面意义上的目标集群列表。 一旦 ApplicationSet 控制器处理了 ApplicationSet 资源,该集群列表将成为 Argo CD 部署 guestbook 应用程序资源的集群。

生成器(如 List 生成器)负责生成_参数_。 参数是键值对,在模板渲染过程中被替换到 ApplicationSet 资源的 "template: "部分。

ApplicationSet 控制器目前支持多种生成器:

  • 列表生成器:根据集群名称/URL 值的固定列表生成参数,如上例所示。
  • 集群生成器:集群生成器不会像列表生成器那样生成一个字面意义上的集群列表,而是根据 Argo CD 中定义的集群自动生成集群参数。
  • Git 生成器:Git 生成器根据生成器资源中定义的 Git 仓库中包含的文件或文件夹生成参数。
    • 包含 JSON 值的文件将被解析并转换为模板参数。
    • Git 仓库中的单个目录路径也可被引用为参数值。
  • 矩阵生成器:矩阵生成器结合了其他两个生成器生成的参数。

有关单个生成器和其他未列出的生成器的更多信息,请参阅[生成器部分](Generators.md)。

将参数替换为模板

无论使用哪种生成器,生成器生成的参数都会被替换到 "ApplicationSet "资源的 "template: "部分中的"{{参数名}}"值中。 在本例中,List 生成器定义了 "集群 "和 "url "参数,然后将其分别替换到模板的"{{集群}}"和"{{url}}"值中。

替换后,这个 guestbook``ApplicationSet 资源就会应用到 Kubernetes 集群:

1.ApplicationSet 控制器会处理生成器条目,生成一组模板参数。 2.这些参数被替换到模板中,每组参数替换一次。 3.每个呈现的模板都会转换成 Argo CDApplication 资源,然后在 Argo CD namespace 中创建(或更新)。 4.最后,Argo CD 控制器会收到这些 "应用 "资源的通知,并负责处理它们。

在我们的示例中定义了三个不同的集群--"engineering-dev"、"engineering-prod "和 "finance-preprod"--这将产生三个新的 Argo CD "Application "资源:每个集群一个。

下面是为位于 1.2.3.4engineering-dev 集群创建的其中一个 Application 资源的示例:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: engineering-dev-guestbook
spec:
  source:
    repoURL: https://github.com/infra-team/cluster-deployments.git
    targetRevision: HEAD
    path: guestbook/engineering-dev
  destination:
    server: https://1.2.3.4
    namespace: guestbook

我们可以看到,生成的值已被替换到模板的 serverpath 字段中,模板已被渲染成一个完整的 Argo CD 应用程序。

现在在 Argo CD UI 中也能看到应用程序:

Argo CD Web UI 中的列表生成器示例

ApplicationSet 控制器将确保对 "ApplicationSet "资源所做的任何更改、更新或删除都会自动应用到相应的 "Application"。

例如,如果在列表生成器中添加了一个新的集群/URL 列表条目,就会相应地为这个新的集群创建一个新的 Argo CD Application 资源。 对guestbook```ApplicationSet资源所做的任何编辑都会影响到该资源实例化的所有 Argo CD 应用程序,包括新的应用程序。

虽然列表生成器的集群字面列表相当简单,但 ApplicationSet 控制器中的其他可用生成器可以支持更复杂的情况。