ApplicationSet 컨트롤러가 지원하는 사용 사례
ApplicationSet 컨트롤러가 지원하는 사용 사례 (Use cases supported by the ApplicationSet controller)
generator 개념으로 ApplicationSet 컨트롤러는 Argo CD Application의 템플릿화와 수정을 자동화하는 강력한 도구 집합을 제공해요. generator는 Argo CD 클러스터와 Git 리포지토리 등 다양한 소스에서 템플릿 파라미터 데이터를 생성해 새로운 사용 사례를 지원하고 가능하게 해요.
출처: 문서
본문
이 도구들은 원하는 어떤 목적으로든 사용될 수 있지만, 여기서는 ApplicationSet 컨트롤러가 지원하도록 설계된 구체적인 사용 사례 몇 가지를 소개할게요.
사용 사례: 클러스터 애드온 (cluster add-ons)
ApplicationSet 컨트롤러의 초기 설계 초점 중 하나는 인프라 팀의 Kubernetes 클러스터 관리자가 많은 수의 클러스터에 걸쳐 크고 다양한 Argo CD Application 집합을 자동으로 만들고, 그 Application들을 단일 단위로 관리할 수 있게 하는 것이었어요. 이것이 필요한 이유 중 하나가 _클러스터 애드온 사용 사례_예요.
_클러스터 애드온 사용 사례_에서 관리자는 하나 이상의 Kubernetes 클러스터에 클러스터 애드온을 프로비저닝하는 책임을 가져요. 클러스터 애드온은 Prometheus operator 같은 오퍼레이터나, Argo ecosystem의 일부인 argo-workflows controller 같은 컨트롤러를 말해요.
보통 이런 애드온은 개발 팀의 애플리케이션에 필요해요(멀티테넌트 클러스터의 테넌트로서, 예를 들어 Prometheus에 메트릭 데이터를 제공하거나 Argo Workflows로 워크플로를 오케스트레이션하기를 원할 수 있어요).
이런 애드온 설치에는 개별 개발 팀이 갖지 못한 클러스터 수준 권한이 필요하므로 설치는 조직의 인프라/운영 팀 책임이에요. 대규모 조직에서 이 팀은 수십, 수백, 수천 개의 Kubernetes 클러스터를 담당할 수 있어요(새 클러스터가 정기적으로 추가/수정/제거됨).
많은 수의 클러스터에 걸쳐 확장하고 새 클러스터의 수명 주기에 자동으로 대응해야 하는 필요성은 필연적으로 어떤 형태의 자동화를 요구해요. 추가 요구사항은 특정 기준(예: staging vs production)을 사용해 클러스터의 부분집합에 애드온을 타겟팅하는 것을 허용하는 것이에요.
이 예시에서 인프라 팀은 Argo Workflows 컨트롤러와 Prometheus operator의 애플리케이션 매니페스트를 담은 Git 리포지토리를 유지 관리해요.
인프라 팀은 이 두 애드온을 Argo CD를 사용해 많은 수의 클러스터에 배포하고, 새 클러스터의 생성/삭제도 쉽게 관리하길 원해요.
이 사용 사례에서 ApplicationSet 컨트롤러의 List, Cluster, 또는 Git generator를 사용해 필요한 동작을 제공할 수 있어요:
- List generator: 관리자는 애플리케이션(Workflows와 Prometheus)마다 하나씩 두 개의
ApplicationSet리소스를 유지하고, 각 리소스의 List generator 요소 안에 타겟팅하려는 클러스터 목록을 포함해요.- 이 generator로 클러스터를 추가/제거하려면
ApplicationSet리소스의 list 요소를 수동으로 업데이트해야 해요.
- 이 generator로 클러스터를 추가/제거하려면
- Cluster generator: 관리자는 애플리케이션(Workflows와 Prometheus)마다 하나씩 두 개의
ApplicationSet리소스를 유지하고, 모든 새 클러스터가 Argo CD에 정의되도록 보장해요.- Cluster generator는 Argo CD에 정의된 클러스터를 자동으로 감지·타겟팅하므로, Argo CD에서 클러스터를 추가/제거하면 ApplicationSet 컨트롤러가 (각 애플리케이션에 대한) Argo CD Application 리소스를 자동으로 생성하게 해요.
- Git generator: Git generator는 generator 중 가장 유연/강력하므로 이 사용 사례를 다루는 여러 다른 방법이 있어요. 몇 가지:
- Git generator
files필드 사용: 클러스터 목록이 Git 리포지토리 안의 JSON 파일로 유지돼요. Git 커밋을 통한 JSON 파일 업데이트는 새 클러스터가 추가/제거되게 해요. - Git generator
directories필드 사용: 각 대상 클러스터에 대해, 그 이름의 대응하는 디렉토리가 Git 리포지토리에 존재해요. Git 커밋을 통한 디렉토리 추가/수정은 디렉토리 이름을 공유하는 클러스터에 대한 업데이트를 트리거해요.
- Git generator
각 generator에 대한 자세한 내용은 generators 섹션을 참고하세요.
사용 사례: monorepos
_monorepo 사용 사례_에서 Kubernetes 클러스터 관리자는 단일 Git 리포지토리에서 단일 Kubernetes 클러스터의 전체 상태를 관리해요.
Git 리포지토리에 병합된 매니페스트 변경은 클러스터에 자동으로 배포되어야 해요.
이 예시에서 인프라 팀은 Argo Workflows 컨트롤러와 Prometheus operator의 애플리케이션 매니페스트를 담은 Git 리포지토리를 유지 관리해요. 독립 개발 팀도 클러스터에 배포하려는 추가 서비스를 추가했어요.
Git 리포지토리에 대한 변경(예: 배포된 아티팩트 버전 업데이트)은 Argo CD가 해당 Kubernetes 클러스터에 그 업데이트를 자동으로 적용하게 해야 해요.
Git generator가 이 사용 사례를 지원하는 데 사용될 수 있어요:
- Git generator
directories필드는 배포할 개별 애플리케이션을 담고 있는 특정 하위 디렉토리(와일드카드 사용)를 지정하는 데 사용될 수 있어요. - Git generator
files필드는 배포할 개별 애플리케이션을 설명하는 JSON 메타데이터를 담고 있는 Git 리포지토리 파일을 참조할 수 있어요. - 자세한 내용은 Git generator 문서를 참고하세요.
사용 사례: 멀티테넌트 클러스터에서 Argo CD Application 셀프 서비스 (self-service of Argo CD Applications on multitenant clusters)
_셀프 서비스 사용 사례_는 개발자(멀티테넌트 Kubernetes 클러스터의 최종 사용자)에게 다음을 더 큰 유연성을 제공하려고 해요:
- Argo CD를 사용해 자동화된 방식으로 단일 클러스터에 여러 애플리케이션 배포
- Argo CD를 사용해 자동화된 방식으로 여러 클러스터에 배포
- 하지만 두 경우 모두, 클러스터 관리자를 개입시키지 않고(그들을 대신해 필요한 Argo CD Application/AppProject 리소스를 만들 필요 없이) 그 개발자들이 할 수 있게 하는 것
이 사용 사례의 한 가지 가능한 해결책은 개발 팀이 배포하려는 매니페스트를 담고 있는 Git 리포지토리 안에 app-of-apps 패턴으로 Argo CD Application 리소스를 정의하고, 클러스터 관리자가 merge requests로 이 리포지토리의 변경을 검토/수락하게 하는 것이에요.
이것은 효과적인 해결책처럼 들릴 수 있지만, 큰 단점은 Argo CD Application spec 변경을 포함하는 커밋을 수락하는 데 높은 수준의 신뢰/심사가 필요하다는 것이에요. Application spec 안에는 project, cluster, namespace를 포함한 많은 민감한 필드가 있기 때문이에요. 부주의한 merge는 애플리케이션이 속하지 않는 네임스페이스/클러스터에 접근하게 할 수 있어요.
따라서 셀프 서비스 사용 사례에서 관리자는 Application spec의 일부 필드만 개발자가 제어하게 하기를 원해요(예: Git 소스 리포지토리) 하지만 다른 필드는 그렇지 않게 하죠(예: 대상 네임스페이스나 대상 클러스터는 제한해야 함).
다행히 ApplicationSet 컨트롤러는 이 사용 사례에 대한 대안적 해결책을 제시해요. 클러스터 관리자는 template 필드로 애플리케이션 리소스 배포를 고정 값으로 제한하는 Git generator를 포함한 ApplicationSet 리소스를 안전하게 만들고, 개발자가 '안전한' 필드를 자유롭게 커스터마이즈하게 할 수 있어요.
config.json 파일은 앱을 설명하는 정보를 담고 있어요.
{
(...)
"app": {
"source": "https://github.com/argoproj/argo-cd",
"revision": "HEAD",
"path": "applicationset/examples/git-generator-files-discovery/apps/guestbook"
}
(...)
}
kind: ApplicationSet
# (...)
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
generators:
- git:
repoURL: https://github.com/argoproj/argo-cd.git
files:
- path: "apps/**/config.json"
template:
spec:
project: dev-team-one # project is restricted
source:
# developers may customize app details using JSON files from above repo URL
repoURL: {{.app.source}}
targetRevision: {{.app.revision}}
path: {{.app.path}}
destination:
name: production-cluster # cluster is restricted
namespace: dev-team-one # namespace is restricted
자세한 내용은 Git generator를 참고하세요.