본문 바로가기
CICD/ArgoCD

ArgoCD란? 개념부터 설치 배포까지

by wlsdn3004 2023. 5. 12.
728x90
반응형

 

ArgoCD란?


기존의 소프트웨어를 배포하고 관리하는 방식은 문제점이 많았다. 인프라 환경을 수동적으로 관리하고, 소프트웨어와 인프라를 따로 관리하는 경우가 많았기에 이로 인해 인프라와 소프트웨어 간의 불일치가 발생하게 되었고, 배포 및 운영 과정에서 문제가 발생할 가능성이 높았다.

 

이러한 기존의 접근 방식에 대한 대안으로 GitOps가 탄생했다.

GitOps는 Git 저장소를 사용하는 소프트웨어 배포 접근 방식이다. GitOps 방식은 인프라와 소프트웨어를 함께 관리하기 때문에 Git 버전 관리 시스템과 운영 환경 간의 일관성을 유지하여 소프트웨어 간의 불일치 문제를 해결한다. 또한 모든 코드와 인프라 변경 사항이 Git 저장소에 저장되기 때문에, 변경 내역을 추적하고 롤백을 쉽게 수행할 수 있다.

 

ArgoCD는 GitOps를 구현하기 위한 도구 중 하나로 Kubernetes 애플리케이션의 자동 배포를 위한 오픈소스 도구이다. Kubernetes 클러스터에 배포된 애플리케이션의 CI/CD 파이프라인에서 CD부분을 담당하며, Git 저장소에서 변경 사항을 감지하여 자동으로 Kubernetes 클러스터에 애플리케이션을 배포할 수 있다.

ArgoCD는 애플리케이션 배포를 위해 Declarative Application Management(선언적 애플리케이션 관리)를 사용한다. 이는 애플리케이션을 배포할 때 명시적으로 원하는 상태를 정의하고, 이를 ArgoCD가 클러스터의 상태와 비교하여 원하는 상태로 유지하도록 한다. 그렇기 때문에 애플리케이션 배포 및 관리 과정에서 발생할 수 있는 실수나 오류를 방지할 수 있다.

 

 

동작은 다음과 같다.

1. 사용자가 Git 저장소에 Push를 한다. 이때 Kubernetes에 배포 방식인 Helm 또는 Kustomize를 사용하기 때문에 해당 배포 방식의 구조로 Git 저장소에 Push 한다.

2. ArgoCD는 Git 저장소에 변경 상태를 감지한다.

3. 변경된 내용을 Kubernetes에 배포하여 반영한다.

 

 

본 글에서는 Github 저장소를 사용하여 ArgoCD를 통해 sample app을 배포하는 실습을 다룬다.

 

실습


전제 조건

  • AWS EKS 클러스터
  • Github 계정
  • Helm CLI 도구

설치 환경

  • AWS EKS v1.24.17
  • Helm v3.8.2

설치 버전

  • AgoCD 2.7.1

 

 

1. ArgoCD 설치


공식 홈페이지에서 제공하는 argocd yaml파일로 설치한다.

$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

 

설치 확인

$ kubectl get po -n argocd  -w
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          33s
argocd-applicationset-controller-6c99fd777c-m42zr   1/1     Running   0          34s
argocd-dex-server-7f6ffbc5ff-h8wtd                  1/1     Running   0          34s
argocd-notifications-controller-5c69bb9ff5-whfqc    1/1     Running   0          34s
argocd-redis-7666ff8889-x856g                       1/1     Running   0          34s
argocd-repo-server-b7b54f994-ht4g4                  1/1     Running   0          34s
argocd-server-85b5c46975-tcdt8                      1/1     Running   0          33s

 

초기 비밀번호 확인

$ kubectl get secret -n argocd argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
RjUoNSxRptYXsig-

 

초기 비밀번호 변경

argocd-server 파드로 접근하여 admin : "위 secrets 값"으로 로그인한다.

$ kubectl exec -it -n argocd deployment/argocd-server -- /bin/bash
$ argocd login localhost:8080
WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context 'localhost:8080' updated
Information Panel

참고

argocd-server 파드에는 argocd cli 명령도구가 있는데, 이 도구는 호스트에 따로 설치하여 사용할 수 있다.

 

로그인을 했으면 argocd cli 도구를 사용하여 비밀번호를 변경한다.

$ argocd account update-password
*** Enter password of currently logged in user (admin):  ## 초기 비밀번호
*** Enter new password for user admin:  	 ## 변경 비밀번호
*** Confirm new password for user admin:     ## 변경 비밀번호
Password updated
Context 'localhost:8080' updated

 

ArgoCD 대시보드를 확인하기 위해 kubectl port-forward를 하여 접근한다.

$ kubectl port-forward --address=0.0.0.0 svc/argocd-server -n argocd 8080:443

 

2. github 저장소에 샘플 Helm 차트 Push


샘플 Nginx Helm 차트를 생성한다.

$ helm create app
Creating app

$ ls
app

$ tree app
app
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

3 directories, 10 files

 

git 저장소에 Push 한다.

$ git add --all

$ git commit -am 'test helm chart'
 11 files changed, 405 insertions(+)
 create mode 100644 app/.helmignore
 create mode 100644 app/Chart.yaml
 create mode 100644 app/templates/NOTES.txt
 create mode 100644 app/templates/_helpers.tpl
 create mode 100644 app/templates/deployment.yaml
 create mode 100644 app/templates/hpa.yaml
 create mode 100644 app/templates/ingress.yaml
 create mode 100644 app/templates/service.yaml
 create mode 100644 app/templates/serviceaccount.yaml
 create mode 100644 app/templates/tests/test-connection.yaml
 create mode 100644 app/values.yaml

$ git push origin HEAD
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 2 threads
Compressing objects: 100% (15/15), done.
Writing objects: 100% (16/16), 5.52 KiB | 2.76 MiB/s, done.
Total 16 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.

 

3. ArgoCD Git 저장소 등록


ArgoCD 대시보드로 들어가서 Settings > Repositories를 누른다.

 

CONNECT REPO를 누른다.

 

아래와 같이 Git 저장소 정보를 입력 후 CONNECT를 누른다.

 

정상 등록이 되면 아래와 같이 CONNECTION STATUS부분에 Successful이 보인다.

 

4. Applications 배포


Applications > NEW APP을 누른다.

 

아래와 같이 입력하고 Namespace가 없으면 자동으로 생성되게 체크한다.

옵션 설명

  • SET DELETION FINALIZER : 애플리케이션을 삭제할 때 해당 애플리케이션과 관련된 Kubernetes 리소스의 finalizer 목록을 통해 삭제에 대한 의존성을 부여한다.
  • SKIP SCHEMA VALIDATION : 애플리케이션 매니페스트에 대한 YAML 스키마의 유효성 검사를 건너뛴다.
  • AUTO-CREATE NAMESPACE :  클러스터에 네임스페이스가 없는 경우 애플리케이션에 대한 네임스페이스를 자동으로 생성한다.
  • PRUNE LAST :  동기화 작업의 마지막 단계에서 현재 배포된 버전에 없는 리소스를 제거한다.
  • APPLY OUT OF SYNC ONLY : YAML 파일과 현재 클러스터 상태를 비교하여, 상태가 동기화되지 않은 리소스에 대해서만 업데이트하는 옵션이다.
  • RESPECT IGNORE DIFFERENCES : 배포된 애플리케이션 상태와 원하는 애플리케이션 상태(git) 간의 특정 필드의 차이점을 무시하여 반영할 수 있다.
  • SERVER-SIDE APPLY : 서버 측 적용 API를 사용하여 애플리케이션 매니페스트를 적용한다. 서버 측 적용 API는 Kubernetes API 서버에서 제공하는 API이다.

 

 

위에서 등록한 Git 저장소와 Helm차트 위치를 적절히 넣는다. 그리고 Kubernetes에 생성할 Namespace를 입력한다. Cluster URL에 쿠버네티스 service 정보는 ArgoCD가 설치되어 있는 클러스터 API 주소 정보이다.

 

위 Git 저장소의 Helm 차트가 정상적으로 읽히면 아래와 같이 Helm 부분에서 정보가 보인다.

아래 정보가 안 나오면 Git 저장소나 Helm 차트 내용을 못 읽어온 것이니 Git 저장소 정보 부분을 다시 확인해야 한다.

 

위 내용을 토대로 Applications을 생성하면 아래와 같이 보인다.

Auto SYNC를 활성화하지 않았기 때문에 수동으로 SYNC 하여 배포 진행한다.

 

 

배포가 완료되면 아래와 같이 상태가 Synced로 변경된다.

 

testapp을 눌러 들어가 보면 실제 배포된 쿠버네티스 오브젝트를 상세히 볼 수 있다.

 

실제로 kubectl 명령어로 조회하여 비교하면 배포 리소스가 동일한 걸 확인할 수 있다.

$ kubectl get all -n test
NAME                          READY   STATUS    RESTARTS   AGE
pod/testapp-c8c88cf59-kjc95   1/1     Running   0          11m

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/testapp   ClusterIP   10.100.127.54   <none>        80/TCP    11m

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/testapp   1/1     1            1           11m

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/testapp-c8c88cf59   1         1         1       11m

 

위 배포는 applications라는 CRD 형태로 배포가 된다.

$ kubectl get applications -n argocd
NAME      SYNC STATUS   HEALTH STATUS
testapp   Synced        Healthy

 

즉, 아래와 같이 application crd yaml을 생성하여 쿠버네티스에 배포하면 위와 동일한 결과가 나온다는 걸 알 수 있다.

내용을 보면 ArgoCD 대시보드에서 Applications을 생성할 때 입력한 정보가 들어가 있다.

$ kubectl get applications -n argocd  testapp  -oyaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: testapp
  namespace: argocd
spec:
  destination:
    namespace: test
    server: https://kubernetes.default.svc
  project: default
  source:
    path: app
    repoURL: https://github.com/jwhong-3004/helm.git
    targetRevision: HEAD
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
반응형

댓글