Gitops란 애플리케이션의 배포와 운영에 관련된 모든 요소를 코드화하여 깃(Git)에서 관리(Ops)하는 방법론 중 하나입니다. CI/CD 중 지속적인 배포(Continuous Deployment)에 초첨을 두고 있으며, 기본 개념은 코드를 이용하여 인프라를 프로비저닝 하고 관리하는 IaC(Infrastructure as Code)에서 나온 것으로 깃옵스는 이를 인프라에서 전체 애플리케이션 범위로 확장하였다고 보시면 됩니다.
Gitops의 장점은 다음과 같습니다.
ArgoCD는 Gitops의 대표적인 구현체이며, Jenkins 같은 push 방식이 아닌 pull 방식을 채택한 Gitops 도구입니다. 다음은 ArgoCD의 아키텍처를 나타낸 그림입니다.
기본적으로 쿠버네티스 클러스터 내 리소스들로 구성되며, 코드에 반영되면 설치된 ArgoCD가 쿠버네티스 클러스터에 설치된 리소스와 형상을 비교한 뒤, 차이가 있으면 이를 최신 코드 기준으로 동일하게 맞춰줍니다.
자, 이제 간단하게 알아보았으니 ArgoCD를 통해서 애플리케이션을 배포해보는 간단한 실습을 진행해보겠습니다.
실습을 진행하기 위해서는 아래 소프트웨어들이 구성되어 있어야 합니다.
ArgoCD는 쿠버네티스 리소스로 구성되어 있습니다. 따라서 메니페스트를 구성해야 하는데, 여기서는 간단하게 CLI 명령어로 구성해보도록 하곘습니다. 아래 명령어들을 입력합니다.
# argocd 네임스페이스 생성
$ kubectl create namespace argocd
# 쿠버네티스 클러스터에 argocd 설치
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
위 명령어를 실행하면 "argocd" 네임스페이스 아래 다음 리소스들이 구성됩니다.
$ kubectl get all -n argocd
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 0 115m
pod/argocd-applicationset-controller-78b8b554f9-pg6tv 1/1 Running 0 115m
pod/argocd-dex-server-6bbc85c688-fxqwf 1/1 Running 0 115m
pod/argocd-notifications-controller-75847756c5-v9qc7 1/1 Running 0 115m
pod/argocd-redis-f4cdbff57-879q5 1/1 Running 0 115m
pod/argocd-repo-server-d5c7f7ffb-fddm7 1/1 Running 0 115m
pod/argocd-server-76497676b-m9gq4 1/1 Running 0 115m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-applicationset-controller ClusterIP 10.111.172.181 <none> 7000/TCP,8080/TCP 115m
service/argocd-dex-server ClusterIP 10.100.226.17 <none> 5556/TCP,5557/TCP,5558/TCP 115m
service/argocd-metrics ClusterIP 10.109.114.206 <none> 8082/TCP 115m
service/argocd-notifications-controller-metrics ClusterIP 10.104.167.93 <none> 9001/TCP 115m
service/argocd-redis ClusterIP 10.102.69.51 <none> 6379/TCP 115m
service/argocd-repo-server ClusterIP 10.104.11.4 <none> 8081/TCP,8084/TCP 115m
service/argocd-server ClusterIP 10.109.178.58 <none> 80/TCP,443/TCP 115m
service/argocd-server-metrics ClusterIP 10.110.59.129 <none> 8083/TCP 115m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argocd-applicationset-controller 1/1 1 1 115m
deployment.apps/argocd-dex-server 1/1 1 1 115m
deployment.apps/argocd-notifications-controller 1/1 1 1 115m
deployment.apps/argocd-redis 1/1 1 1 115m
deployment.apps/argocd-repo-server 1/1 1 1 115m
deployment.apps/argocd-server 1/1 1 1 115m
NAME DESIRED CURRENT READY AGE
replicaset.apps/argocd-applicationset-controller-78b8b554f9 1 1 1 115m
replicaset.apps/argocd-dex-server-6bbc85c688 1 1 1 115m
replicaset.apps/argocd-notifications-controller-75847756c5 1 1 1 115m
replicaset.apps/argocd-redis-f4cdbff57 1 1 1 115m
replicaset.apps/argocd-repo-server-d5c7f7ffb 1 1 1 115m
replicaset.apps/argocd-server-76497676b 1 1 1 115m
NAME READY AGE
statefulset.apps/argocd-application-controller 1/1 115m
구성된 ArgoCD는 웹 UI(이하 "ArgoCD UI")를 제공합니다. 이를 브라우저로 접근하기 위해서는 다음의 4가지 방식이 있습니다.
여기서는 가장 간단한 Port Forward 방식을 이용해보도록 하곘습니다. 터미널에 다음을 입력하세요.
$ kubectl port-forward svc/argocd-server -n argocd 8080:443
이제 http://localhost:8080으로 접속하면 ArgoCD UI를 접속할 수 있습니다.
이제 로그인을 해야 하는데, 이 방식으로 설치하게 되면 기본적으로 "admin" 계정과 함께 임의의 비밀번호가 생성됩니다. 비밀번호는 다음 명령어로 확인할 수 있습니다.
# 비밀번호를 확인화기 위한 명령어
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
# 생성된 비밀번호
7FHwxAybf9aXICII
위에서 생성된 비밀번호와 함께 "admin" 계정으로 로그인하면 다음 화면을 확인할 수 있습니다.
ArgoCD에 애플리케이션을 배포하기 위해서는 몇 가지 설정이 추가적으로 더 필요합니다. 손 쉽게 구성하기 위해서 argocd CLI를 설치한다. mac 환경이라면, 다음 명령어로 손귑게 설치할 수 있습니다.
$ brew install argocd
먼저 argocd CLI로 배포한 ArgoCD에 로그인을 진행해야 합니다. 터미널에 다음을 입력합니다.
# argocd login <ArgoCD URL>
$ argocd login localhost:8080
WARNING: server certificate had error: x509: “Argo CD” certificate is not trusted. Proceed insecurely (y/n)? y # <- y 입력
Username: admin # <- admin 입력
Password: # <- 위에서 확인한 비밀번호 입력
'admin:login' logged in successfully
Context 'localhost:8080' updated
로그인이 다 되었으면 application을 배포해도록 하겠습니다. 터미널에 다음 명령어를 입력합니다.
$ argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
위 명령어는 argocd(여기서는 argocd를 만들고 관리하는 단체를 의미한다.)에서 제공하는 예제 샘플을 우리가 구성한 ArgoCD로 배포하고 관리할 수 있는 객체를 생성합니다. 이 객체, 혹은 배포 단위를 argocd에서는 "application"이라고 합니다. ArgoCD UI로 돌아가보겠습니다.
아래 그림과 같이 애플리케이션이 구성되었음을 확인할 수 있습니다.
현재 노란 색깔이 보이는데, 아직 쿠버네티스 클러스터에 배포되지 않았음을 의미합니다. 여기서 "Sync"를 누르면 배포를 할 수 있습니다.
그럼 오른쪽에서 다음 UI가 발생하는데 "Synchronize"를 누릅니다.
그럼 얼마 있다가 색깔이 노란색에서 초록색으로 바뀌게 됩니다. 예제 샘플이 배포가 되었음을 의미합니다.
애플리케이션을 UI를 클릭해보면 어떤 리소스들이 구성되는지 확인할 수 있습니다.
위 UI에서 다음 리소스들이 생성되었음을 확인할 수 있습니다.
실제 쿠버네티스에서 구성된 리소스들과 비교해보죠. 다음 명령어를 입력합니다.
$ kubectl get all | grep "guestbook"
pod/guestbook-ui-85985d774c-dk6gz 1/1 Running 0 7m16s
service/guestbook-ui ClusterIP 10.104.51.32 <none> 80/TCP 7m16s
deployment.apps/guestbook-ui 1/1 1 1 7m16s
replicaset.apps/guestbook-ui-85985d774c 1 1 1 7m16s
정확하게 일치됨을 확인할 수 있습니다.
이 문서에서는 예제 샘플, 즉 저희가 코드 관리를 할 수 없기 때문에 코드 내용이 변경될 때 싱크를 맞춰서 배포됨을 확인할 수 없습니다. 하지만, 만약 자신의 레포를 설정했다면, 레포에 코드 변경이 발생할 시 최대 3분을 기다렸다가 ArgoCD가 쿠버네티스 클러스터에 싱크를 맞춰서 애플리케이션을 배포하는 것을 확인할 수 있습니다.