회원가입

k8s & Argo CD

Beany 2025-03-21

ChatGPT 요약

Argo CD는 GitOps 방식의 Kubernetes 지속적 배포 도구로, Git에 저장된 리소스를 자동으로 클러스터에 반영해준다. 블로그 운영자는 자신의 사이드 프로젝트를 Kubernetes 기반으로 재구축하기 위해 모든 서비스를 Docker 이미지로 변환하고, Raspberry Pi 4에서 단일 노드 Kubernetes 클러스터를 구성할 계획이다. Docker Hub에 이미지를 푸시한 후, Argo CD를 통해 해당 이미지를 기반으로 업데이트를 관리할 예정이다. 이를 통해 효율적인 배포 및 버전 관리를 실현하고자 한다.

k8s, Argo CD 이 이야기를 많이 들었었다.

그런데 이게 뭐가 뭔지 잘 몰랐다. 이번 기회에 한번 공부해보려고 한다.

 

이 공부를 토대로 지금 내 사이드 프로젝트로 하는 이 블로그도 한번 요 기반으로 재 구축해보려고 한다.

 

간단한 정의부터 봐보자

  • Argo CD
    : GitOps 방식의 쿠버네티스 지속적 배포(CD) 툴. Git에 저장된 Kubernetes 리소스를 자동으로 클러스터에 반영해주는 거라고 한다.

 

지금 내 블로가가 어떻게 만들어져있는지 간단하게 도식화 해보겠다.

아주 전형적인 Nginx, Application, Redis, DB, ElasticSearch 구조로 되어있습니다.

 

하지만 Argo CD 와 같은 도구를 이용하기 위해서는 Kubernetes 기반으로 프로젝트를 구성해야합니다.

이렇게 하기 위해서는 저의 코드 및 구조를 전부 Docker 기반으로 이미지를 빌드 할 수 있게 만들어야합니다.

[Raspberry Pi 4]  
└── Nginx  
└── Django (Application)  
└── Redis  
└── PostgreSQL (혹은 다른 DB)  
└── ElasticSearch

 

이것을 위해서 

[Raspberry Pi 4 - 단일 노드 K8s 클러스터]  
└── Argo CD (GitOps CD 도구)  
└── Nginx (Deployment + Service + Ingress)  
└── Django (Docker 이미지 → Deployment)  
└── Redis (Helm Chart or Custom YAML)  
└── PostgreSQL  
└── ElasticSearch

이렇게 바꾸려고 한다.

 

가장 필요한 것부터 작업해보자.

 

1. 모든 서비스 → Docker 이미지화

Django: Dockerfile 만들어야 함. 예: python:3.11, requirements.txt, gunicorn 등

Nginx: 직접 Docker로 래핑하거나 ConfigMap으로 설정 파일 관리

DB/Redis/ES: 공식 Docker 이미지 사용 가능 (단, 라즈베리파이4용 ARM 아키텍처 고려 필요)

라즈베리파이4는 ARM64 기반이기 때문에, Docker 이미지도 ARM64 빌드로 만들어야 한다. 일부 공식 이미지들은 ARM을 지원하지만, ElasticSearch는 무거워서 ARM 환경에서 이슈가 있을 수 있다고합니다.

[Dockerfile]

FROM python:3.10.12-slim

# 시스템 패키지 설치
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    gcc \
    libpq-dev \
    libffi-dev \
    libssl-dev \
    default-libmysqlclient-dev \
    python3-dev \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 파일 복사 및 설치
COPY requirements.txt .
RUN pip install --upgrade pip && pip install -r requirements.txt

# 소스 코드 복사
COPY . .

# 포트 노출
EXPOSE 8000

ENV SERVER_ENV=k8s

# Gunicorn을 통한 실행
CMD ["sh", "-c", "python manage.py collectstatic --noinput && gunicorn config.wsgi:application"]

 

2. 로컬 세팅

Docker 에서 Kubernetes 설정을 활성화 시킵니다.

 

 

3. Harbor 이용전 Docker Hub 로 테스트

# Docker 빌드
docker build -t <dockerhub_username>/<repository_name>:<GENTERATED_TAG> .

예)
docker build -t beany258/django:1.0.23 .

# Docker Push
docker push <dockerhub_username>/<repository_name>:<GENTERATED_TAG>

예)
docker push beany258/django:1.0.23

 

4.  ArgoCD 관리

k8s 노드 관리는 https://github.com/cwadven/cwbeany-app-infra 여기서 작업하려고 합니다.

k8s 관리 방법은 READMD.md 에 작성해습니다.

Docker Hub 에 push 를 하면 이제 ArgoCD 가 Git 버전의 정보를 통해서 최신화를 해야하기 때문에, cwbeany-app-infra 에 적용된 image tag 를 변경 하면 됩니다.

 

5. 예제

코드 변경 전

 

i. 코드 수정

ii. Docker 빌드

docker build -t beany258/django:1.0.24 .

iii. Docker push

docker push beany258/django:1.0.24

iv. push 된 tag 기준으로 cwbeany-app-infra 에 image 수정 및 git push

https://github.com/cwadven/cwbeany-app-infra/commit/46b6de26f61e53c0db429e8c7e17dbd4224bde4c

v. ArgoCD 에서 Sync 대기 혹은 수동 싱크

싱킹 돼서 Pod 시

vi. 변경 완료

0 0
블로그 일기
제 블로그의 고도화 과정을 설명합니다. 이는 코드 리팩토링과 추가된 기능들에 대해 기록하기 위한 게시판입니다. 어떤 기능이 추가되었는지, 무엇이 개선되었는지 등 고도화되는 과정을 자세히 다룰 예정입니다.
Yesterday: 115
Today: 37