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 문서 - 완전한 업스트림 레퍼런스

더 알아보기 (Learn more)