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. 변경 완료