20250101

GitLab CI/CD (Docker, Kubernetes)

1. 사전 준비: 필수 도구 설치 및 설정

1.1 Git 설치

Ubuntu

sudo apt update
sudo apt install git -y

macOS

brew install git

Windows

Git 공식 사이트에서 설치 프로그램을 다운로드하고 실행합니다.

설치 확인:

git --version

1.2 Node.js 설치

Ubuntu

sudo apt update
sudo apt install -y nodejs npm

macOS

brew install node

Windows

Node.js 공식 사이트에서 설치 프로그램을 다운로드하고 실행합니다.

설치 확인:

node --version
npm --version

1.3 Docker 설치

Ubuntu

sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

macOS 및 Windows

Docker Desktop을 다운로드하고 설치합니다.

Docker 실행 권한 확인:

docker --version
sudo usermod -aG docker $USER

1.4 Kubernetes 설치 (kubectl)

공통 (Ubuntu, macOS, Windows)

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

설치 확인:

kubectl version --client

2. 프로젝트 초기화 및 기본 파일 설정

2.1 Git 리포지토리 생성 및 초기화

mkdir my-app && cd my-app
git init

2.2 Node.js 프로젝트 초기화

npm init -y

package.json 예시:

{
  "name": "my-app",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {}
}

2.3 간단한 Node.js 애플리케이션 작성

index.js 예시:

const http = require("http");

const server = http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "text/plain" });
  res.end("Hello, Kubernetes!");
});

const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
  console.log(\`Server running on port \${PORT}\`);
});

3. Docker 파일 설정 및 빌드

3.1 Dockerfile 작성

Dockerfile 예시:

# 베이스 이미지
FROM node:16

# 앱 디렉토리 생성
WORKDIR /usr/src/app

# 종속성 복사 및 설치
COPY package*.json ./
RUN npm install

# 애플리케이션 복사
COPY . .

# 애플리케이션 실행
EXPOSE 3000
CMD ["npm", "start"]

3.2 Docker 이미지 빌드 및 실행

# Docker 이미지 빌드
docker build -t my-app .

# Docker 컨테이너 실행
docker run -p 3000:3000 my-app

4. Kubernetes 배포 파일 작성

4.1 Deployment 및 Service 파일 작성

k8s-deployment.yaml 예시:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:latest
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: LoadBalancer
  ports:
  - port: 3000
    targetPort: 3000
  selector:
    app: my-app

4.2 Kubernetes 배포

# Kubernetes 클러스터에 배포
kubectl apply -f k8s-deployment.yaml

# 상태 확인
kubectl get pods
kubectl get services

5. GitLab CI/CD 구성

5.1 .gitlab-ci.yml 작성

gitlab-ci.yml 예시:

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - docker build -t my-app:$CI_COMMIT_SHA .

test:
  stage: test
  script:
    - echo "Running tests..."
    - npm test || echo "No tests configured yet"

deploy:
  stage: deploy
  script:
    - echo "$KUBE_CONFIG" | base64 -d > kubeconfig.yaml
    - export KUBECONFIG=kubeconfig.yaml
    - kubectl apply -f k8s-deployment.yaml
  only:
    - main

5.2 GitLab 환경 변수 설정

GitLab UI에서 Settings → CI/CD → Variables에 다음 변수를 추가합니다:

  • KUBE_CONFIG: Kubernetes 클러스터 kubeconfig 내용을 Base64로 인코딩하여 저장.

6. 파이프라인 실행 및 확인

6.1 파이프라인 실행

git add .
git commit -m "Add CI/CD pipeline"
git push origin main

GitLab에서 자동으로 CI/CD 파이프라인이 실행됩니다.

6.2 파이프라인 상태 확인

GitLab UI에서 프로젝트 페이지 → CI/CD → Pipelines로 이동하여 파이프라인 로그를 확인합니다.

7. 배포 확인

7.1 Kubernetes Pod 상태 확인

kubectl get pods

7.2 서비스 확인

kubectl get services

7.3 애플리케이션 테스트

서비스 IP 또는 로드 밸런서 주소를 브라우저에 입력하여 애플리케이션이 정상 작동하는지 확인합니다.