Argo CD 설치 및 Github와 연동하여 k8s 환경에서 배포 자동화
이 포스트에서는 Argo CD를 사용하여 Kubernetes 환경에서 GitOps 기반의 지속적 배포(CD)를 자동화하는 방법을 다룹니다. Argo CD를 설치하고 설정한 후, GitHub 저장소와 연동하여 Kubernetes 클러스터에 애플리케이션을 자동으로 배포하는 과정에 대해 설명합니다. 또한, Argo CD의 Web UI와 CLI를 활용하여 애플리케이션을 관리하고 배포 상태를 모니터링하는 방법도 함께 소개합니다.
목차
1. Argo CD란?
2. Argo CD 설치 및 설정
2-1 Argo CD 설치
2-2. Argo CD 설정
3. Argo CD application 추가
3-1 web UI를 통한 Application 추가 및 배포 자동화 확인
3-2. CLI를 통한 Application 추가
4. 결론
1. Argo CD란?
Argo CD는 Kubernetes 환경에서 애플리케이션의 지속적 배포(CD, Continuous Delivery)를 지원하는 GitOps 기반 도구입니다.
Gitops란? : IT 인프라에서도 선언적 기술서로 작성하여 형상관리로 관리하고 형상관리로 작성한 기술서로 배포하며 인프라와 애플리케이션의 일관성을 관리합니다.
2. Argo CD 설치 및 설정
2-1. Argo CD 설치
Argo CD를 Kubernetes에 배포하여 사용했습니다.
아래 예제에서는 Argo CD Manifests를 사용하여 배포하였습니다.
kubectl 명령어를 사용하여 Argo CD 리소스를 배포합니다.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Argo CD 리소스가 배포된 것을 볼 수 있습니다.

주요 Deployment를 보면 각각 다른 역할들을 가지고 있는 Deployment가 여럿 배포되어 있는 것을 볼 수 있습니다.
argocd-applicationset-controller: Argo CD에서 애플리케이션 자동화 및 유연성 향상을 지원하고 여러 사용자가 동일한 클러스터에서 독립적으로 작업할 수 있는 멀티 테넌시 환경을 지원합니다.argocd-dex-server: Argo CD에서 인증을 관리하는 역할을 가지고 있습니다.argocd-notifications-controller: Argo CD에서 관리하는 애플리케이션(kubernetes)에 대한 모니터링과 변경 사항에 알려주는 역할을 가지고 있습니다.argocd-redis: ArgoCD에서 Redis는 주로 분산 캐싱과 상태 저장을 위한 인메모리 데이터베이스로 사용됩니다.argocd-repo-server: Git 리포지토리의 로컬 캐시를 유지 관리하는 내부 서비스입니다. Kubernetes 매니페스트를 생성하고 반환하는 일을 담당합니다.argocd-server: 웹 UI, CLI 및 CI/CD에서 사용하는 API가 있는 gRPC/REST 서버입니다.
Argo CD CLI를 설치합니다. (Kubernetes Master Node 환경)
VERSION=$(curl -L -s https://raw.githubusercontent.com/argoproj/argo-cd/stable/VERSION)
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/download/v$VERSION/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64
아래 명령어를 사용하여 argocd가 설치되었는지 버전을 확인합니다.
$ argocd version
argocd: v2.13.0+347f221
BuildDate: 2024-11-04T12:29:51Z
GitCommit: 347f221adba5599ef4d5f12ee572b2c17d01db4d
GitTreeState: clean
GoVersion: go1.22.8
Compiler: gc
Platform: linux/amd64
2-2. Argo CD 설정
Argo CD web에 접속하기 위해서 먼저 Service의 설정을 변경합니다.
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
Argo CD의 Service를 NodePort로 변경하여 접속합니다.

로그인을 진행하기 위해서는 설치했었던 Argo CD CLI를 이용하여 비밀번호를 변경하여야 합니다. (Argo CD 배포 시 admin 계정이 자동 생성됩니다.
아래와 같은 명령어를 사용하여 랜덤 비밀번호를 생성할 수 있습니다.
$ argocd admin initial-password -n argocd
ISyOk1ZvI8jB4VS-
This password must be only used for first time login. We strongly recommend you update the password using `argocd account update-password`.
CLI를 통해 Login하여 admin의 비밀번호를 변경합니다.
(변경했던 NodePort를 통해 URL을 지정합니다.)
SSL 인증서를 넣지 않게되면 아래와 같은 WARING이 나오게 됩니다.
$ argocd login localhost:32192
WARNING: server certificate had error: tls: failed to verify certificate: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
Username: admin
Password: [랜덤으로 생성된 admin 비밀번호]
'admin:login' logged in successfully
Context 'localhost:32192' updated
다음 명령을 사용하여 비밀번호를 변경합니다.
argocd account update-password
*** Enter password of currently logged in user (admin): 랜덤으로 생성된 admin 비밀번호
*** Enter new password for user admin: [새로운 admin 비밀번호 8~32자리]
*** Confirm new password for user admin: [새로운 admin 비밀번호 8~32자리]
Password updated
Context 'localhost:32192' updated
admin 계정으로 Argo CD의 Web으로 접속합니다.

Argo CD의 초기설정은 완료되었습니다.
3. Argo CD Applications 추가
Argo CD Applications을 추가하여 Repository의 Kubernetes Clsuter에 자동으로 배포할 수 있습니다.
GitHub Repository를 생성 및 배포할 서비스의 Manifest를 commit 및 push합니다. (Public Repository를 생성하여 사용했습니다. Private Repository 연동 부분은 다음 포스트에서 확인할 수 있습니다.)

3-1. Web UI를 통한 Applications 추가 및 배포 자동화 확인
web UI에 로그인하게 되면 아래와 같은 화면이 나오게 됩니다.

CREATE APPLICATION을 눌러 추가할 수 있습니다.
배포를 진행합니다. 구성은 아래와 같습니다.

- Application name : CD(지속적 배포)를 진행할 Application의 이름을 지정합니다.
- Project Name : 그룹을 지정합니다. (setting > Project 에서 추가하실 수 있습니다.)
- EDIT AS YAML : 클릭하여 YMAL 형식으로 작성할 수 있습니다.
Project 그룹은 따로 추가하지 않았기 때문에 기본값인 Default로 진행하였습니다.
SYNC POLICY를 Automatic으로 지정하여 Git의 변경점이 발견될 경우 자동으로 Manifest를 배포할 수 있게 사용합니다.
- SYNC POLICY : Git의 Manifest를 Kubernetes에 동기화(배포)하는 정책입니다.
- Automatic : Git에 변경 사항이 감지 될 때 마다 자동으로 Manifest를 배포합니다.(3분 주기)
- Automatic : Git에 변경 사항이 감지 될 때 마다 자동으로 Manifest를 배포합니다.(3분 주기)
- SYNC OPTION : 동기화 옵션을 지정합니다.
- AUTO-CRATE NAMESPACE : 자동으로 Namespace를 생성합니다.
- AUTO-CRATE NAMESPACE : 자동으로 Namespace를 생성합니다.
- PRUNE RESOURCES : 선택하게 되면 Git에 더 이상 정의 되지 않은 리소스를 삭제합니다.
- PRUNE PROPAGATION POLICY : PRUNE LAST 옵션을 따라 Kubernetes 리소스가 삭제되는 정책을 지정합니다.
- foreground : Pod -> Replicaset -> Deployment 순으로 삭제가 진행됩니다.
AUTO-CREATE NAMESPACE를 이용하여 배포시 Namespace 관련하여 오류가 나지 않도록 지정하였습니다.

- SOURCE : 배포할 source를 지정합니다. Git과 Helm 두가지로 사용할 수 있습니다. (Git Repository Path의 루트경로를 지정할 때는 . 을 사용하여야합니다.)
Service와 NGINX OSS 이미지를 가지고 있는 Deployment가 있는 Github Repository를 사용하였습니다. (Public)
Branches는 main Branch를 사용하였고 repository의 Path는 root( Argo CD에서는 . 이 루트경로로 사용됨)경로로 지정하였습니다.

DESTINATION : 배포를 진행할 Kubernetes Cluster와 Namespace를 지정합니다.
Namespace는 nginx를 사용하였습니다.

kubernetes를 이용해 Argo CD를 배포하였기 때문에 기본적으로 Cluster안에 있는 Kubernetes Service를 사용할 수 있습니다.
위의 구성의 yaml입니다.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nginx
spec:
destination:
name: ''
namespace: nginx
server: https://kubernetes.default.svc
source:
path: .
repoURL: https://github.com/asdfkco/Argo_NGINX.git
targetRevision: HEAD
sources: []
project: default
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
prune: false
selfHeal: false
Create를 눌러 Application을 추가하게 된다면 아래와 같은 배포가 진행되게 됩니다.

Argo CD의 Custem resource인 Application을 아래 명령어를 통해 확인할 수 있습니다.

Application을 클릭하여 Application의 Tree 구조를 확인할 수 있습니다.
Argo Cd를 통하여 Git의 Manifest를 사용하여 Kubernetes에 동기화를 진행할 수도 있고 History를 Rollback할 수도 있습니다.

배포된 페이지는 아래와 같습니다.

Github Repository에서 Manifest를 수정하여 자동 동기화를 확인합니다.
이미지의 태그를 nginxstore로 변경합니다.


Argo CD Web에서 동기화를 확인합니다. (Argo CD의 동기화 주기는 3분입니다. 상단 REFRESH 버튼을 통하여 주기를 기다리지 않고 바로 동기화를 진행할 수 있습니다.)

(배포가 완료된 Application Tree)

배포가 완료된 것을 확인하고 Service로 접속하게 되면 업데이트 했었던 Image로 변경된 것을 볼 수 있습니다.

3-2. CLI를 통한 Application 추가
Argo CD CLI를 통한 Application 추가는 아래 명령어를 사용하여 추가할 수 있습니다. Application의 구성은 위의 예제와 동일하게 진행합니다.
argocd app create nginx를 통해 nginx 이름의 Application을 생성합니다.
$ argocd app create nginx \
--repo https://github.com/asdfkco/Argo_NGINX.git \
--path . \
--dest-server https://kubernetes.default.svc \
--dest-namespace nginx \
--project default \
--sync-policy automatic \
--sync-option CreateNamespace=true
application 'nginx' created
배포가 완료된 후 서비스에 접속하게 되면 아래와 같은 NGINX 정적 웹을 볼 수 있습니다.

(배포가 완료된 페이지)
아래 명령어를 사용하여 배포가 완료되었는지 확인할 수 있습니다.
아래의 명령어를 확인하여 Argo CD의 Application의 정보를 확인할 수 있습니다.
$ argocd app list
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY
argocd/nginx https://kubernetes.default.svc nginx default Synced Healthy Auto
CONDITIONS REPO PATH TARGET
<none> https://github.com/asdfkco/Argo_NGINX.git .
해당 Application의 자세한 정보를 확인할 수 있는 명령어도 있습니다.
$ argocd app get nginx
2024/11/07 13:43:47 maxprocs: Leaving GOMAXPROCS=10: CPU quota undefined
Name: argocd/nginx
Project: default
Server: https://kubernetes.default.svc
Namespace: nginx
URL: https://localhost:32192/applications/nginx
Source:
- Repo: https://github.com/asdfkco/Argo_NGINX.git
Target:
Path: .
SyncWindow: Sync Allowed
Sync Policy: Automated
Sync Status: Synced to (2e13cc9)
Health Status: Healthy
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service nginx nginx-svc Synced Healthy service/nginx-svc created
apps Deployment nginx nginx Synced Healthy deployment.apps/nginx created
Argo CD의 동기화 주기를 기다리는 것이 아닌 refresh를 진행하려면 아래와 같은 명령어를 사용하여 진행할 수 있습니다. (동적 파일이 배포된 NGINX OSS 이미지에서 NGINX OSS 기본 이미지로 변경합니다.)
$ argocd app get nginx --refresh
Name: argocd/nginx
Project: default
Server: https://kubernetes.default.svc
Namespace: nginx
URL: https://localhost:32192/applications/nginx
Source:
- Repo: https://github.com/asdfkco/Argo_NGINX.git
Target:
Path: .
SyncWindow: Sync Allowed
Sync Policy: Automated
Sync Status: OutOfSync from (24ec3ec) # Git과 현재 리소스들과 상태가 다릅니다.
Health Status: Healthy
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service nginx nginx-svc Synced Healthy
apps Deployment nginx nginx OutOfSync Healthy
동기화가 완료된 후 페이지를 확인하면 NGINX 기본 페이지가 나오는 것을 볼 수 있습니다.

4. 결론
Argo CD는 GitOps를 통해 Kubernetes 환경에서 애플리케이션 배포를 자동화하는 강력한 도구입니다. 이 도구를 활용하면 Git 저장소에 대한 변경 사항이 자동으로 Kubernetes 클러스터에 반영되어, 개발 및 운영 효율성을 크게 향상시킬 수 있습니다. 또한, Web UI와 CLI를 통해 애플리케이션의 상태를 쉽게 관리하고, 동기화 및 롤백을 간편하게 수행할 수 있습니다.
이 포스트에서는 Argo CD를 설치하고 설정하는 기본적인 방법부터, GitHub 저장소와의 연동을 통해 자동화된 배포 프로세스를 구현하는 방법을 상세히 설명했습니다. Argo CD는 특히 대규모 인프라에서의 배포 자동화와 관리에 매우 유용하며, 개발팀과 운영팀 간의 협업을 보다 원활하게 만들어줍니다.
Kubernetes 환경에서 Argo CD와 같은 다양한 CI/CD 도구를 통해 애플리케이션 자동화를 구현하고 싶으신가요? NGINX STORE 블로그의 Kubernetes 카테고리를 참고하여 대규모 인프라에서의 배포 및 자동화 관리를 실천해 보세요.
댓글을 달려면 로그인해야 합니다.