List Generator

List Generator

List generator는 임의의 key/value 쌍 목록(값이 문자열인 경우)으로 파라미터를 생성해요. 간단히 element를 나열하면 ApplicationSet 컨트롤러가 그 각각에 대해 템플릿을 렌더링해 Application을 만들어요. Matrix generator와 조합하면 앞선 generator가 준 YAML/JSON으로 element를 동적으로 생성할 수도 있어요.

출처: 문서

본문

List generator는 임의의 key/value 쌍 목록(값이 문자열 값이기만 하면)을 기반으로 파라미터를 생성해요. 이 예시에서는 engineering-dev라는 로컬 클러스터를 대상으로 해요.

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook
  namespace: argocd
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  generators:
  - list:
      elements:
      - cluster: engineering-dev
        url: https://kubernetes.default.svc
      # - cluster: engineering-prod
      #   url: https://kubernetes.default.svc
  template:
    metadata:
      name: '{{.cluster}}-guestbook'
    spec:
      project: "my-project"
      source:
        repoURL: https://github.com/argoproj/argo-cd.git
        targetRevision: HEAD
        path: applicationset/examples/list-generator/guestbook/{{.cluster}}
      destination:
        server: '{{.url}}'
        namespace: guestbook

(전체 예시)

이 예시에서 List generator는 urlcluster 필드를 파라미터로 템플릿에 전달해요. 두 번째 환경을 추가하고 싶다면 두 번째 element의 주석을 해제하면 되고, ApplicationSet 컨트롤러가 정의된 애플리케이션으로 자동으로 그 환경을 대상으로 삼아요.

ApplicationSet v0.1.0 릴리스에서는 urlcluster element 필드(그리고 임의의 values)만 지정할 수 있었어요. ApplicationSet v0.2.0부터는 어떤 key/value element 쌍이든 지원돼요(v0.1.0 형식과도 완전히 하위 호환):

spec:
  generators:
  - list:
      elements:
        # v0.1.0 form - requires cluster/url keys:
        - cluster: engineering-dev
          url: https://kubernetes.default.svc
          values:
            additional: value
        # v0.2.0+ form - does not require cluster/URL keys
        # (but they are still supported).
        - staging: "true"
          gitRepo: https://kubernetes.default.svc   
# (...)

참고 — 클러스터는 Argo CD에 미리 정의되어 있어야 해요

이 값들에 대해 애플리케이션을 생성하려면 클러스터들이 Argo CD 안에 이미 정의되어 있어야 해요. ApplicationSet 컨트롤러는 Argo CD 안에서 클러스터를 만들지 않아요(예: 그렇게 할 자격 증명이 없어요).

동적으로 생성된 요소 (Dynamically generated elements)

List generator는 이전 generator(예: git)가 준 YAML/JSON을 바탕으로 element를 동적으로 생성할 수도 있어요. 두 generator를 matrix generator로 조합해서요. 이 예시에서는 git 다음에 list generator를 두는 matrix generator를 사용하고, git 안 파일의 내용을 list generator의 elementsYaml 필드 입력으로 전달해요.

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: elements-yaml
  namespace: argocd
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  generators:
  - matrix:
      generators:
      - git:
          repoURL: https://github.com/argoproj/argo-cd.git
          revision: HEAD
          files:
          - path: applicationset/examples/list-generator/list-elementsYaml-example.yaml
      - list:
          elementsYaml: "{{ .key.components | toJson }}"
  template:
    metadata:
      name: '{{.name}}'
    spec:
      project: default
      syncPolicy:
        automated:
          selfHeal: true    
        syncOptions:
        - CreateNamespace=true        
      sources:
        - chart: '{{.chart}}'
          repoURL: '{{.repoUrl}}'
          targetRevision: '{{.version}}'
          helm:
            releaseName: '{{.releaseName}}'
      destination:
        server: https://kubernetes.default.svc
        namespace: '{{.namespace}}'

여기서 list-elementsYaml-example.yaml의 내용은 다음과 같아요.

key:
  components:
    - name: component1
      chart: podinfo
      version: "6.3.2"
      releaseName: component1
      repoUrl: "https://stefanprodan.github.io/podinfo"
      namespace: component1
    - name: component2
      chart: podinfo
      version: "6.3.3"
      releaseName: component2
      repoUrl: "ghcr.io/stefanprodan/charts"
      namespace: component2

git 파일의 내용을 toJson으로 변환해 elementsYaml에 넘기면, 각 컴포넌트가 목록 요소가 되어 템플릿({{.name}}, {{.chart}} 등)이 그 값들로 렌더링돼요.

더 알아보기 (Learn more)