

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# Argo CD 프로젝트 작업
<a name="argocd-projects"></a>

Argo CD 프로젝트(AppProject)에서는 애플리케이션에 대한 논리적 그룹화 및 액세스 제어를 제공합니다. 프로젝트에서는 애플리케이션이 사용할 수 있는 Git 리포지토리, 대상 클러스터 및 네임스페이스를 정의하여 공유되는 Argo CD 인스턴스에서 다중 테넌시 및 보안 경계를 지원합니다.

## 프로젝트 사용 시점
<a name="_when_to_use_projects"></a>

프로젝트를 사용하여 다음을 수행합니다.
+ 팀, 환경 또는 사업부별로 애플리케이션 분리
+ 팀이 배포할 수 있는 리포지토리 제한
+ 팀이 배포할 수 있는 클러스터 및 네임스페이스 제한
+ 리소스 할당량 및 허용된 리소스 유형 적용
+ 가드레일을 사용하여 셀프 서비스 애플리케이션 배포 제공

## 기본 프로젝트
<a name="_default_project"></a>

모든 Argo CD 기능에는 모든 리포지토리, 클러스터 및 네임스페이스에 대한 액세스를 허용하는 `default` 프로젝트가 포함되어 있습니다. 초기 테스트에는 유용하지만 프로덕션 사용에 대한 명시적 제한 사항이 있는 전용 프로젝트를 생성합니다.

기본 프로젝트 구성 및 이를 제한하는 방법에 대한 자세한 내용은 Argo CD 설명서의 [The Default Project](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#the-default-project)를 참조하세요.

## 프로젝트 만들기
<a name="_create_a_project"></a>

클러스터에 `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'

  # 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
```

## 프로젝트 구성
<a name="_project_configuration"></a>

### 소스 리포지토리
<a name="_source_repositories"></a>

이 프로젝트의 애플리케이션이 사용할 수 있는 Git 리포지토리를 제어합니다.

```
spec:
  sourceRepos:
    - 'https://github.com/my-org/app-*'  # Wildcard pattern
    - 'https://github.com/my-org/infra'  # Specific repo
```

와일드카드 및 부정 패턴(`!` 접두사)을 사용하여 특정 리포지토리를 허용하거나 거부할 수 있습니다. 자세한 내용은 Argo CD 설명서의 [Managing Projects](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects)를 참조하세요.

### 대상 제한 사항
<a name="_destination_restrictions"></a>

애플리케이션을 배포할 수 있는 위치를 제한합니다.

```
spec:
  destinations:
    - name: prod-cluster  # Specific cluster by name
      namespace: production
    - name: '*'  # Any cluster
      namespace: team-a-*  # Namespace pattern
```

**중요**  
프로덕션 프로젝트에 대해 와일드카드 대신 특정 클러스터 이름과 네임스페이스 패턴을 사용합니다. 그러면 권한 없는 클러스터 또는 네임스페이스에 실수로 배포되는 것을 방지할 수 있습니다.

와일드카드 및 부정 패턴을 사용하여 대상을 제어할 수 있습니다. 자세한 내용은 Argo CD 설명서의 [Managing Projects](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#managing-projects)를 참조하세요.

### 리소스 제한
<a name="_resource_restrictions"></a>

배포할 수 있는 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
```

## 프로젝트에 애플리케이션 할당
<a name="_assign_applications_to_projects"></a>

애플리케이션을 생성할 때 `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
```

지정된 프로젝트가 없는 애플리케이션은 `default` 프로젝트를 사용합니다.

## 프로젝트 역할 및 RBAC
<a name="_project_roles_and_rbac"></a>

프로젝트는 세분화된 액세스 제어를 위해 사용자 지정 역할을 정의할 수 있습니다. 기능 구성의 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](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#project-roles)를 참조하세요.

## 일반적인 패턴
<a name="_common_patterns"></a>

### 환경 기반 프로젝트
<a name="_environment_based_projects"></a>

각 환경에 대해 별도의 프로젝트를 생성합니다.

```
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
```

### 팀 기반 프로젝트
<a name="_team_based_projects"></a>

팀을 전용 프로젝트로 격리합니다.

```
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: '*'
```

### 다중 클러스터 프로젝트
<a name="_multi_cluster_projects"></a>

일관된 정책을 사용하여 여러 클러스터에 배포합니다.

```
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
```

## 모범 사례
<a name="_best_practices"></a>

 **제한적인 프로젝트로 시작**: 광범위한 액세스로 시작하는 대신, 적은 권한으로 시작하고 필요에 따라 확장합니다.

 **네임스페이스 패턴 사용**: 네임스페이스 제한 사항(예: `team-a-*`)에서 와일드카드를 활용하여 경계를 유지하면서 유연하게 작동합니다.

 **프로덕션 프로젝트 분리**: 보다 엄격한 제어 및 수동 동기화 정책을 통해 프로덕션 전용 프로젝트를 사용합니다.

 **문서 프로젝트 목적**: `description` 필드를 사용하여 각 프로젝트의 용도와 이를 사용해야 하는 사용자를 설명합니다.

 **정기적으로 프로젝트 권한 검토**: 정기적으로 프로젝트를 감사하여 제한 사항이 팀 요구 사항 및 보안 요구 사항에 여전히 부합하도록 보장합니다.

## 추가 리소스
<a name="_additional_resources"></a>
+  [Argo CD 권한 구성](argocd-permissions.md) - RBAC 및 Identity Center 통합 구성
+  [애플리케이션 생성](argocd-create-application.md) - 프로젝트 내에서 애플리케이션 생성
+  [ApplicationSet 사용](argocd-applicationsets.md) - 다중 클러스터 배포를 위해 프로젝트와 함께 ApplicationSet 사용
+  [Argo CD 프로젝트 설명서](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/) - 전체 업스트림 참조