본문 바로가기

cicd/ArgoCD

ArgoCD의 project(AppProject)에 대해

 

공식 문서: https://argo-cd.readthedocs.io/en/stable/user-guide/projects/

공식문서를 참고하여 정리한 글입니다. 

 

 

 

 

Project

애플리케이션을 논리적으로 그룹화하여 여러 팀에서 ArgoCD를 사용할 때 유용함 

=> 여러 팀이 있을 때 사용하면 매우 유용하다! 

 

 

Application의 Project 변경(설정) 하는 법

argocd app set <앱이름> --project <프로젝트이름>

 

 

기능

1. Git 레포지토리를 선택해서 배포할 수 있는 항목을 제한할 수 있다. 

2. 앱이 배포될 위치(대상 클러스터 및 네임스페이스)를 제한한다. 

3. 배포 가능한 리소스의 종류를 제한한다(CRD, DeamonSet 등의 위험한 리소스는 배포 금지)
4. 역할 지정이 가능하다. (사용자/토큰만 해당 project에 앱을 만들고 배포할 수 있게 한다)

 

 

기본(default) Project

기본적으로 Applicaion은 default project에 생성된다. 

이때 default project는 수정은 가능하나 삭제할 수 없다. 

spec:
  sourceRepos:
  - '*'
  destinations:
  - namespace: '*'
    server: '*'
  clusterResourceWhitelist:
  - group: '*'
    kind: '*'

모든 Git의 레포지토리를 허용 

모든 클러스터와 네임스페이스에 배포 가능 

모든 클러스터 리소스에 접근 가능 

만약 sourceRepos: [] 로 바꾸면 권한이 사라진다. 

 

 

1. sourceRepos 변경하는 법

# source 추가 
argocd proj add-source <PROJECT> <REPO>
argocd proj remove-source <PROJECT> <REPO>


# source 삭제
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: default
spec:
  sourceRepos: []
  sourceNamespaces: []
  destinations: []
  namespaceResourceBlacklist:
  - group: '*'
    kind: '*'


# source 부정 
argocd proj add-source <PROJECT> !<REPO>
argocd proj remove-source <PROJECT> !<REPO>
---
spec:
  sourceRepos:
    - '!ssh://git@GITHUB.com:argoproj/test'
    - '!https://gitlab.com/group/**'
    - '*'

참고로 !* 이런식으로 사용은 불가능하다. 

 

 

2. 클러스터, 네임스페이스 관리 

# 클러스터, 네임스페이스 설정 
argocd proj add-destination <PROJECT> <CLUSTER>,<NAMESPACE>
argocd proj remove-destination <PROJECT> <CLUSTER>,<NAMESPACE


# 클러스터, 네임스페이스 부정 
argocd proj add-destination <PROJECT> !<CLUSTER>,!<NAMESPACE>
argocd proj remove-destination <PROJECT> !<CLUSTER>,!<NAMESPACE>


# 예시
spec:
  destinations:
  - namespace: '!kube-system'
    server: '*'
  - namespace: '*'
    server: '!https://team1-*'
  - namespace: '*'
    server: '*'

 

 

3. 리소스 종류 제한 

argocd proj allow-cluster-resource <PROJECT> <GROUP> <KIND>
argocd proj allow-namespace-resource <PROJECT> <GROUP> <KIND>
argocd proj deny-cluster-resource <PROJECT> <GROUP> <KIND>
argocd proj deny-namespace-resource <PROJECT> <GROUP> <KIND>

클러스터 범위는 기본적으로 차단되어 있고, 네임스페이스 범위는 기본적으로 허용 되어있다. 

따라서 이런 제한이 필요한 경우 클러스터 리소스는 추가해주고, 네임스페이스 리소스는 거부해주면 된다. 

(Namespace 리소스는 보안 위험도가 낮기 때문!)

 

 

4. 역할 지정 

프로젝트의 역할 별로 다른 액세스 권한(정책)을 부여할 수 있다. 

이 정책은 RBAC 패턴을 따른다. 

spec:
  ...
  roles:
  - name: custom-project-role
    description: The "custom-project-role" will be applied to the `some-user` group.
    groups:
    - some-user
    policies:
    - p, proj:sample-test-project:custom-project-role, applications, *, *, allow
  ...

역할 관련 명령어 

argocd proj role list <프로젝트명>
argocd proj role get <프로젝트명> <역할명>
argocd proj role create <프로젝트명> <역할명>
argocd proj role delete <프로젝트명> <역할명>
argocd proj role add-policy <프로젝트명> <정책명> "p, proj: ... allow"
argocd proj role remove-policy <프로젝트명> <정책명> "p, proj: ... allow"

 

 

JWT 토큰 (JSON Web Token)

role을 사용하기 위한 신분증 같은 것으로, Policy와 직접 연결되어 있다. 

argocd proj role create-token PROJECT ROLE-NAME
argocd proj role delete-token PROJECT ROLE-NAME ISSUED-AT

이 토큰은 ArgoCD에 저장되지 않고, 생성 시에만 가져올 수 있다. 

그리고 이 토큰은 필수적이다. 다만 CLI가 자동으로 저장된 토큰을 API 요청에 같이 보내기 때문에 쓰지 않아도 되었던 것 

 

# App에 get 접근 권한 추가 후 get 명령어 
argocd proj role add-policy $PROJ $ROLE --action get --permission allow --object $APP
argocd app get $APP --auth-token $JWT


# 정책에서 get 권한 제거 (app만)
argocd proj role remove-policy $PROJ $ROLE -a get -o $APP
# 정책에서 get 권한 추가 (모든 app)
argocd proj role add-policy $PROJ $ROLE -a get --permission allow -o '*'

 

 

글로벌 프로젝트

다른 프로젝트에서 상속할 수 있게 구성한 것 

자세한 내용은 공식 문서 참고