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는 url과 cluster 필드를 파라미터로 템플릿에 전달해요. 두 번째 환경을 추가하고 싶다면 두 번째 element의 주석을 해제하면 되고, ApplicationSet 컨트롤러가 정의된 애플리케이션으로 자동으로 그 환경을 대상으로 삼아요.
ApplicationSet v0.1.0 릴리스에서는 url과 cluster 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)
- Matrix generator — generator 조합.
- Template — 생성된 파라미터 렌더링 규칙.