ApplicationSet 컨트롤러 소개
ApplicationSet 컨트롤러 소개 (Introduction to ApplicationSet controller)
ApplicationSet 컨트롤러는 ApplicationSet 커스텀 리소스 정의(CRD)를 지원하는 Kubernetes 컨트롤러예요. 단일 매니페스트로 여러 클러스터와 모노레포 전반의 Argo CD 애플리케이션을 자동화하고 더 유연하게 관리할 수 있게 해줘요.
출처: 문서
본문
소개 (Introduction)
ApplicationSet 컨트롤러는 ApplicationSet CustomResourceDefinition (CRD)에 대한 지원을 추가하는 Kubernetes 컨트롤러예요. 이 컨트롤러/CRD는 많은 클러스터와 모노레포 내에서 Argo CD 애플리케이션을 관리하는 자동화와 더 큰 유연성을 모두 가능하게 하며, 멀티테넌트 Kubernetes 클러스터에서 셀프 서비스 사용도 가능하게 해요.
ApplicationSet 컨트롤러는 기존 Argo CD 설치와 함께 작동해요. Argo CD는 개발자가 기존 Git 워크플로우 내에서 Kubernetes 애플리케이션 리소스의 배포를 정의하고 제어할 수 있게 하는 선언적 GitOps 지속적 전달 도구예요.
Argo CD v2.3부터 ApplicationSet 컨트롤러는 Argo CD에 번들로 포함되어 있어요.
ApplicationSet 컨트롤러는 클러스터 관리자 중심 시나리오를 지원하는 추가 기능을 제공해 Argo CD를 보완해요. ApplicationSet 컨트롤러는 다음을 제공해요:
- 단일 Kubernetes 매니페스트를 사용해 Argo CD로 여러 Kubernetes 클래스를 대상으로 지정할 수 있는 기능
- 단일 Kubernetes 매니페스트를 사용해 하나 또는 여러 Git 리포지토리의 여러 애플리케이션을 Argo CD로 배포할 수 있는 기능
- 모노레포에 대한 향상된 지원: Argo CD 맥락에서 모노레포는 단일 Git 리포지토리 안에 정의된 여러 Argo CD Application 리소스를 의미해요
- 멀티테넌트 클러스터 내에서 개별 클러스터 테넌트가 (대상 클러스터/네임스페이스를 활성화하기 위해 권한이 있는 클러스터 관리자를 참여시킬 필요 없이) Argo CD를 사용해 애플리케이션을 배포할 수 있는 능력 향상
참고
ApplicationSet을 사용하기 전에 보안 영향(Security implications)을 인지하세요.
ApplicationSet 리소스 (The ApplicationSet resource)
다음 예제는 ApplicationSet kind의 새 guestbook 리소스를 정의해요:
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 애플리케이션을 (GitOps이므로 이 애플리케이션의 Kubernetes 리소스는 Git에서 나와요) Kubernetes 클러스터 목록에 배포하고 싶어요 (ApplicationSet 리소스의 List items 요소에 대상 클러스터 목록이 정의되어 있어요).
ApplicationSet 리소스와 함께 사용할 수 있는 생성기(generator) 유형은 여러 가지가 있지만, 이 예제는 대상으로 할 클러스터의 고정된 리터럴 목록을 포함하는 List 생성기를 사용해요. ApplicationSet 컨트롤러가 ApplicationSet 리소스를 처리하면 이 클러스터 목록이 Argo CD가 guestbook 애플리케이션 리소스를 배포하는 클러스터가 돼요.
List 생성기와 같은 생성기는 *파라미터(parameters)*를 생성할 책임이 있어요. 파라미터는 템플릿 렌더링 중에 ApplicationSet 리소스의 template: 섹션에 대입되는 키-값 쌍이에요.
ApplicationSet 컨트롤러가 현재 지원하는 생성기는 여러 가지가 있어요:
- List 생성기: 위 예제에서 본 것처럼 클러스터 이름/URL 값의 고정 목록을 기반으로 파라미터를 생성해요.
- Cluster 생성기: (list 생성기처럼) 리터럴 클러스터 목록 대신, cluster 생성기는 Argo CD에 정의된 클러스터를 기반으로 클러스터 파라미터를 자동으로 생성해요.
- Git 생성기: Git 생성기는 생성기 리소스에 정의된 Git 리포지토리에 포함된 파일이나 폴더를 기반으로 파라미터를 생성해요.
- JSON 값을 포함하는 파일은 파싱되어 템플릿 파라미터로 변환돼요.
- Git 리포지토리 내의 개별 디렉터리 경로도 파라미터 값으로 사용할 수 있어요.
- Matrix 생성기: Matrix 생성기는 다른 두 생성기의 생성된 파라미터를 결합해요.
개별 생성기에 대한 자세한 내용과 위에 나열되지 않은 다른 생성기는 생성기 섹션(Generators)을 참고하세요.
템플릿으로의 파라미터 대입 (Parameter substitution into templates)
어떤 생성기를 사용하든 생성기가 생성한 파라미터는 ApplicationSet 리소스의 template: 섹션 안의 {{parameter name}} 값에 대입돼요. 이 예제에서 List 생성기는 cluster와 url 파라미터를 정의하고, 이 값은 각각 템플릿의 {{cluster}}와 {{url}} 값에 대입돼요.
대입 후 이 guestbook ApplicationSet 리소스가 Kubernetes 클러스터에 적용되는 과정은 다음과 같아요:
- ApplicationSet 컨트롤러가 생성기 항목을 처리해 템플릿 파라미터 집합을 생성해요.
- 이 파라미터가 각 파라미터 집합에 대해 템플릿에 한 번씩 대입돼요.
- 렌더링된 각 템플릿은 Argo CD
Application리소스로 변환되어 Argo CD 네임스페이스 내에 생성(또는 업데이트)돼요. - 마지막으로 Argo CD 컨트롤러는 이러한
Application리소스에 대해 알림을 받고 이를 처리할 책임이 있어요.
예제의 세 가지 다른 클러스터(engineering-dev, engineering-prod, finance-preprod)가 있으므로 각 클러스터마다 하나씩 세 개의 새 Argo CD Application 리소스가 생성돼요.
1.2.3.4의 engineering-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
생성된 값이 템플릿의 server와 path 필드에 대입되었고, 템플릿이 완전히 갖춰진 Argo CD Application으로 렌더링된 것을 확인할 수 있어요.
이제 이 애플리케이션들이 Argo CD UI에서도 보여요:

ApplicationSet 컨트롤러는 ApplicationSet 리소스에 대한 변경, 업데이트 또는 삭제가 해당 Application(들)에 자동으로 적용되도록 보장해요.
예를 들어 List 생성기에 새 클러스터/URL 목록 항목을 추가하면 이 새 클러스터에 대해 새로운 Argo CD Application 리소스가 그에 따라 생성돼요. guestbook ApplicationSet 리소스에 대한 편집은 해당 리소스로 인스턴스화된 모든 Argo CD 애플리케이션(새 Application 포함)에 영향을 미쳐요.
List 생성기의 리터럴 클러스터 목록은 비교적 단순하지만, ApplicationSet 컨트롤러에서 사용 가능한 다른 생성기들은 훨씬 더 정교한 시나리오를 지원해요.
더 알아보기 (Learn more)
- 각 생성기의 동작 방식을 살펴보고 싶다면 생성기(Generators) 문서를 참고하세요.
- ApplicationSet의 세부 스펙을 알고 싶다면 ApplicationSet 스펙(applicationset-specification) 문서를 함께 보세요.