ArgoCD란
ArgoCD는 쿠버네티스(Kubernetes) 환경에서 애플리케이션을 안전하고 일관성 있게 배포하고 관리할 수 있도록 도와주는 오픈소스 GitOps 도구입니다. 사용자는 애플리케이션의 설정 파일이나 배포 정보를 Git 저장소에 미리 정의해 두고, ArgoCD는 해당 Git 저장소를 지속적으로 모니터링하여 쿠버네티스 클러스터 내 실제 상태와 비교합니다.
만약 Git에 정의된 원하는 상태와 클러스터 내 실제 상태가 다를 경우, ArgoCD는 자동으로 이를 동기화하거나 사용자의 승인 후 동기화를 수행해, 클러스터 상태가 항상 Git 저장소에 정의된 상태와 동일하게 유지되도록 관리합니다.
이를 통해 기존처럼 수동으로 애플리케이션을 배포하거나 kubectl 명령어로 직접 리소스를 생성,수정,삭제하는 방식 대신 모든 변경 사항을 Git 저장소를 통해 관리할 수 있어 배포 이력 추적과 변경 관리가 체계적으로 이루어지며 문제가 발생했을 때 특정 커밋이나 버전으로 빠르게 롤백할 수 있어 운영 안정성이 높아집니다.
이번 글에서는 ArgoCD를 설치하고, Private Repo를 등록하여 GitHub Webhook Event를 연동하는 방법을 설명하겠습니다. 이 글을 통해 ArgoCD의 기본적인 사용법과 GitOps의 개념을 이해할 수 있을 것입니다.
테스트 환경 GitHub Repository 구성
먼저 ArgoCD를 설치하기에 앞서 테스트 환경을 구성해야 합니다. 테스트 환경은 GitHub Repository를 Private Repo로 구성하였으며 테스트를 위해 간단하게 Helm Chart를 사용하여 Nginx 배포하는 예제를 작성하였습니다. GitHub Repository는 다음과 같은 구조로 구성되어 있습니다.
본인만의 테스트를 진행할 수 있는 Manifest 또는 Helm을 작성한 Repo가 별도로 있다면 이부분은 생략하셔도 됩니다.
디렉토리 구조
test-deploy
├── nginx-chart
│ ├── Chart.yaml
│ ├── templates
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ └── values.yaml
└── README.md
Chart.yaml
apiVersion: v2
name: nginx-chart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
values.yaml
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
tag: "1.21.6"
service:
type: ClusterIP
port: 80
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-nginx
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: test-nginx
template:
metadata:
labels:
app: test-nginx
spec:
containers:
- name: nginx
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: 80
service.yaml
apiVersion: v1
kind: Service
metadata:
name: test-nginx
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: 80
selector:
app: test-nginx
GitHub Personal Access Token 생성
Public Repo는 별도의 인증 없이도 ArgoCD에 등록할 수 있기 때문에 이 과정은 생략하셔도 됩니다.
그렇지만 일반적으로 많은 회사에서 Private Repo를 사용하기 때문에 Private Repo에 대한 인증 방법을 설명하겠습니다. ArgoCD가 Private Repo에 접근하기 위해서는 인증이 필요합니다. GitHub에서는 Personal Access Token을 사용하여 Private Repo에 접근할 수 있습니다. 이 토큰은 GitHub 계정의 권한을 부여받아 Private Repo에 접근할 수 있는 키와 같은 역할을 합니다. 따라서, ArgoCD가 Private Repo에 접근하기 위해서는 이 Personal Access Token을 사용해야 합니다.
다음은 GitHub에서 Personal Access Token을 생성하는 방법입니다.
- GitHub에 접속하여 우측 상단의 유저 프로필 아이콘을 클릭하고 `Settings`를 선택합니다.
- 좌측 메뉴에서 `Developer settings`를 클릭합니다.
- `Personal access tokens`를 클릭합니다.
- `Tokens (classic)`을 클릭합니다. (굳이 Classic을 선택하지 않아도 됩니다.)
- `Generate new token`을 클릭합니다.
- `repo` 원하는 권한을 선택하여 부여합니다.
- `Generate token`을 클릭하여 Personal Access Token을 생성합니다.
- 생성된 Personal Access Token을 복사합니다.
위 과정을 통해 생성된 Personal Access Token은 다음과 같은 형식입니다.
# GitHub Personal Access Token
ghp_생략...
GitHub Personal Access Token은 잘 저장하되 타인에게는 공유하지 않습니다.
ArgoCD 설치하기
ArgoCD를 Kubernetes 클러스터에 설치하는 방법은 여러 가지가 있지만 필자는 Helm을 사용하여 설치하는 방법을 선호하기 때문에 Helm을 이용하여 ArgoCD를 설치하는 방법을 설명하겠습니다. Helm을 사용하면 ArgoCD의 설치 및 업그레이드가 간편해지고, 설정 파일을 관리하기도 용이합니다. Helm이 설치되어 있지 않다면 아래 링크를 참고하여 Helm을 설치하시기 바랍니다.
[Helm 설치하기] : https://helm.sh/docs/intro/install/
# helm repo 추가
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
# ArgoCD Helm 차트 설치
helm upgrade argo-cd argo/argo-cd \
--install \
--namespace argocd --create-namespace \
--version 7.8.23 \
--set configs.params.server.insecure=true \
--set server.service.type=NodePort
이번 실습은 개인 로컬 환경에서 테스트용으로 구축하는 것을 목표로 하기 때문에 Service의 Type을 `NodePort`로 설정하였습니다. 실제 현업에서는 NodePort를 이용하지 않습니다.
ArgoCD UI 접속
위와 같이 진행을 하였다면 ArgoCD UI는 `NodePort`로 설정되어 있습니다. ArgoCD Helm에서는 기본적으로 http는 `30080`으로 설정되어 있으며, https는 `30443`으로 설정되어 있습니다. 따라서 브라우저에서 `http://<NodeIP>:30080`으로 접속하면 ArgoCD UI에 접속할 수 있습니다. 만약 `NodePort`가 다르게 설정되어 있다면 다음 명령어를 사용하여 확인할 수 있습니다.
# ArgoCD NodePort 확인
kubectl get svc -n argocd
ArgoCD 초기 비밀번호 확인
다음 명령어를 사용하여 초기 비밀번호를 확인할 수 있습니다.
# 초기 비밀번호 확인
kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d
ArgoCD UI에 로그인할 때, 사용자 이름은 `admin`이고 비밀번호는 위 명령어로 확인한 값을 사용합니다.
ArgoCD에 Private Repo 등록
ArgoCD는 Private Repo에 접근하기 위해 위에서 생성한 Personal Access Token을 사용하여 Secret을 생성하여 해당 Secret을 이용해 Private Repo를 등록합니다. 다음은 ArgoCD에 Private Repo를 등록하는 방법입니다.
# GitHub Personal Access Token을 사용하여 Private Repo 등록
kubectl -n argocd apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: my-git-repo # Secret 이름 (ArgoCD에서 구분용)
namespace: argocd # ArgoCD가 설치된 Namespace (보통 argocd)
labels:
argocd.argoproj.io/secret-type: repository # 중요: 이 label 이 있어야 ArgoCD가 Repository 용도의 Secret으로 인식함
stringData: # 평문 데이터 (적용 시 자동 base64 인코딩 됨)
type: git # repository 타입 (git, helm 등 지정 가능)
url: https://github.com/stdhsw/test-deploy.git # GitHub Repository URL
username: 유저아이디 # GitHub 사용자 이름
password: ghp_생략... # GitHub Personal Access Token (https 인증용)
EOF
username, password는 GitHub 계정의 사용자 이름과 Personal Access Token을 입력합니다. 위 명령어를 실행하면 `my-git-repo`라는 이름의 Secret이 생성됩니다. 이 Secret은 ArgoCD에서 Private Repo에 접근할 때 사용됩니다.
ArgoCD UI에서 정상적으로 Repo가 등록되었는지 확인
브라우저에 http://localhost:30080으로 접속 후 Settings -> Repositories

Application 생성
Application은 ArgoCD가 Kubernetes 클러스터 안에 배포하고, 관리할 대상(서비스/앱/시스템)을 정의하는 리소스입니다.
이번 테스트용 예제에서는 `https://github.com/stdhsw/test-deploy.git` 리포지토리의 `charts/nginx` 경로에 있는 Helm Chart를 사용하여 애플리케이션을 배포합니다. 이 예제에서는 `nginx-deploy`라는 이름으로 애플리케이션을 다음과 같이 생성합니다.
kubectl -n argocd apply -f - <<EOF
apiVersion: argoproj.io/v1alpha1 # ArgoCD Application 리소스 API 버전
kind: Application # 리소스 종류: Application (ArgoCD 배포 단위)
metadata:
name: nginx-app # ArgoCD에 표시될 Application 이름
namespace: argocd # Application 리소스를 배포할 네임스페이스 (보통 argocd)
spec:
project: default # ArgoCD Project 이름 (별도 설정 안했으면 default 사용)
source: # 어떤 Git Repo에서 가져올 것인지 설정
repoURL: https://github.com/stdhsw/test-deploy.git # Git 저장소 URL
targetRevision: HEAD # Git 브랜치 (HEAD = 최신 커밋 기준 / 또는 main, develop 등 사용 가능)
path: nginx-chart # Chart가 위치한 Git 저장소 내 디렉토리 경로
helm: # Helm 옵션 설정
valueFiles: # 사용할 values.yaml 파일 목록
- values.yaml # nginx-chart 디렉토리 내 values.yaml 파일 사용
destination: # Kubernetes 어디에 배포할 것인지 설정
server: https://kubernetes.default.svc # Kubernetes API Server 주소 (Cluster 내부 default)
namespace: default # 배포할 Kubernetes 네임스페이스 (없으면 위 syncOptions에서 자동 생성)
syncPolicy: # ArgoCD 동기화 정책
automated: # 자동 동기화 설정
prune: true # Git에 없는 리소스 자동 삭제 (Git 기준으로 맞춤)
selfHeal: true # 수동으로 변경된 리소스를 자동으로 복구 (Git 상태와 다르면 덮어씀)
syncOptions: # 추가 옵션 설정
- CreateNamespace=true # destination.namespace 가 없을 경우 자동 생성
EOF
ArgoCD UI에서 정상적으로 Application이 배포되었는지 확인
브라우저에 http://localhost:30080으로 접속 후 Applications 클릭

Kubernetes에 정상적으로 배포되었는지 확인
kubectl get po -o wide
# 결과
NAME READY STATUS RESTARTS AGE
test-nginx-6748f55849-t7f8z 1/1 Running 0 6m
Webhook Event 연동을 위한 Ngrok 설치
Ngrok은 로컬에서 실행 중인 서버를 외부에서 접근할 수 있도록 해주는 도구입니다. 현재 우리는 개인 로컬 환경에서 ArgoCD를 실행하고 있기 때문에 외부에서 접근할 수 없습니다. ArgoCD에서 GitHub Webhook Event를 수신하기 위해서는 Ngrok을 사용하여 로컬에서 실행 중인 ArgoCD 서버를 외부에서 접근할 수 있도록 설정해야 합니다. Ngrok 설치하는 방법은 아래 링크를 참고하시기 바랍니다.
실제 현업에서는 Ngrok을 사용하지 않고 Cloud의 네트워크 설정을 통해 진행합니다.
[Ngrok 설치하기] https://ngrok.com/download
# MacOS에서 Ngrok 설치
brew install --cask ngrok
# Ngrok 확인
ngrok version
# Ngrok 설정
# Ngrok 사이트에 접속하여 [Ngrok 사이트](https://dashboard.ngrok.com/signup)에 회원가입을 하고 로그인합니다.
# 그리고 ngrok config add-authtoken <여기에-발급받은-authtoken>을 입력하여 ngrok을 설정합니다.
# 이때 발급받은 authtoken은 Ngrok 사이트에서 확인할 수 있습니다.
ngrok config add-authtoken <여기에-발급받은-authtoken>
# Ngrok 실행
ngrok http https://localhost:30443
Ngrok 실핼 결과

Forwarding으로 출력된 빨간 부분을 복사하여 GitHub Repo Webhook에 넣을 예정입니다.
GitHub Webhook Event 연동
기본적으로 ArgoCD에서는 GitHub Webhook Event를 지원하지 않아 3분마다 GitHub Repository를 Polling 하여 변경 사항을 확인합니다. 그렇기 때문에 최악의 경우 최대 3분 정도의 딜레이가 발생할 수 있습니다. 하지만 GitHub Webhook Event를 사용하면 GitHub에서 발생하는 이벤트를 즉시 수신하여 ArgoCD에 전달할 수 있습니다. 이를 통해 ArgoCD는 GitHub에서 발생하는 이벤트를 즉시 수신하고, 해당 이벤트에 따라 자동으로 배포를 수행할 수 있습니다.
우리는 Ngrok을 사용하여 로컬에서 실행 중인 ArgoCD 서버를 외부에서 접근할 수 있도록 설정하였으므로, Ngrok에서 제공하는 URL을 GitHub Webhook Event의 Payload URL로 설정합니다. 다음은 GitHub Webhook Event를 설정하는 방법입니다.

Payload URL에는 Ngrok Forwarding으로 출력된 값에 /api/webhook을 추가한 값을 입력하고 Content type에는 `application/json`값을 선택하여 webhook을 생성합니다.
webhook생성이 정상적으로 되었다면 다음과 같이 successful이란느 문구가 출력됩니다.

GitHub Webhook 테스트
여기까지 진행을 하였다면 정상적으로 GitHub Webhook Event를 ArgoCD에서 수신할 수 있는지 테스트를 진행하겠습니다.
replicaCount를 3으로 수정하였고, image.tag를 latest로 수정하여 git push를 진행합니다.
values.yaml
replicaCount: 3
image:
repository: nginx
pullPolicy: IfNotPresent
tag: "latest"
service:
type: ClusterIP
port: 80
테스트 결과 확인

Github Webhook 결과 확인
Github repo -> Settings -> Webhooks -> 웹훅선택 -> Recent Deliveries 선택

마지막으로
정상적으로 테스트 진행이 완료되었다면 깔끔하게 정리하고 싶은 분들은 아래와 같이 진행하시면 됩니다.
이부분은 선택사항이므로 굳이 진행을 안하셔도 됩니다.
# ArgoCD 삭제
helm uninstall argo-cd -n argocd
kubectl delete namespace argocd
# Ngrok 종료
brew uninstall --cask ngrok
# ArgoCD CLI 삭제
brew uninstall argocd
참고
https://argo-cd.readthedocs.io/en/stable/getting_started/
https://artifacthub.io/packages/helm/argo-cd-oci/argo-cd
https://medium.com/@jerome.decoster/argocd-minikube-ngrok-github-webhook-3cd0cc15d559
'Kubernetes' 카테고리의 다른 글
Argo Rollouts을 사용한 배포 전략 (0) | 2025.04.08 |
---|---|
kubernetes max pods 개수 수정 (0) | 2024.07.31 |
[Helm] helm package를 ArtifactHub에 등록하기 (with github) (0) | 2023.07.16 |
[Helm] Helm 기본 명령어 (0) | 2023.07.15 |
2023 CKA(Certified Kubernetes Administrator) 취득 후기 (0) | 2023.07.01 |