소개
해당 글은 라즈베리파이를 활용해 클러스터를 구성하고 그 뒤에 무엇을 했는지에 대한 설명입니다. 특히 그 중에서 CI/CD 도구인 ArgoCD 를 설치한 내용을 글로 적어봤습니다.
목적
개인적으로 사이드 프로젝트를 천천히 돌리다보니 수동으로 배포하는 과정이 반복되고 시간이 아깝게 느껴지는 순간들이 생겼습니다.
간단한 백엔드 서버를 클러스터에 배포하는 것도 처음에만 오래 걸리고 그 뒤로는 동일한 프로세스를 계속 반복하게 되었습니다. 그래서 배포 시간을 줄이고 개발 시간을 늘리면서 개발 사이클이 더 빨리 돌아갈 수 있도록 CI/CD 를 도입하기로 결정했습니다.
CI/CD 소개
Continuous Integration (CI) 과 Continuous Delivery (CD) 에 대해서 먼저 볼까 합니다. 사실, 인터넷에 풀린 자료 중에서 해당 과정을 잘 설명하는 글들과 영상들이 많은데 그 중 제가 도움이 되는 영상을 같이 참조할 수 있도록 아래에 추가했습니다.
간단하게 말하자면 CI 는 개발한 코드가 기존 코드와 잘 동작하는지 확인해주는 과정이고 CD 는 개발된 코드를 배포해주는 과정입니다. 굳이 2개를 동시에 할 필요는 없지만 보통 같이 작업이 되기 때문에 엮어서 말하는 것 같습니다.
하나는 개발 관련 영상들을 올리는 Fireship 이라는 분의 영상입니다. 3분 내로 끝나기 때문에 간단하게 요약된 버전을 보려면 좋은 영상인 것 같습니다.
https://www.youtube.com/watch?v=scEDHsr3APg
다른 하나는 ByteByteGo 라는 채널인데 마찬가지로 5분 정도의 소개 영상입니다.
https://www.youtube.com/watch?v=42UP1fxi2SY
ArgoCD
CI/CD 중에서 유명한 도구 중 하나인 ArgoCD 는 CI/CD 에서 CD 부분을 담당합니다. 코드도 오픈소스이기 때문에 직접 확인해볼 수도 있습니다.
https://github.com/argoproj/argo-cd
GitHub - argoproj/argo-cd: Declarative Continuous Deployment for Kubernetes
Declarative Continuous Deployment for Kubernetes. Contribute to argoproj/argo-cd development by creating an account on GitHub.
github.com
ArgoCD 는 쿠버네티스와 같은 컨테이너 환경에서 실행이 되는 선언형 CD 도구입니다. 주로 Helm 차트와 같이 활용할 수 있어서 편리하고 특정 상태를 유지하는 여러 편리한 기능들 덕분에 많이 쓰이기도 합니다.
설치
ArgoCD 를 설치하는 과정은 매우 단순합니다. 일단 쿠버네티스 환경 내에서 별도의 `argocd` namespace 를 생성해 줍니다.
$ kubectl create namespace argocd
그리고 ArgoCD 공식문서에 나와있는 대로 설치 명령어를 실행해 주면 됩니다. 다음 명령어에서 나오는 주소를 보시면 ArgoCD 의 stable 버전을 설치하게 됩니다. 이 부분은 필요에 따라서 변경해주셔도 무방합니다.
참고로 해당 `install.yaml` 파일은 ArgoCD 의 UI 를 포함한 다른 기능들도 같이 설치하게 되는데 필요가 없으면 `core-install.yaml` 로 변경해주시면 됩니다.
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
설치가 완료되면 아마 다음과 같은 Pod 들이 보일 겁니다. 여기에서 여러가지 Pod 들이 실행되고 있는 것을 보실 수 있습니다.

접속을 이제 해야 하는데 처음 접속할 때에는 비밀번호를 먼저 가져와야 합니다.
$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
위 명령어를 실행한 결과를 사용해서 다음 유저 정보를 완성하시면 됩니다. 쿠버네티스의 secret 으로 되어 있습니다. 참고로 해당 비밀번호는 초기 비밀번호라 비밀번호가 변경된 후에는 지우셔도 됩니다.
- Username: admin
- Password: (명령어 실행 결과)
로컬 접속
ArgoCD 가 다 설치가 완료되었으면 Pod 들이 다 띄워져 있고 다음과 같이 쿠버네티스 서비스들도 실행되고 있을 겁니다.

로컬 클러스터로 띄운 후에 클러스터에서 클라우드 로드 밸런서를 활용하지 않고 Ingress 나 별도 Load Balancer 는 크게 필요하지 않기에 빠르고 쉽게 접속하는 방법으로 다음 2가지가 있습니다.
- Node Port Service
- Port Forwarding
1. Node Port Service
해당 방법은 쿠버네티스에서 각 노드에 특정 포트를 지정해서 원한는 Pod 과 연결해주는 개념입니다. 물론, 자주 변경되거나 노출 위험, 그리고 연관된 서비스가 많아질 수록 사용하지 않는 것이 좋지만 딱히 로컬에서 대규모 서비스 운영을 하지 않기 때문에 큰 상관은 없습니다.
다음과 같이 바로 Patch 해서 사용할 수 있습니다.
$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
Patch 후에는 다시 다음과 같이 서비스들을 확인하고
$ kubectl get service -n argocd
다음과 같이 포트번호들이 지정된 것을 확인할 수 있습니다. 아래 그림 같은 경우에는 ArgoCD 서버의 80 포트번호는 31178, 443 는 30090 으로 매핑이 되었습니다.

매핑이 완료되었다면 로컬 클러스터의 노드의 IP 주소와 해당 포트번호를 이용해서 접속하면 됩니다.
예를 들어 클러스터에 연결된 노드가 2개이고 다음과 같은 IP 들이라면
- 192.168.0.100
- 192.168.0.101
브라우저에 다음과 같이 입력해서 접속해줍니다. 어떤 주소도 상관 없습니다.
- `http://192.168.0.100:31178`
- `http://192.168.0.100:30090`
- `http://192.168.0.101:31178`
- `http://192.168.0.101:30090`
2. Port Forwarding
해당 방법은 ArgoCD 설치 문서에도 나와 있는 방법으로 kubectl 을 활용해 임시로 로컬 포트와 잠깐 연결해주는 방법입니다. 굳이 ArgoCD 를 매일 들어가거나 항상 접속해야 되지 않는 이상 잠깐 포트 포워딩한 뒤에 접속하고 끊어주기 때문에 이 방식을 사용하고 있습니다.
다음과 같이 포트 포워딩할 포트 번호를 입력해줍니다. 해당 예제에서는 `8080` 을 사용하고 있습니다. 현재 로컬에서 사용중인 포트번호만 아니면 크게 상관없습니다.
$ kubectl port-forward svc/argocd-server -n argocd 8080:443
해당 방법으로는 로컬에 포트 포워딩을 했기 때문에 다음과 같이 접속할 수 있습니다.
- `http://localhost:8080`
- `http://127.0.0.1:8080`
마지막으로 위에서 미리 찾아놓은 유저 정보로 로그인하면 다음과 같이 화면이 뜹니다. 스크린샷에서 몇몇 부분은 모자이크 처리했습니다.

마무리
글이 생각보다 길어져서 일단 ArgoCD 설치하는 과정을 위주로 적게 되었습니다. 로컬 클러스터에 직접 설치해본 경험을 설명 드렸지만 도구를 이해하는 데에 시간을 더 많이 쏟았던 것 같습니다. ArgoCD 는 클러스터에 있으면 좋은 도구이지만 굳이 필요가 없다면 안 사용해도 충분할 것 같습니다.
개인적으로는 클러스터에 여러가지들을 띄워놓을 생각이 있기 때문에 k3s 에 ArgoCD 를 사용하고 있지만, 딱히 필요없다면 그냥 라즈베리파이에 Docker Compose 와 같은 도구도 있습니다.
로컬 클러스터가 있고 관심이 생기셨다면 한번 직접 설치를 해보시는 것을 추천드립니다. 또한 관련된 공부와 ArgoCD 동작 등도 같이 배워가시면서 진행하신다면 더 깊이 있고 값진 경험이 되는 것을 개인적으로 느껴서 단순히 설치 뿐만이 아닌 등장 배경 등도 같이 찾아보시면 될 것 같습니다.
'Tools' 카테고리의 다른 글
라즈베리파이 4 과 파이썬, Firefox, Selenium - CLI (2) | 2023.11.17 |
---|---|
유용한 Vim Plugins (0) | 2022.06.01 |
Intro to Scrapy (0) | 2022.06.01 |
iTerm과의 고군분투쓰 (0) | 2022.05.31 |
Atom text-editor (0) | 2022.05.30 |