본문 바로가기
DevOps/CI.CD

ArgoCD 소개와 설치

by 비어원 2023. 9. 3.
728x90

ArgoCD는 쿠버네티스에서 구동되는 대표적인 GitOps 기반의 CD(Continuous delivery) 도구이다. (GitOps에 대한 설명은 아래 포스트에서 정리를 했는데 개념이 생소하다면 참고자료로 봐주시면 감사하겠습니다.)

 

GitOps란 무엇인가?

GitOps는 Weaveworks에서 처음으로 정의한 용어이며, Git을 활용하여 쿠버네티스 기반의 클라우드 네이티브 환경에서 소프트웨어 애플리케이션 배포하고 인프라를 관리하는 방식이다. GitOps의 관리

beer1.tistory.com

 

ArgoCD의 기능은 GitOps의 핵심 원칙 중 승인된 변경사항은 자동으로 시스템에 반영을 제공한다고 보면 된다. ArgoCD는 특정 Git 레포지토리에 저장된 매니페스트 파일들을 주기적으로 확인한 후, 변경사항이 발생했다면 현재 쿠버네티스 클러스터의 상태와 Git에 저장된 매니페스트 내용을 비교한 후 다르다면 Git에 저장된 매니페스트를 쿠버네티스 클러스터에 반영한다. 여기서 쿠버네티스 매니페스트는 여러가지 방식을 지원한다.

  • 일반적인 JSON / YAML 파일
  • Kustomize
  • Helm charts 등

 

ArgoCD를 사용하면 GitOps의 Pull-based pipeline을 구축할 수 있다.

 

주요 기능

ArgoCD는 GitOps 기반 파이프라인 구축에 관련된 여러가지 기능을 제공한다.

  • 애플리케이션을 지정된 환경에 자동으로 배포한다.
  • 멀티 클러스터 관리기능 제공
  • OICD, OAuth2, LDAP 등 SSO 연동
  • 멀티 테넌시와 자체적인 RBAC 정책 제공
  • 애플리케이션 리소스 상태 분석
  • 애플리케이션 자동 및 수동 동기화 기능 제공
  • ArgoCD가 관리하고 있는 쿠버네티스 리소스 시각화 UI 제공
  • 자동화 및 CI 통합을 위한 CLI 제공
  • GitHub, GitLab, Bitbucket과의 웹훅 통합
  • 자동화를 위한 Access token 및 REST API 제공
  • 애플리케이션 동기화에 대한 preSync, sync, postSync hook 제공
  • 애플리케이션 이벤트 및 API 호출에 대한 감사 기능
  • Prometheus 메트릭

 

설치

ArgoCD 설치방식은 쉽다. 설치 방법은 Yaml파일을 apply하거나 Helm 배포 둘 중 하나를 선택할 수 있다.

 

Yaml로 설치

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

Helm으로 설치

$ https://raw.githubusercontent.com/argoproj/argo-helm/main/charts/argo-cd/values.yaml # default values.yaml
$ helm repo add argo https://argoproj.github.io/argo-helm
$ kubectl create namespace argocd
$ helm install argocd -n argocd argo/argo-cd -f values.yaml

 

필자는 helm을 선호하는 편인데, helm 배포가 성공적으로 끝나면 최종적으로 다음 파드가 생성된다. 7개의 컨테이너가 배포되었는데 이들의 역할은 나중에 알아보자.

 

$ kubectl get po -n argocd
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          83s
argocd-applicationset-controller-6d4d47677b-9hwt7   1/1     Running   0          83s
argocd-dex-server-77d8588bd4-t5fmx                  1/1     Running   0          83s
argocd-notifications-controller-8588c9fd7c-vl8hr    1/1     Running   0          83s
argocd-redis-7784ff448b-bzn8z                       1/1     Running   0          83s
argocd-repo-server-75c6cc9d97-p7k4f                 1/1     Running   0          83s
argocd-server-66d84f9d5f-jr74h                      1/1     Running   0          83s

 

웹앱에 접속

ArgoCD를 성공적으로 배포했다면 일단 웹앱에 접속해보자. 웹앱은 argocd-server 파드에서 제공한다. 웹앱에 접근하는 방법은 크게 세 가지가 있다. 하나는 포트포워딩으로 접속하는 방법이고, 하나는 Ingress를 추가하는 방법, 나머지 하나는 NodePort로 접근하는 방법이다.

 

port-forward

kubectl에서 제공하는 포트포워드 기능으로 임시적으로 접근할 수 있다. 이건 임시적으로 열어두는 것이라 자주 ArgoCD UI에 접근한다면 그닥 추천하지는 않는다. argocd-server를 80포트로 띄웠다면 서비스 포트포워딩을 하여 8080으로 접근 가능하도록 하자.

$ kubectl port-forward svc/argocd-server 8080:80 -n argocd

만약 helm으로 배포했을 경우에는 http 접속을 기본적으로 허용하지 않기 때문에 values.yaml 파일에 configs.params.server.insecure 설정을 해야 한다.

configs:
  params:
    server.insecure: true

 

이미 설치된 helm의 설정을 변경하려면 아래 명령어를 사용하면 된다.

$ helm upgrade -i argocd argo/argo-cd -f values.yaml

http://localhost:8080 로 접속한다면 문어 한마리가 반갑게 맞이해 줄 것이다.

 

ingress

만약 LoadBalancer 타입의 ingress 서비스가 있다면 ingress를 이용하여 argocd-server를 쿠버네티스 외부로 노출시킬 수 있다. helm의 server.ingress 설정을 하면 된다.

server:
  ingress:
    enabled: true
    ingressClassName: "nginx"
    hosts:
      - argocd.beer1.com
    paths:
      - /
    pathType: Prefix

UI에 접속하려면 로그인이 필요한데 기본적으로 admin 계정으로 로그인 할 수 있다. 패스워드는 아래 명령어로 확인 가능하다.

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

 

 

 

git 연동하기

일단 ArgoCD와 Git을 연동하기 위해서 매니페스트 파일을 저장한 레포지토리가 필요하다. 일단 매니페스트 저장용 레포지토리를 하나 생성하자.

그리고 ArgoCD 웹 UI에 접속한 다음 Settings로 들어가면 Repositories 항목이 있다. 이 항목을 누르면 CONNECT REPO 라는 버튼이 있는데 이 버튼을 누르면 연동할 레포지토리 정보를 입력할 수 있다.'

  • username과 password는 연동할 레포지토리가 private인 경우 설정해야 한다.
  • 연동할 레포지토리에 대해 Pull 권한이 있는 계정으로 등록해야 한다.
  • password는 비밀번호 변경 가능성과 노출 가능성이 있기 때문에 실제 패스워드 대신 Personal Access Token을 Repo 권한만 할당하여 발급해서 password로 사용하는 방법을 추천한다.

 

어쨌든 등록한 후 성공이면 Successful인 상태로 레포지토리가 보여진다.

 

레포지토리를 등록했으니 이제 레포지토리에 저장된 mysql 매니페스트 파일을 연동해보겠다.

 

Application 메뉴를 누른 후 NEW APP 버튼을 누르면 Git 레포에 저장된 매니페스트 파일을 쿠버네티스와 연동할 수 있다. 일단 다음과 같이 설정한 후 CREATE 버튼을 눌러보자.

 

그러면 ArgoCD Application이 생성되고 매니페스트 파일이 문제 없다면 잘 떴다고 표시가 될 것이다.

 

저기 직사각형 박스를 누르면 Application이 관리하고 있는 쿠버네티스 리소스의 디테일을 볼 수 있다. 여기서 파드의 로그나 각 리소스의 매니페스트 정보도 확인이 가능하다.

 

Git에 저장된 매니페스트 변경하기

ArgoCD의 주요 기능은 Git 레포에 저장된 매니페스트 파일의 변경사항을 주기적으로 확인 후 변경사항을 쿠버네티스에 반영하는 것이다. ArgoCD를 Git과 연동했으니 실제로 Git의 매니페스트 파일이 변경되면 ArgoCD가 쿠버네티스로 반영하는지 확인해보자.

일단 Git에 저장된 mysql/statefulset.yaml 파일을 변경해보겠다. 원래는 resources 설정이 되어있지 않았는데 resources 설정을 추가하였다.

 

git push를 한 후 argocd에서 자동으로 동기화를 시켜주는지 확인해보자. git push를 하자마자 바로 변경은 되지 않을 것이다. ArgoCD는 pull-based이고, 기본적으로 3분 주기로 git repo를 확인한다. 인내심을 가지고 UI를 켜두고 있다가 어느 순간이 되면 동기화를 시작한다.

 

변경사항을 보면 LAST SYNC 창을 보면 git 커밋로그가 최신으로 업데이트 되었음을 알 수 있다. 그리고 mysql-0 파드가 새로 뜬 것을 확인할 수 있다. 그리고 StatefulSet의 현재 매니페스트 정보를 보면 추가한 resources 정보를 볼 수 있다.

 

Helm chart 배포

ArgoCD는 Git repo에 있는 매니페스트 배포 외에도 Helm chart repo를 활용한 Helm 배포도 제공하고 있다. 아래 포스팅을 참고하자.

2023.10.13 - [DevOps/CI.CD] - ArgoCD를 사용하여 Helm chart 배포하기

 

ArgoCD를 사용하여 Helm chart 배포하기

이전 시간에는 ArgoCD에서 Git Repository에 있는 매니페스트 파일을 사용하여 쿠버네티스로 배포하는 방법에 대해서 알아보았다. 이번 시간에는 ArgoCD에서 매니페스트 파일이 아닌 Helm chart를 배포하

beer1.tistory.com

 

마무리

GitOps의 CD 에이전트인 ArgoCD에 대해 간단히 알아보았고, 설치 및 Git과의 연동 방법에 대하여 알아봤다. 일단 기초적인 사용법에 대해 정리를 하였고 추후에는 ArgoCD Application의 디테일한 설정과 동기화 방식 및 ArgoCD 컨테이너 각각의 역할과 멀티클러스터 연동 방식 등 심화적인 내용에 대해서도 정리해볼 생각이다.

 

 

참고 자료

https://argo-cd.readthedocs.io/en/stable/

 

Argo CD - Declarative GitOps CD for Kubernetes

Overview What Is Argo CD? Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Why Argo CD? Application definitions, configurations, and environments should be declarative and version controlled. Application deployment and lifecycle ma

argo-cd.readthedocs.io

https://github.com/argoproj/argo-helm

 

GitHub - argoproj/argo-helm: ArgoProj Helm Charts

ArgoProj Helm Charts. Contribute to argoproj/argo-helm development by creating an account on GitHub.

github.com

 

728x90

댓글