Judaeng

ArgoCD + Minikube + Ngrok + Github webhook을 이용한 환경 만들어보기 본문

DevOps/ArgoCD

ArgoCD + Minikube + Ngrok + Github webhook을 이용한 환경 만들어보기

Judaeng 2022. 4. 25. 20:00
Minikube에서 Argo CD 테스트하고, Github webhook 및 Ngrok으로 즉시 업데이트해 보고, 결과를 보는 것까지 정리해보려고 한다.

과정 정리해보기


a. Minikube로 Kubernetes 클러스터 생성

b. Github에 개인 Git Repo 생성

c. Kubernetes 클러스터에 Argo CD 설치

d. Ngrok으로 터널을 만들어 Github에서 로컬 클러스터에 액세스 할 수 있도록 한다.

e. Github와 Argo CD 간에 웹훅 알림 생성

f.  GitOps Repo의 수정내용을 Git push 후 Kubernetes 애플리케이션의 거의 즉각적인 업데이트를 확인해 보자.

 

GitOps Pipeline

글쓴이는 ArgoCD 적용해 보기 전에, Kubernetes 개념과 명령어등을 먼저 공부해 보고, minikube에서 Hello World, 개인 프로젝트 등을 배포해 보고 오는 길이다.

그 이후에 ArgoCD로 배포하는 과정도 그렇고 UI를 확인해보고 싶어서 실습을 하는 것이다.

지금 시작하기 전에 Minikube란 무엇인지, Kubernetes란 무엇인지 등을 공부하고 이 글을 따라 해 보는 것을 추천한다.

Minikube 시작하기


Minikube 설치 및 시작

Minikube를 사용하면 로컬 테스트를 위한 Kubernetes 클러스터를 빠르게 생성할 수 있다.

설치 또는 업데이트하려면 이 페이지의 설명대로 따라 해 보기를 바란다. 

 

Minikube 시작하기

minikube start

kubectl 명령 도구도 설치가 되어 있어야 한다.

안되어 있다면 여기를 들어가서 설치해 주도록 하자.

 

minikube에서 kubectl을 사용하기 위해 alias로 kubectl의 minikube kubectl을 선언하고 입력한다.

alias kubectl="minikube kubectl --"

1. Argo CD 설치


아래 명령어로 Argo CD를 설치해 보자.

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

위에 명령어를 입력하면 나온다.

그러면 argocd Argo CD 서비스 및 애플리케이션 리소스가 위치할 새 네임스페이스가 생성된다.

2. Argo CD CLI 다운로드


https://github.com/argoproj/argo-cd/releases/latest에서 최신 Argo CD 버전을 다운로드해 보자. 

자세한 설치 지침은 CLI 설치 설명서를 통해 찾을 수 있다.

Mac, Linux 및 WSL Homebrew에서도 사용 가능:

brew install argocd

brew install argocd

3. Argo CD API 서버에 액세스


기본적으로 Argo CD API 서버는 외부 IP로 노출되지 않는다. 

API 서버에 액세스 하려면 다음 기술 중 하나를 선택하여 Argo CD API 서버를 노출한다.

 

서비스 유형 로드 밸런서

argocd-server 서비스 유형을 LoadBalancer 다음으로 변경해 보자.

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

포트 포워딩

Kubectl 포트 포워딩을 사용하여 서비스를 노출하지 않고 API 서버에 연결할 수도 있다.

kubectl port-forward svc/argocd-server -n argocd 8080:443

# or 
kubectl port-forward svc/argocd-server -n argocd [targetPort]:443

그런 다음 localhost:8080 또는 지정한 포트로 API 서버에 액세스 할 수 있다.

4. CLI를 사용하여 로그인


계정의 초기 비밀번호는 자동 생성되어 Argo CD 설치 네임스페이스에 이름이 지정된 비밀 admin 필드에 일반 텍스트로 저장된다.

다음을 사용하여 이 비밀번호를 간단히 검색할 수 있다.

passwordargocd-initial-admin-secretkubectl

아래 명령어는 비밀번호를 base64로 풀어서 비밀번호를 나타내 준다.

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

위의 사용자 이름 admin과 암호를 사용하여 Argo CD의 IP 또는 호스트 이름에 로그인한다.

argocd login <ARGOCD_SERVER>

다음 명령을 사용하여 암호를 변경한다.

argocd account update-password

사실 4번 CLI를 사용하여 로그인은 공식 문서에 있는 내용을 가져와서 자세하게 적어본 것이다.

나는 4번 과정이 진행이 안되었다. 지식이 부족해서 그런 것 같다.

이후 아래부터는 공식 문서 토대로 정리를 하지 않고, 내가 만든 GitOps Repo를 바탕으로 내 프로젝트를 배포해 볼 것이다.

여기까지 만약 잘 따라왔는데, 어떻게 해야 되지?라고 하는 사람들은 Argo CD 공식문서 시작하기에서 5번부터 시작하면 될 것이다.

 

계속 진행해 보자.

사용자 이름은 admin, 비밀번호는 위에 명령어를 통해서 얻어온 것을 바탕으로 Argo CD UI에서 로그인을 진행했다.

Argo CD login 화면

한번 로그인을 진행해보자.

로그인을 진행하고 처음 들어가면 아래 화면처럼 보일 것이다.

여기에서 실제 쿠버네티스 클러스터 내부에 배포될 서비스들을 생성하고 관리하게 된다.

Argo CD는 특정 원격 저장소(GitOps Repository)를 알고 있어야 한다.

우선적으로 특정 원격 저장소(GitOps Repository)를 등록해주어야 한다.

 

아래 그림을 따라서 진행해보자.

왼쪽 메뉴에서 두 번째 아이콘을 클릭하여 Repositories를 클릭한다.
여기서는 HTTPS를 통해 Repository와 연결할 것이기 때문에 Connect Repo Using Https를 클릭한다.
해당 포스트에서 테스트를 위해 사용할 GitOps Repository이다. 해당 url을 복사한다.

여기서 잠깐 위에 GitOps-ArgoCD Repo는 무엇이고, 갑자기 어디서 나온 녀석이냐고 물어볼 수 있다.

ArgoCD는 GitOps라는 방식으로 배포가 진행된다. 

그렇기 때문에 GitOps는 내 프로그램을 어떻게 배포할지에 대한 정보가 담긴 yaml 파일 또는 helm 등이 공개되어 있는 Repo이다.

이것은 따로 글에서 다루진 않겠지만, Repo는 자유롭게 만들고, yaml 파일의 속성은 구글링을 통해 해결해 보도록 하자.

Repository URL에 복사해둔 GitOps Repository의 url을 붙여넣기 한다. 해당 Repository는 Public이기 때문에 username과 password를 입력하지 않았다.

만약 자신의 Private GitOps Repository 가 있다면 위 그림의 해당 Repo에 접근 권한이 있는 계정의 정보를 입력한다.

Username, Password를 입력해주어야 한다.

 

이렇게 간단히 특정 원격 저장소(GitOps Repository)를 등록했다.

이제 실제 서비스를 Argo CD를 통해 배포해 보자.

왼쪽 메뉴 중 첫번째 아이콘을 클릭하여 초기 화면으로 돌아온 후 상단의 New APP 버튼을 클릭한다.
New APP 버튼을 클릭하면 볼 수 있는 화면. 이 화면의 input box & select box 만으로 쿠버네티스 클러스터에 서비스를 배포할 수 있다.
새로운 앱을 배포하기 위해 위와 같이 insert box와 select box를 설정한다. 배포할 서비스의 이름은 gitops-argocd이고 이 서비스의 배포를 위해서 GitOps Repo의 최상위 디렉터리를 참조한다.

최상위 디렉터리를 처음엔 "/" 이렇게 표현했는데 에러가 났다.

두 번째는 "/*" 이렇게 표현했었다ㅋㅋ 그래도 에러가 났다.

세 번째는 구글링을 하다가 "."을 하게 되면 최상위 디렉터리를 참조한다는 해결책을 찾았다.

실제 서비스가 배포될 목적지(Destination)가 어디인지 설정한다. 기본값은 Argo CD가 설치된 쿠버네티스 클러스터 내부이다. 목적지를 설정하고나서 상단의 Create 버튼을 클릭하면 서비스 배포를 위한 환경이 구성된다.
서비스 배포를 위해 구성된 환경(App)의 모습. 이 App을 클릭하면 상세 화면으로 이동할 수 있다.
Synchronize 버튼을 클릭하면 새로운 서비스가 배포된다.
Synchronize가 성공적으로 된 모습
Synchronize가 성공적으로 된 모습

Argo CD를 셋업하고 간단한 서비스를 배포해 보았다.

Argo CD를 사용하면 쿠버네티스 환경에서 배포를 좀 더 손쉽게 진행할 수 있고, 수많은 서비스들에 대해서 관리하기가 편해진다고 한다.

 

Minikube 클러스터에서 실행 중인 서비스 조회하기

Minikube 클러스터에서 실행 중인 서비스를 나열한다.

만약 서비스가 잘 ArgoCD에서 배포가 되는 것을 확인했는데, Hello World가 안 열려요! 하는 경우가 나였는데, 이것을 확인하려면 Minikube port-forward을 다른 쉘에서 띄워서 확인할 수가 있다.

argocd port-forward, minikube port-forward는 다른 것인가?
minikube tunnel 명령어를 사용해도 argocd 포트는 열리지 않는다.

어쨌든 나는 둘 다 하나씩 열고 확인했다.

minikube service list

 

GitOps Repo에서 yaml을 수정하면 ArgoCD는 Github webhook을 감지해 자동으로 배포해 주는 흐름도

ngrok의 역할은 아래에서 설명을 해보겠다.

출처:https://github.com/jeromedecoster/argocd-test/blob/master/architecture.svg

Ngork로 터널 만들기

기본적으로 Argo CD는 3분마다 Git 저장소의 변경 사항을 확인한다.

변경 사항을 거의 즉각적으로 배포하려면 Github 웹 훅을 설정해야 한다.

웹 훅 시스템은 푸시 기반이다.

Github.com 이 localhost의 클러스터에 이벤트를 보내기 위해 ngrok을 사용하여 터널을 생성해야 한다.

Minikube는 로컬에서 띄우기 때문에 외부에 Github이 우리 로컬 IP를 모르기 때문에 웹 훅을 보내줄 수가 없어서 ngrok을 사용하는 것이다.

ngork을 사용하면 외부에서 접속 가능한 터널을 만들 수 있다.

 

애플리케이션이 설치되고 인증되면 매우 간단하게 터널을 생성한다.

ngrok http https://localhost:8080

몇 가지 URL을 얻는다.

Forwarding 된 https URL로 접속하면 git에서 확인 가능한 IP주소가 생성된 것을 확인할 수 있다.

생성된 https 주소를 복사하여 붙여 넣으면 URL에서 Argo CD 인터페이스에 액세스 할 수가 있다.

 

Github Webhook 생성

Github 저장소의 Webhooks 탭으로 접근해 보자.

설명서에 명시된 대로 다음을 수행해야 된다고 되어 있다.

경로 추가: /api/webhook

콘텐츠 유형 선택: application/json

https://[ngrok에서 얻은 주소]/api/webhook 요런 식으로 작성해 주면 된다.

출처:https://medium.com/@jerome.decoster/argocd-minikube-ngrok-github-webhook-3cd0cc15d559

사용하지 않았다면 회색으로 나온다.

 

이제 Github에서 직접 배포 파일을 편집해 보자.

나는 내 yaml 파일에 replicas를 3개에서 1개로 줄여보도록 하겠다.

Argo CD에서 동기화가 안된다...

왜 안될까?

Argo CD 옵션에서 auto sync 옵션을 주지 않았기 때문이다.

옵션을 주고 몇 분 기다리다 보면 3개의 replicas가 terminating 되는 것을 확인할 수가 있다.

만약에 다 설정을 다 했는데도 안된다? 그렇다면 github webhook이 잘 그 URL로 전달이 됐는지를 확인해 보자.

최종 배포된 이미지!
추가로 반가운 배포된 내 프로젝트 이미지😭

 

 

2023.06.22 추가

values.yaml에 type이 NodePort로 설정되어 있을 것이다.

이것을 LoadBalancer로 변경해 주면 된다.

그리고 minikube tunnel 명령어로 열어줘야 localhost:4000이 뜨게 될 것이다.

그래도 안된다면 manifast 설정이 잘못되었을 가능성이 크다.

minikube tunnel
minikube tunnel 열어준 뒤 페이지

 

minikube tunnel을 안 열어주었을 경우

minikube tunnel을 안열어준 경우

 

 

 

📝 이번 게시물을 만들기 위해 참고한 사이트

1. Argo CD 공식 문서 - Getting Started Argo CD

2. ArgoCD + Minikube + Ngrok + Github webhook(참고)

3. GitOps와 ArgoCD란?

4. EKS Cluster에 Argo CD 배포 및 세팅하는 법(참고)

5. GitOps와 ArgoCD(참고)

6. ArgoCD를 이용하여 Kubernetes cluster에 배포하기(GitOps)

7. [Kubernetes] ArgoCD 정리(1) - GitOps Repo 구성과 ArgoCD 설치

8. GitOps Repo를 만들 때 참고한 Repo(커피 고래)

9. GitOps Repo를 만들 때 참고한 Repo(2)

'DevOps > ArgoCD' 카테고리의 다른 글

ArgoCD 알아보기  (0) 2022.04.27
Comments