[CI/CD] node.js 웹앱 간단한 CI/CD 구축 (git > docker > argocd > k8s)

Wook·2024년 11월 3일
0

TIL | 취업 후

목록 보기
6/6

Node.js 프로젝트를 Git에 올리고, 이를 Docker 이미지로 빌드해 Kubernetes 클러스터에 ArgoCD를 통해 배포하는 과정을 단계별로 설명하겠습니다.


1. 프로젝트 준비 (Node.js 프로젝트 생성)

먼저 간단한 Node.js 애플리케이션을 준비합니다. 예를 들어 "Hello World" 메시지를 출력하는 애플리케이션을 작성해 보겠습니다.

  1. 프로젝트 폴더 생성 및 초기화:

    mkdir my-node-app
    cd my-node-app
    npm init -y
  2. 애플리케이션 코드 작성 (index.js):

    const express = require('express');
    const app = express();
    const PORT = process.env.PORT || 3000;
    
    app.get('/', (req, res) => {
        res.send('Hello, World!');
    });
    
    app.listen(PORT, () => {
        console.log(`Server is running on port ${PORT}`);
    });
  3. Express 패키지 설치:

    npm install express
  4. Git 저장소 초기화:

    git init
    git add .
    git commit -m "Initial commit"
  5. GitHub 또는 GitLab에 저장소 생성 및 푸시:
    GitHub에 저장소를 생성하고 이를 로컬 저장소와 연결하여 코드를 푸시합니다.

    git remote add origin <repository-url>
    git push -u origin main

2. Docker로 애플리케이션 컨테이너화

이제 Node.js 애플리케이션을 Docker로 컨테이너화합니다.

  1. Dockerfile 작성 (Dockerfile):

    # 베이스 이미지 설정
    FROM node:14
    
    # 작업 디렉토리 생성
    WORKDIR /app
    
    # 필요한 파일 복사
    COPY package*.json ./
    
    # 의존성 설치
    RUN npm install
    
    # 애플리케이션 코드 복사
    COPY . .
    
    # 포트 노출
    EXPOSE 3000
    
    # 애플리케이션 실행 명령
    CMD ["node", "index.js"]
  2. Docker 이미지 빌드:

    docker build -t my-node-app .
  3. Docker 이미지 실행 (테스트용):

    docker run -p 3000:3000 my-node-app

    웹 브라우저에서 http://localhost:3000으로 접속하여 "Hello, World!" 메시지가 출력되는지 확인합니다.

  4. Docker 이미지 푸시:
    Docker Hub에 푸시할 수 있도록 이미지를 Docker Hub에 올립니다.

    docker tag my-node-app <dockerhub-username>/my-node-app
    docker push <dockerhub-username>/my-node-app

3. Kubernetes 매니페스트 작성 및 저장소에 추가

이제 Kubernetes 매니페스트 파일을 작성하여 애플리케이션을 배포할 준비를 합니다.

  1. Kubernetes 배포 및 서비스 매니페스트 작성 (k8s-deployment.yaml):

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-node-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-node-app
      template:
        metadata:
          labels:
            app: my-node-app
        spec:
          containers:
          - name: my-node-app
            image: <dockerhub-username>/my-node-app:latest
            ports:
            - containerPort: 3000
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: my-node-app-service
    spec:
      type: LoadBalancer
      selector:
        app: my-node-app
      ports:
      - protocol: TCP
        port: 80
        targetPort: 3000
  2. 매니페스트 파일 Git에 커밋 및 푸시:
    작성한 k8s-deployment.yaml 파일을 저장소에 추가하고 푸시합니다.

    git add k8s-deployment.yaml
    git commit -m "Add Kubernetes deployment and service"
    git push origin main

4. ArgoCD로 Kubernetes 클러스터에 배포 자동화

ArgoCD를 통해 Kubernetes 클러스터에 애플리케이션을 자동으로 배포하도록 설정합니다.

  1. ArgoCD 설치 (Kubernetes 클러스터 내):
    ArgoCD가 설치되지 않았다면, 다음 명령어로 설치할 수 있습니다.

    kubectl create namespace argocd
    kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
  2. ArgoCD 접근 설정:
    ArgoCD UI에 접근하기 위해 LoadBalancer나 Port-Forwarding을 설정합니다.

    kubectl port-forward svc/argocd-server -n argocd 8080:443
  3. ArgoCD에 애플리케이션 추가:
    ArgoCD UI에 접속하여 새 애플리케이션을 추가합니다. 여기서 Git 저장소의 주소, 경로 및 클러스터 정보를 입력하여 ArgoCD가 해당 매니페스트를 통해 애플리케이션을 배포할 수 있게 합니다.

  4. ArgoCD로 애플리케이션 배포:
    ArgoCD가 설정된 Git 저장소에서 변경사항을 감지하고, k8s-deployment.yaml 파일을 사용해 애플리케이션을 Kubernetes 클러스터에 자동 배포합니다. ArgoCD UI에서 배포 상태를 확인할 수 있습니다.


5. 배포 확인

ArgoCD가 성공적으로 배포한 후에는 다음을 통해 애플리케이션이 정상적으로 작동하는지 확인합니다.

  1. 애플리케이션 상태 확인:
    kubectl get deployments
    kubectl get pods
    kubectl get svc
  2. 접속 확인:
    LoadBalancer로 설정된 서비스의 IP 주소 또는 URL로 접속하여 "Hello, World!" 메시지가 출력되는지 확인합니다.

요약

  1. Node.js 애플리케이션을 작성하고 Git에 푸시
  2. Docker 이미지를 빌드하여 Docker Hub에 푸시
  3. Kubernetes 매니페스트 작성 및 Git에 추가
  4. ArgoCD를 사용해 Git 저장소에서 변경 사항을 자동으로 Kubernetes 클러스터에 배포
  5. 애플리케이션 상태 및 서비스 접속 확인

위와 같이 CI/CD가 설정된 상태에서 코드 수정이 발생하면 다음과 같은 자동화 프로세스가 일어나게 됩니다:

1. 코드 수정 및 푸시

  • 개발자는 애플리케이션 코드에 새로운 기능을 추가하거나 버그를 수정하고, 이를 로컬 Git 저장소에 커밋한 후, 원격 Git 저장소(GitHub, GitLab 등)에 푸시합니다.

2. CI 시스템 (GitHub Actions 또는 다른 CI 도구)

  • 코드가 저장소에 푸시되면, CI 시스템(GitHub Actions 등)이 자동으로 코드를 감지하고 다음과 같은 작업을 실행합니다.
    1. 빌드: 최신 코드를 기반으로 애플리케이션을 다시 빌드합니다.
    2. 테스트: 정의된 유닛 테스트, 통합 테스트 등이 실행되어 코드가 정상적으로 동작하는지 검증합니다.
    3. Docker 이미지 생성 및 푸시: 모든 테스트가 성공하면 새로운 Docker 이미지를 빌드하여 Docker Hub와 같은 레지스트리에 푸시합니다.
      • 예를 들어, 버전 태그를 붙여 <dockerhub-username>/my-node-app:latest와 같이 새로운 이미지를 푸시합니다.

3. ArgoCD의 GitOps 기반 배포

  • ArgoCD는 Git 저장소의 변화를 모니터링하고 있습니다. CI 시스템에서 새로운 이미지 태그를 포함한 매니페스트가 Git 저장소에 커밋되면 ArgoCD가 이 변화를 감지하게 됩니다.
  • ArgoCD는 변경된 매니페스트 파일을 기반으로 자동으로 Kubernetes 클러스터에 배포 작업을 시작합니다.
  • Kubernetes는 기존 Pod를 종료하고 새로운 Docker 이미지를 사용하는 새 Pod를 생성하여 애플리케이션을 업데이트합니다.

4. Kubernetes 클러스터에서 새로운 버전의 애플리케이션 배포

  • Kubernetes는 업데이트된 배포 설정을 반영하여, 새로운 Docker 이미지를 기반으로 애플리케이션의 Pod를 다시 배포합니다.
  • 만약 Rolling Update 전략이 설정되어 있다면, Kubernetes는 점진적으로 새로운 Pod를 실행하고, 기존 Pod를 하나씩 종료하며 애플리케이션의 가동 중단 시간을 최소화합니다.

5. ArgoCD에서 배포 상태 확인 및 모니터링

  • ArgoCD는 배포 과정 중에 발생할 수 있는 문제나 상태 변화를 모니터링하여, 사용자가 UI에서 실시간으로 확인할 수 있도록 제공합니다.
  • 배포가 완료되면 ArgoCD는 애플리케이션 상태를 “Synced”로 표시하고, 성공적인 배포를 보여줍니다.

6. 배포 확인

  • Kubernetes 클러스터에서 새 버전의 애플리케이션이 정상적으로 동작하는지 테스트합니다.
  • 서비스의 LoadBalancer IP 또는 도메인으로 접속하여 애플리케이션이 기대한 대로 동작하는지 확인합니다.

요약된 자동화 흐름

  1. 개발자가 코드 수정 후 Git에 푸시
  2. CI 시스템이 빌드, 테스트 후 Docker 이미지 생성 및 푸시
  3. ArgoCD가 Git 저장소 변경을 감지하여 Kubernetes 클러스터에 배포 시작
  4. Kubernetes가 새 이미지로 애플리케이션 업데이트
  5. ArgoCD와 Kubernetes의 모니터링을 통해 배포 상태 확인

이렇게 설정된 환경에서는 코드가 수정될 때마다 수작업 없이 애플리케이션의 새로운 버전이 배포됩니다. 이로써 개발자는 빠르게 피드백을 받아볼 수 있고, 배포 과정에서 발생할 수 있는 오류를 조기에 발견하여 해결할 수 있게 됩니다.

profile
지속적으로 성장하고 발전하는 진취적인 태도를 가진 개발자의 삶을 추구합니다.
post-custom-banner

0개의 댓글