Argo CD Projects 작업
Argo CD Projects 작업
Argo CD Projects(AppProject)로 애플리케이션을 구성하고 접근을 제어하는 방법을 설명합니다.
출처: 문서
본문
Argo CD Projects(AppProject)는 Application에 논리적 그룹화와 접근 제어를 제공합니다. 프로젝트는 Application이 사용할 수 있는 Git 리포지토리, 대상 클러스터, 네임스페이스를 정의하며, 공유 Argo CD 인스턴스에서 멀티 테넌시와 보안 경계를 가능하게 합니다.
프로젝트를 사용할 때
다음 용도로 프로젝트를 사용하세요.
- 팀, 환경, 사업부별로 애플리케이션 분리
- 팀이 배포할 수 있는 리포지토리 제한
- 팀이 배포할 수 있는 클러스터와 네임스페이스 제한
- 리소스 할당량과 허용된 리소스 유형 강제
- 가드레일과 함께 셀프 서비스 애플리케이션 배포 제공
기본 프로젝트(default project)
모든 Argo CD 캐퍼빌리티에는 모든 리포지토리, 클러스터, 네임스페이스에 접근을 허용하는 default 프로젝트가 포함됩니다. 초기 테스트에는 유용하지만, 프로덕션에서는 명시적 제한이 있는 전용 프로젝트를 만드세요. 기본 프로젝트 구성과 이를 제한하는 방법에 대한 자세한 내용은 Argo CD 문서의 The Default Project를 참고하세요.
프로젝트 생성
AppProject 리소스를 클러스터에 적용해 프로젝트를 만듭니다.
예시: 팀별 프로젝트
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: team-a
namespace: argocd
spec:
description: Applications for Team A
# Source repositories this project can deploy from
sourceRepos:
- 'https://github.com/my-org/team-a-*'
- 'https://github.com/my-org/shared-libs'
# Source namespaces (required for EKS capability)
sourceNamespaces:
- argocd
- team-a-dev
- team-a-prod
# Destination clusters and namespaces
destinations:
- name: dev-cluster
namespace: team-a-dev
- name: prod-cluster
namespace: team-a-prod
# Allowed resource types
clusterResourceWhitelist:
- group: ''
kind: Namespace
namespaceResourceWhitelist:
- group: 'apps'
kind: Deployment
- group: ''
kind: Service
- group: ''
kind: ConfigMap
프로젝트를 적용합니다.
kubectl apply -f team-a-project.yaml
프로젝트 구성
소스 리포지토리
이 프로젝트의 Application이 사용할 수 있는 Git 리포지토리를 제어합니다.
spec:
sourceRepos:
- 'https://github.com/my-org/app-*' # Wildcard pattern
- 'https://github.com/my-org/infra' # Specific repo
와일드카드와 부정 패턴(! 접두사)을 사용해 특정 리포지토리를 허용하거나 거부할 수 있습니다. 자세한 내용은 Argo CD 문서의 Managing Projects를 참고하세요.
소스 네임스페이스
EKS Argo CD 캐퍼빌리티를 사용할 때 커스텀 AppProject 정의에서 spec.sourceNamespaces 필드가 필수입니다. 이 필드는 이 프로젝트를 참조하는 Application이나 ApplicationSet을 포함할 수 있는 네임스페이스를 지정합니다.
중요
이는 EKS Argo CD 캐퍼빌리티의 필수 필드이며, 선택 필드인 OSS Argo CD와 다릅니다.
기본 AppProject 동작
default AppProject는 sourceNamespaces에 argocd 네임스페이스를 자동으로 포함합니다. 추가 네임스페이스에서 Application이나 ApplicationSet을 만들어야 한다면 sourceNamespaces 필드를 수정해 해당 네임스페이스를 추가하세요.
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: default
namespace: argocd
spec:
sourceNamespaces:
- argocd # Already included by default
- team-a-apps # Add additional namespaces as needed
- team-b-apps
커스텀 AppProject 구성
커스텀 AppProject를 만들 때는 argocd 시스템 네임스페이스와 Application이나 ApplicationSet을 만들 계획인 다른 네임스페이스를 수동으로 포함해야 합니다.
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: team-a-project
namespace: argocd
spec:
description: Applications for Team A
# Required: Manually specify all namespaces
sourceNamespaces:
- argocd # ArgoCD system namespace (required)
- team-a-dev # Custom namespace for dev Applications
- team-a-prod # Custom namespace for prod Applications
# Source repositories this project can deploy from
sourceRepos:
- 'https://github.com/my-org/team-a-*'
# Destination restrictions
destinations:
- namespace: 'team-a-*'
server: arn:aws:eks:us-west-2:111122223333:cluster/my-cluster # Use cluster ARN from: aws eks describe-cluster
참고
sourceNamespaces에서 네임스페이스를 생략하면 해당 네임스페이스에서 생성된 Application이나 ApplicationSet이 이 프로젝트를 참조할 수 없어 배포가 실패합니다.
대상 제한
Application이 배포할 수 있는 위치를 제한합니다.
spec:
destinations:
- name: prod-cluster # Specific cluster by name
namespace: production
- name: '*' # Any cluster
namespace: team-a-* # Namespace pattern
중요
프로덕션 프로젝트에서는 와일드카드 대신 특정 클러스터 이름과 네임스페이스 패턴을 사용하세요. 이렇게 하면 권한이 없는 클러스터나 네임스페이스에 실수로 배포되는 것을 방지할 수 있습니다.
와일드카드와 부정 패턴을 사용해 대상을 제어할 수 있습니다. 자세한 내용은 Argo CD 문서의 Managing Projects를 참고하세요.
리소스 제한
배포할 수 있는 Kubernetes 리소스 유형을 제어합니다.
클러스터 범위 리소스:
spec:
clusterResourceWhitelist:
- group: ''
kind: Namespace
- group: 'rbac.authorization.k8s.io'
kind: Role
네임스페이스 범위 리소스:
spec:
namespaceResourceWhitelist:
- group: 'apps'
kind: Deployment
- group: ''
kind: Service
- group: ''
kind: ConfigMap
- group: 's3.services.k8s.aws'
kind: Bucket
블랙리스트를 사용해 특정 리소스를 거부합니다.
spec:
namespaceResourceBlacklist:
- group: ''
kind: Secret # Prevent direct Secret creation
Application을 프로젝트에 할당
Application을 만들 때 spec.project 필드에 프로젝트를 지정합니다.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: team-a # Assign to team-a project
source:
repoURL: https://github.com/my-org/my-app
path: manifests
destination:
name: prod-cluster
namespace: team-a-prod
프로젝트를 지정하지 않은 Application은 default 프로젝트를 사용합니다.
프로젝트 역할과 RBAC
프로젝트는 세분화된 접근 제어를 위해 커스텀 역할을 정의할 수 있습니다. 누가 애플리케이션을 동기화, 업데이트, 삭제할 수 있는지 제어하도록 캐퍼빌리티 구성에서 프로젝트 역할을 AWS Identity Center 사용자와 그룹에 매핑하세요.
예시: 개발자와 관리자 역할이 있는 프로젝트
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: team-a
namespace: argocd
spec:
sourceRepos:
- '*'
destinations:
- name: '*'
namespace: 'team-a-*'
roles:
- name: developer
description: Developers can sync applications
policies:
- p, proj:team-a:developer, applications, sync, team-a/*, allow
- p, proj:team-a:developer, applications, get, team-a/*, allow
groups:
- team-a-developers
- name: admin
description: Admins have full access
policies:
- p, proj:team-a:admin, applications, *, team-a/*, allow
groups:
- team-a-admins
프로젝트 역할, CI/CD 파이프라인용 JWT 토큰, RBAC 구성에 대한 자세한 내용은 Argo CD 문서의 Project Roles를 참고하세요.
일반적인 패턴
환경 기반 프로젝트
각 환경에 대해 별도의 프로젝트를 만듭니다.
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: production
namespace: argocd
spec:
sourceRepos:
- 'https://github.com/my-org/*'
destinations:
- name: prod-cluster
namespace: '*'
# Strict resource controls for production
clusterResourceWhitelist: []
namespaceResourceWhitelist:
- group: 'apps'
kind: Deployment
- group: ''
kind: Service
팀 기반 프로젝트
전용 프로젝트로 팀을 격리합니다.
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: platform-team
namespace: argocd
spec:
sourceRepos:
- 'https://github.com/my-org/platform-*'
destinations:
- name: '*'
namespace: 'platform-*'
# Platform team can manage cluster resources
clusterResourceWhitelist:
- group: '*'
kind: '*'
멀티 클러스터 프로젝트
일관된 정책으로 여러 클러스터에 배포합니다.
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: global-app
namespace: argocd
spec:
sourceRepos:
- 'https://github.com/my-org/global-app'
destinations:
- name: us-west-cluster
namespace: app
- name: eu-west-cluster
namespace: app
- name: ap-south-cluster
namespace: app
모범 사례
- 제한적인 프로젝트로 시작 - 광범위한 접근으로 시작하는 대신 좁은 권한으로 시작해 필요에 따라 확장하세요.
- 네임스페이스 패턴 사용 - 경계를 유지하면서 유연성을 허용하려면 네임스페이스 제한에서 와일드카드(
team-a-*같은)를 활용하세요. - 프로덕션 프로젝트 분리 - 더 엄격한 제어와 수동 동기화 정책으로 프로덕션을 위한 전용 프로젝트를 사용하세요.
- 프로젝트 용도 문서화 -
description필드를 사용해 각 프로젝트의 용도와 사용자를 설명하세요. - 프로젝트 권한 정기 검토 - 제한이 여전히 팀 요구와 보안 요구 사항과 일치하는지 확인하기 위해 프로젝트를 주기적으로 감사하세요.
추가 리소스
- Argo CD 권한 구성 - RBAC와 Identity Center 통합 구성
- Application 생성 - 프로젝트 내에서 Application 생성
- ApplicationSet 사용 - 멀티 클러스터 배포를 위해 ApplicationSet을 프로젝트와 함께 사용
- Argo CD Projects 문서 - 완전한 업스트림 레퍼런스