← 글 목록

온프레미스 환경을 위한 CI/CD 파이프라인 구축: 라즈베리파이와 GitHub Actions의 만남

/ 8분 분량

이번 포스팅에서는 라즈베리파이 환경에서 Docker, Kubernetes(K3s), GitOps(ArgoCD)를 활용한 CI/CD 파이프라인 구축 여정을 공유하고자 합니다. 특히 GitHub Actions를 CI 도구로 사용하며 얻은 경험과 노하우를 상세히 풀어내겠습니다.

온프레미스 환경을 위한 CI/CD 파이프라인 구축: 라즈베리파이와 GitHub Actions의 만남

이번 포스팅에서는 라즈베리파이 환경에서 Docker, Kubernetes(K3s), GitOps(ArgoCD)를 활용한 CI/CD 파이프라인 구축 여정을 공유하고자 합니다. 특히 GitHub Actions를 CI 도구로 사용하며 얻은 경험과 노하우를 상세히 풀어내겠습니다.

학습 주제

  • 시스템 아키텍처 배포 구성 설계
  • CI/CD 파이프라인 구축
  • 라즈베리파이 환경에서의 Docker, K3s, ArgoCD 적용
  • GitHub Actions 활용

질문과 탐구

"주어진 이미지의 CI/CD 파이프라인 설계를 파악하고, 라즈베리파이, GitHub Actions, 컨테이너, 프로세스 기반 배포 전략을 논의해봅시다." 이 질문에서 시작하여, 온프레미스 환경에 최적화된 배포 전략을 고민하게 되었습니다. 특히, 라즈베리파이의 제한된 리소스를 효율적으로 활용하면서도 안정적인 CI/CD 파이프라인을 구축하는 것이 주요 목표였습니다.

주요 탐구 내용은 다음과 같습니다.

  • 구성 요소별 배치 전략: 라즈베리파이, GitHub Actions, 개발 노트북에 각 컴포넌트를 어떻게 분산 배치할 것인가?
  • 실행 방식 결정: 컨테이너로 올릴 것인가, 아니면 프로세스로 올릴 것인가?
  • 테스트 자동화: E2E 및 인수 테스트를 자동화하는 방법은?
  • 환경 차이: GitHub Actions 러너와 라즈베리파이 K3s 환경 간의 잠재적 변수와 해결책은?
  • 리소스 관리: 라즈베리파이 8GB 환경에서 Jenkins, K3s, 애플리케이션 등을 함께 운영할 때의 메모리 부담은?
  • 기술 스택: Jenkins 대신 GitHub Actions를 선택한 이유와 Kustomize, NodePort 사용의 장단점은?
  • 보안: Nginx, NodePort, WireGuard를 활용한 안전한 배포 환경 구축 방안은?

핵심 학습 내용

1. 아키텍처 설계: GitHub Actions + 라즈베리파이 K3s + ArgoCD

  • CI (Continuous Integration): GitHub Actions를 사용하여 코드 품질 검사(Lint, Format), Unit/Integration/E2E 테스트, SonarCloud 분석, Docker 이미지 빌드(Multi-arch ARM64), Trivy 보안 스캔, DockerHub 푸시, GitOps 레포 업데이트를 수행합니다. 이를 통해 라즈베리파이의 리소스를 절약하고 빌드 속도를 높였습니다.
  • CD (Continuous Deployment): 라즈베리파이 4 8GB에 K3s(경량 Kubernetes)를 설치하고, GitOps 툴인 ArgoCD를 통해 GitOps 레포지토리에 정의된 Kubernetes 매니페스트를 자동으로 배포합니다. Staging과 Production 환경을 네임스페이스로 분리하여 관리합니다.
  • GitOps: 애플리케이션 코드와 별도로 Kubernetes 매니페스트를 관리하는 GitOps 레포지토리를 사용하여 배포 과정을 자동화하고 가시성을 확보합니다. Kustomize를 활용하여 환경별 설정을 효율적으로 관리합니다.

2. 리소스 관리 및 효율화

  • 라즈베리파이 8GB 환경: 현재 메모리 사용량이 1.1GB (14%)로 매우 여유롭습니다. K3s, ArgoCD, Production(2 replicas), Staging(1 replica) 등을 포함한 예상 총 사용량은 약 2.2GB로, 리소스 부족 문제는 없음을 확인했습니다.
  • Jenkins vs GitHub Actions: 리소스 부담(Jenkins 2GB vs GitHub Actions 0GB), 빌드 속도(ARM64 Jenkins 15분 vs x86_64 GA 5분), 유지보수 편의성 등을 고려하여 GitHub Actions를 주력 CI 도구로 선택했습니다. Jenkins 경험은 별도 프로젝트로 보충할 계획입니다.
  • NodePort 사용: K8s 서비스 노출 시 NodePort를 사용하고, 호스트 레벨의 Nginx를 통해 외부 트래픽을 K8s 서비스로 안전하게 프록시하는 방식을 채택했습니다. 이는 Ingress Controller 도입보다 리소스 효율적이며, 기존 Nginx 활용으로 설정이 간편하고, 점진적 전환이 용이하다는 장점이 있습니다.

3. 보안 강화

  • Nginx 보안: Rate Limiting, Connection Limiting, IP 화이트리스트, 보안 헤더(HSTS, X-Frame-Options 등) 설정을 통해 Nginx를 1차 보안 게이트웨이로 활용합니다.
  • NodePort 보안: NodePort는 localhost 또는 VPN(WireGuard) IP에만 바인딩하고, Nginx가 모든 외부 요청을 처리하도록 하여 NodePort 자체의 직접적인 외부 노출 위험을 차단합니다.

이해한 내용

  • CI/CD 파이프라인의 중요성: 자동화된 파이프라인은 코드 품질을 높이고, 배포 속도를 향상시키며, 운영 안정성을 확보하는 데 필수적입니다.
  • 온프레미스 환경의 제약과 최적화: 라즈베리파이와 같은 제한된 환경에서는 CI/CD 도구 선택 및 리소스 관리에 신중해야 하며, GitHub Actions와 K3s, ArgoCD의 조합이 효율적인 대안이 될 수 있음을 배웠습니다.
  • GitOps와 Kubernetes의 시너지: Git을 통한 선언적 배포 관리 방식은 Kubernetes 환경에서 복잡한 배포 과정을 단순화하고 추적 가능성을 높여줍니다.
  • 서비스 노출 전략: Kubernetes 서비스 노출 방식(ClusterIP, NodePort, LoadBalancer)의 차이점을 이해하고, 온프레미스 환경 및 기존 인프라와의 통합을 고려한 NodePort와 호스트 Nginx 조합의 실용성을 알게 되었습니다.

실전 적용

  • CI/CD 파이프라인 구축: GitHub Actions 워크플로우 작성, Dockerfile 최적화, Kubernetes 매니페스트(Deployment, Service, Kustomize) 작성 및 GitOps 레포 연동을 진행할 예정입니다.
  • 라즈베리파이 환경 설정: K3s 설치, ArgoCD 배포, NodePort를 활용한 서비스 노출, Nginx 설정을 통한 안전한 외부 접근 환경을 구축할 것입니다.
  • 포트폴리오 작성: 이번 프로젝트를 통해 얻은 CI/CD 파이프라인 구축 경험과 기술 선택 이유를 상세히 문서화하여 포트폴리오로 활용할 것입니다.

추가 학습 계획

  • Monitoring & Logging: Prometheus, Grafana, Loki를 활용한 모니터링 및 로깅 시스템 구축 방법을 학습하여 파이프라인의 안정성과 가시성을 더욱 높일 계획입니다.
  • Advanced Kubernetes Networking: Ingress Controller(Traefik 또는 Nginx Ingress)의 실제 적용 방법과 NetworkPolicy를 통한 상세한 네트워크 제어 방안을 심도 있게 학습할 것입니다.
  • Container Security Best Practices: Docker 이미지 보안 감사 및 취약점 관리에 대한 깊이 있는 학습을 통해 더욱 견고한 보안 체계를 구축할 것입니다.

참고 자료

  • K3s 공식 문서
  • ArgoCD 공식 문서
  • Docker Buildx 공식 문서
  • Trivy Action 공식 문서
  • SonarCloud GitHub Action 공식 문서
  • Kubernetes Ingress 공식 문서
  • Nginx 공식 문서
  • WireGuard 공식 문서