ArgoCD는 쿠버네티스에서 구동되는 대표적인 GitOps 기반의 CD(Continuous delivery) 도구이다. (GitOps에 대한 설명은 아래 포스트에서 정리를 했는데 개념이 생소하다면 참고자료로 봐주시면 감사하겠습니다.)
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을 연동하기 위해서 매니페스트 파일을 저장한 레포지토리가 필요하다. 일단 매니페스트 저장용 레포지토리를 하나 생성하자.
- 예시는 해당 레포지토리이다. https://github.com/beer-one/k8s-manifests
그리고 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 배포하기
마무리
GitOps의 CD 에이전트인 ArgoCD에 대해 간단히 알아보았고, 설치 및 Git과의 연동 방법에 대하여 알아봤다. 일단 기초적인 사용법에 대해 정리를 하였고 추후에는 ArgoCD Application의 디테일한 설정과 동기화 방식 및 ArgoCD 컨테이너 각각의 역할과 멀티클러스터 연동 방식 등 심화적인 내용에 대해서도 정리해볼 생각이다.
참고 자료
https://argo-cd.readthedocs.io/en/stable/
https://github.com/argoproj/argo-helm
'DevOps > CI.CD' 카테고리의 다른 글
Jenkins 소개 및 Kubernetes에 설치 (0) | 2023.11.07 |
---|---|
CI / CD란 무엇일까? (0) | 2023.11.04 |
ArgoCD 아키텍처 이해하기 및 여러가지 옵션 (3) | 2023.10.14 |
ArgoCD를 사용하여 Helm chart 배포하기 (1) | 2023.10.13 |
GitOps란 무엇인가? (0) | 2023.09.03 |
댓글