What is GitOps ??
GitOps라는 용어는 Weaveworks에서 처음 나오게 되었다. DevOps와 마찬가지로 특정 도구가 아닌 방법론이며 이름에서 알 수 있듯이 깃(Git)으로 관리(Ops)를 하겠다 라는 개념이다. DevOps를 적용하는 실천 방법 중 하나이며, Kubernetes를 대상으로 지속적 배포 (Continous Deployment)에 초점을 두고 있다. 때문에 GitOps는 빌드와 테스트를 하는 지속적 통합(Continuos Integration) 단계가 끝나고 난 후 배포하는 과정을 다루게 된다.
사람들은 Kubernetes 리소스를 코드로 변경 및 생성하거나 대시보드로 시각화 하기를 원했다.
이러한 GitOps 툴에는 Argo CD, Jenkins X, Spinnaker, weaveworks flux 등이 있다.
이번 글에서는 Argo CD에 대해서 설치하고 배포하는 과정을 살펴보도록 하겠다
Argo CD ?
(위 그림은 GitOps를 실현하는 CD도구 중 하나인 ArgoCD 의 로고인데 다리가 8개 달린 문어(?)이며 멍청하게 생겨서 귀엽다.)
ArgoCD를 사용하여 Kubernetes에 배포하면 Git에서 수정이 발생할 시, 자동으로 ArgoCD에서 수정하여 휴먼에러를 줄이고 지속적인 배포를 실현할 수 있다. 또한 각 버전들은 Git 저장소에 기록되어 있으며 ArgoCD를 통하여 이전 버전으로의 롤백이나 새로운 버전으로 업그레이드가 편리해졌다.
빌드 및 테스트가 끝나는 시점부터 GitOps의 영역으로 진입하면서 Git 레포지토리에 저장되어 있는 Manifest 파일을 사용하여 ArgoCD로 Kubernetes에 배포하게 된다.
Argo CD 설치 및 접근
이제 Argo CD를 직접 설치해보도록 하자.
글쓴이는 EKS 환경에서 Kubernetes Cluster를 구성하였다. 당연한 이야기겠지만 Kubernetes 환경이 준비 안된 사람들은 Kubernetes 환경부터 만들어 오자...
1. ArgoCD 배포
배포 대상이 되는 Kubernetes Cluster에 argocd namespace를 생성한 후 argocd를 배포한다.
# argocd namespace 생성
kubectl create namespace argocd
# argocd 배포
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
아래 명령어를 입력해보면 argocd가 설치된 것을 확인할 수 있다.
$ kubectl get po -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 3h51m
argocd-dex-server-76ff776f97-hmgxl 1/1 Running 0 3h51m
argocd-redis-747b678f89-5nvbk 1/1 Running 0 3h51m
argocd-repo-server-6fc4456c89-nng5n 1/1 Running 0 3h51m
argocd-server-7d57bc994b-vxw2l 1/1 Running 0 3h51m
2. ArgoCD 접근
ArgoCD API 서버에 접근 하는 방법은 여러가지가 있다.
처음 ArgoCD가 설치되면 기본은 Cluster IP로 되어있는데, ArgoCD에 접근하기 위해서 서비스 타입을 바꿔주자
https://argo-cd.readthedocs.io/en/stable/getting_started/
# LoadBalancer 타입으로 접근
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
External IP 접속
# 포트포워딩으로 접근
kubectl port-forward svc/argocd-server -n argocd 8080:443
localhost:8080 접속
# NodePort 타입으로 접근
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
node IP:NodePort 로 접속
# Ingress 로 접근
이건 위의 공식 홈페이지에서 확인
제대로 접근이 되었을 경우 아래와 같이 로그인 화면을 만나볼 수 있다.
하지만 우리는 계정 설정이나 비밀번호 설정을 한적이 없어서 로그인을 못할것이다.
기본 계정은 admin 이지만 비밀번호는 따로 알아내어야 한다.
# secret 암호 정보를 평문으로 가져옴
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
ophWLXyodUPQQhmM
ArgoCD에 kubernetes 배포하기
이제 ArgoCD 설치도 했고 접속까지 했으니 직접 Github와 연동하여 애플리케이션을 배포해보자
1. Git Repositories 연동
ArgoCD 창에서 설정탭으로 들어가고 Repositories를 선택해주자
ArgoCD와 Git을 연동하는 방식에는 SSH 방식, HTTPS 방식, Github App 방식이 있지만,
이번에 내가 해볼것은 HTTPS 방식으로 연동할 것이다.
타입은 Git이고, Repository URL에는 본인이 사용할 레포지토리 주소를 넣어주면 된다.
너무나 쉽게도 되어버리는 연동 ^-^
2. 애플리케이션 배포하기
ArgoCD의 Applications 탭에서 NEW APP 을 클릭하자
간단하게 nginx를 배포하는 Manifest 파일을 git 레포지토리에 올려두고 ArgoCD로 배포해보자
- Application Name : nginx를 배포할거니까 간단하게 nginx라고 지정
- Project : ArgoCD에서 애플리케이션을 구분하고 관리하기 위한 논리적인 그룹.
- SYNC POLICY : Manual 과 Automatic 중에 선택하며, Git의 환경과 비교하는 것을 수동으로 할지 자동으로 할지 선택.
- Prune Resources : 변경 사항에 따라 리소스를 업데이트할 때, 기존의 리소스를 삭제하고 새로운 리소스를 생성
- Self Heal : ArgoCD가 지속적으로 Git 레포지토리의 설정값과 싱크를 맞추려고 함
- Repository URL : 사용할 레포지토리 URL , 이전에 연동했던 레포지토리가 등록될 것이다.
- Revision : git의 어떤 Revision (HEAD , Master branch 등)을 바라볼지 결정
- Path : Git에서 어떤 저장소의 어떤 디렉토리를 바라볼지 결정
- Cluster URL : Kubernetes의 어느 클러스터에 배포할지 결정
- Namespace : Kubernetes 클러스터의 어느 Namespace에 배포할지 결정
간단하게 테스트용으로 설정하고 나서 Create 를 클릭해주면,
아래와 같이 Kubernetes 클러스터의 리소스들을 시각화하여 한눈에 알기 쉽도록 볼수 있다.
nginx 라는 애플리케이션에 나의 git 레포지토리에 올려두었던 deployment와 service가 배포되어 한개의 pod가 생성되어 있는 모습이다.
deployment의 replicas를 1에서 3으로 수정해보았다.
그 결과, ArgoCD에서도 파드가 3개로 늘어나는 모습을 보여주었다.
메뉴의 HISTORY AND ROLLBACK을 클릭하면 git의 수정사항도 볼 수 있고 이전 버전으로 롤백까지 쉽게 할 수 있게 되어있다. ArgoCD를 사용하여 Kubernetes를 관리함으로써 더욱 쉽게 배포하고 관리할 수 있어질 것이다.
'DevOps > CI CD' 카테고리의 다른 글
[ArgoCD] ArgoCD에서 Blue/Green 배포하기 (0) | 2021.07.05 |
---|---|
[무중단 배포] Rolling, Blue/Green, Canary 배포 (0) | 2021.06.16 |
[Jenkins] Jenkins에 Github를 연동하고 빌드 자동화하기 (2) | 2021.05.23 |
[Code Pipeline] EKS와 Code Pipeline를 사용하여 CI/CD 구축하기 (1) | 2021.05.07 |
[Jenkins] AWS EC2에 Jenkins를 설치해보자 (0) | 2021.04.13 |