아무것도 모르는 상황에서 ArgoCD로 쿠버네티스 여정 시작하기

모험의 시작
지금부터 아무것도 모르는 상황에서 ArgoCD를 세팅해보도록 하겠습니다. 이번 글은 AI를 사용해서 아무것도 모르는 상황에서 과연 어디까지 인프라를 세팅할 수 있을지 테스트해보는 시간입니다.
우선 제가 미리 만들어둔 API 서버가 존재하고 이걸 다음과 같이 구성할 것입니다. 저의 목표는 잘 만드는 것이 아니라 돌아가도록 구성하는 것이 목표이기 때문에 수단과 방법을 가리지 않을 것입니다.
API Pod 2개
DB Pod 1개
로 구성할 예정이고 나머지는 어떻게 해야하는지 아무것도 모르는 것이 현재 상황입니다.
제가 알고 있는 기본 지식은 다음과 같습니다:
Docker를 어떻게 사용하는지 간단히 알고 있습니다
혼자서 Application 서버를 만들고 포트와 같은 기본적인 세팅은 혼자서 할 수 있습니다
쿠버네티스는 이름만 알고 실제로 어떻게 동작하는지 어떻게 세팅하는지 하나도 모릅니다
ArgoCD는 쿠버네티스랑 같이 사용하면 좋은건 알지만 정확히 모릅니다
이런 상황에서 클로드 MCP를 이용해서 ArgoCD를 세팅해보도록 하겠습니다
도커 파일 세팅 및 이미지를 빌드해보자
우선 간단하게 도커 이미지가 있어서 모든 것을 시작할 수 있으니 DockerFile을 클로드에게 만들어 달라고 했습니다. 너무 간단하게 프로젝트를 스캔하고 만들어줘서 1초만에 끝났습니다.
kotlinFROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/box-recommend-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
이 Dockerfile은 나의 Spring Boot 애플리케이션(box-recommend)을 도커 이미지로 패키징하는 과정을 담고 있습니다. OpenJDK 17을 기반으로 하고, 빌드된 JAR 파일을 컨테이너 내부로 복사한 다음, 8080 포트를 노출시키고 Java 명령어로 애플리케이션을 실행합니다.
이제 이미지를 빌드해볼 차례입니다. 터미널을 열고 Dockerfile이 있는 디렉토리에서 다음 명령을 실행했습니다:
bash# Gradle로 애플리케이션 빌드
./gradlew build
# Docker 이미지 빌드
docker build -t box-recommend:v1 .
빌드가 성공적으로 완료되었고, 로컬에서 테스트해보기로 했습니다:
bashdocker run -p 8080:8080 box-recommend:v1
애플리케이션이 정상적으로 시작되는 것을 확인했습니다. 이제 실제 쿠버네티스 환경으로 넘어갈 준비가 되었습니다.
쿠버네티스를 세팅하여서 파드를 띄워보자
자, 이제 진짜 도전이 시작됩니다. 쿠버네티스에 대해 아무것도 모르지만, 일단 로컬 환경에서 테스트하기 위해 Minikube를 설치하기로 했습니다.
bash# Minikube 설치 (맥OS 기준)
brew install minikube
# Minikube 시작
minikube start
Minikube가 설치되고 실행되었습니다. 쿠버네티스 CLI인 kubectl도 함께 설치되었습니다.
이제 우리 애플리케이션을 위한 기본적인 쿠버네티스 매니페스트 파일들을 만들어야 합니다. 우선 API 서버 Deployment와 Service부터 정의해 보겠습니다:
yaml# api-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: box-recommend-api
spec:
replicas: 2 # API Pod 2개를 요청했으니 replicas를 2로 설정
selector:
matchLabels:
app: box-recommend
template:
metadata:
labels:
app: box-recommend
spec:
containers:
- name: box-recommend
image: box-recommend:v1
ports:
- containerPort: 8080
env:
- name: SPRING_DATASOURCE_URL
value: jdbc:postgresql://box-recommend-db:5432/box_recommend
- name: SPRING_DATASOURCE_USERNAME
value: test1234
- name: SPRING_DATASOURCE_PASSWORD
value: test1234
---
# api-service.yaml
apiVersion: v1
kind: Service
metadata:
name: box-recommend-api
spec:
selector:
app: box-recommend
ports:
- port: 80
targetPort: 8080
type: ClusterIP
다음으로 PostgreSQL 데이터베이스를 위한 매니페스트 파일을 만들었습니다:
yaml# db-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: box-recommend-db
spec:
replicas: 1 # DB Pod 1개
selector:
matchLabels:
app: box-recommend-db
template:
metadata:
labels:
app: box-recommend-db
spec:
containers:
- name: postgres
image: postgres:13
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: box_recommend
- name: POSTGRES_USER
value: test1234
- name: POSTGRES_PASSWORD
value: test1234
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-data
emptyDir: {} # 실제 환경에서는 PersistentVolume을 사용해야 합니다
---
# db-service.yaml
apiVersion: v1
kind: Service
metadata:
name: box-recommend-db
spec:
selector:
app: box-recommend-db
ports:
- port: 5432
targetPort: 5432
type: ClusterIP
이제 이 파일들을 사용하여 쿠버네티스에 리소스를 생성해보겠습니다:
bash# Minikube의 Docker 데몬에 이미지 빌드하기
eval $(minikube docker-env)
docker build -t box-recommend:v1 .
# 쿠버네티스 리소스 생성
kubectl apply -f api-deployment.yaml
kubectl apply -f api-service.yaml
kubectl apply -f db-deployment.yaml
kubectl apply -f db-service.yaml
생성된 리소스들을 확인해봅니다:
bashkubectl get deployments
kubectl get pods
kubectl get services
API 파드 2개와 DB 파드 1개가 정상적으로 실행 중인 것을 확인할 수 있었습니다.
레지스트리 세팅 및 이미지 저장하여 쿠버네티스에서 호출할 수 있도록 해보자
실제 프로덕션 환경에서는 도커 이미지를 도커 레지스트리에 푸시하고 쿠버네티스가 그곳에서 이미지를 가져와야 합니다. Minikube에서는 로컬 이미지를 사용할 수 있지만, GitOps 방식으로 ArgoCD를 사용하려면 레지스트리가 필요합니다.
간단하게 Docker Hub를 사용하기로 결정했습니다:
bash# Docker Hub에 로그인
docker login
# 이미지에 태그 지정 (내 Docker Hub 사용자명으로 대체)
docker tag box-recommend:v1 myusername/box-recommend:v1
# Docker Hub에 이미지 푸시
docker push myusername/box-recommend:v1
이제 매니페스트 파일을 업데이트하여 Docker Hub의 이미지를 사용하도록 변경합니다:
yaml# api-deployment.yaml (수정 부분)
containers:
- name: box-recommend
image: myusername/box-recommend:v1 # Docker Hub 이미지로 변경
수정된 파일을 적용합니다:
bashkubectl apply -f api-deployment.yaml
ArgoCD 세팅하여서 UI로 지금까지 구성한 내용을 확인해보자
이제 ArgoCD를 설치하고 설정해보겠습니다. ArgoCD는 Git 저장소에서 쿠버네티스 매니페스트 파일을 가져와 클러스터에 자동으로 적용하는 GitOps 도구입니다.
bash# ArgoCD 네임스페이스 생성
kubectl create namespace argocd
# ArgoCD 설치
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# ArgoCD CLI 설치 (맥OS 기준)
brew install argocd
ArgoCD 서비스를 외부에서 접속할 수 있도록 포트 포워딩을 설정합니다:
bashkubectl port-forward svc/argocd-server -n argocd 8080:443
이제 웹 브라우저에서 https://localhost:8080
으로 접속할 수 있습니다. 초기 로그인 정보는 다음과 같습니다:
사용자명: admin
비밀번호: (자동 생성됨, 다음 명령어로 확인)
bashkubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
로그인 후, 우리의 애플리케이션을 ArgoCD에 등록하기 위해 먼저 Git 저장소를 만들고 매니페스트 파일을 저장해야 합니다. GitHub에 새 저장소를 만들고 매니페스트 파일을 푸시했습니다:
bash# 로컬에 Git 저장소 초기화
mkdir box-recommend-k8s
cd box-recommend-k8s
git init
# 매니페스트 파일 복사
cp ../api-deployment.yaml .
cp ../api-service.yaml .
cp ../db-deployment.yaml .
cp ../db-service.yaml .
# 변경사항 커밋 및 푸시
git add .
git commit -m "Initial commit for Kubernetes manifests"
git remote add origin https://github.com/myusername/box-recommend-k8s.git
git push -u origin main
이제 ArgoCD UI에서 새 애플리케이션을 추가합니다:
"NEW APP" 버튼 클릭
애플리케이션 정보 입력:
Application Name: box-recommend
Project: default
Sync Policy: Automatic
Repository URL: https://github.com/myusername/box-recommend-k8s.git
Path: .
Cluster: https://kubernetes.default.svc (기본 클러스터)
Namespace: default
"CREATE" 버튼 클릭
ArgoCD가 자동으로 Git 저장소에서 매니페스트 파일을 가져와 쿠버네티스 클러스터에 적용합니다. UI에서 애플리케이션의 상태를 시각적으로 확인할 수 있습니다. 모든 리소스가 정상적으로 동기화되고 실행 중인 상태로 표시됩니다.
만들어둔 API 호출하여 정상 동작하는지 확인해보자
이제 API가 정상적으로 동작하는지 확인해보겠습니다. 쿠버네티스 환경에서는 서비스를 통해 API에 접근할 수 있습니다. 간단하게 포트 포워딩을 사용하여 로컬에서 API에 접근해 보겠습니다:
bashkubectl port-forward svc/box-recommend-api 8081:80
이제 웹 브라우저나 curl을 사용하여 API를 호출할 수 있습니다:
bashcurl http://localhost:8081/api/recommend
그런데 API 응답이 없고 오류가 발생했습니다. 로그를 확인해보니 데이터베이스 연결 문제가 있었습니다:
bashkubectl logs deployment/box-recommend-api
로그를 살펴보니 PostgreSQL 데이터베이스가 초기화되지 않았거나, 연결 문제가 있었습니다. 먼저 데이터베이스 접속을 확인해보겠습니다:
bash# PostgreSQL 파드 이름 확인
kubectl get pods | grep db
# 데이터베이스 접속
kubectl exec -it box-recommend-db-<pod-id> -- psql -U test1234 -d box_recommend
데이터베이스에 접속할 수 있었고, 테이블이 없는 상태였습니다. Spring Boot 애플리케이션은 일반적으로 Hibernate/JPA를 통해 초기화 시 필요한 테이블을 생성하지만, 초기 연결 문제로 이 과정이 실패한 것 같습니다.
문제를 해결하기 위해 API 서버의 환경 변수 설정을 수정했습니다:
yaml# api-deployment.yaml (수정 부분)
env:
- name: SPRING_DATASOURCE_URL
value: jdbc:postgresql://box-recommend-db:5432/box_recommend
- name: SPRING_DATASOURCE_USERNAME
value: test1234
- name: SPRING_DATASOURCE_PASSWORD
value: test1234
- name: SPRING_JPA_HIBERNATE_DDL_AUTO
value: update # 추가: 데이터베이스 스키마 자동 업데이트
- name: SPRING_JPA_SHOW_SQL
value: "true" # 추가: SQL 로깅 활성화
변경사항을 Git 저장소에 커밋하고 푸시합니다:
bashgit add api-deployment.yaml
git commit -m "Fix database connection settings"
git push
ArgoCD가 자동으로 변경사항을 감지하고 클러스터에 적용합니다. 잠시 후, API 파드가 재시작되고 정상적으로 동작하기 시작했습니다. 다시 API를 호출해봅니다:
bashcurl http://localhost:8081/api/recommend
이번에는 응답이 정상적으로 받아졌습니다! 모든 것이 제대로 동작하고 있습니다.
모험 성공 및 느낀점
처음에는 쿠버네티스와 ArgoCD에 대해 아무것도 모른 채 시작했지만, 단계적으로 접근하고 문제를 하나씩 해결해 나가면서 작동하는 시스템을 구축할 수 있었습니다. 이 과정에서 몇 가지 중요한 교훈을 얻었습니다:
컨테이너 기술의 강력함: Docker를 통해 애플리케이션을 패키징하면 어디서든 일관되게 실행할 수 있습니다.
선언적 인프라의 가치: 쿠버네티스 매니페스트 파일과 같은 선언적 접근 방식은 인프라를 코드로 관리할 수 있게 해줍니다.
GitOps의 효율성: ArgoCD를 통해 Git 저장소에 변경사항을 커밋하는 것만으로 자동으로 클러스터에 반영되는 경험은 놀라웠습니다.
문제 해결 능력의 중요성: 초기 데이터베이스 연결 문제와 같은 장애가 발생했을 때, 로그를 확인하고 문제를 진단하여 해결하는 과정은 매우 중요했습니다.
이 모험을 통해 쿠버네티스와 ArgoCD의 기본 개념과 동작 방식을 이해할 수 있었고, 앞으로 더 복잡한 인프라를 구축하는 데 필요한 기초를 다질 수 있었습니다. 아무것도 모르던 상태에서 시작했지만, "돌아가는" 시스템을 구축하는 목표는 달성했습니다.
물론 이 설정은 프로덕션 환경에서 사용하기에는 부족한 부분이 많습니다. 영구 스토리지, 보안 설정, 리소스 제한, 모니터링, 고가용성 등 고려해야 할 요소가 많습니다. 하지만 이번 모험은 첫 발을 내딛는 과정이었고, 앞으로 더 깊이 탐구하고 개선해 나갈 수 있는 기반이 되었습니다.
쿠버네티스와 ArgoCD의 세계는 생각보다 넓고 깊지만, 한 걸음씩 나아가다 보면 어느새 복잡한 인프라도 자신 있게 다룰 수 있게 될 것입니다. 이번 모험은 그 여정의 시작점이었습니다.
Subscribe to my newsletter
Read articles from 조현준 directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
