DevLog 2024년 11월 20일
Kubernetes로 컨테이너 오케스트레이션 자동화

Kubernetes로 컨테이너 오케스트레이션 자동화

Kubernetes를 활용한 CI/CD 파이프라인 구축 및 자동화 전략

#DevOps #Kubernetes #Docker

Kubernetes Helm Charts를 사용하여 배포 시간을 80% 단축했습니다.

배경

기존 배포 프로세스의 문제점:

  • 수동 배포: 서버 접속 후 수동으로 컨테이너 재시작
  • 환경 불일치: 개발/운영 환경 설정이 달라지는 문제
  • 롤백 어려움: 배포 실패 시 빠른 복구 불가
  • 확장성 부족: 트래픽 증가 시 대응 느림

Kubernetes 도입 전략

1. Dockerfile 최적화

# 멀티 스테이지 빌드
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 최종 이미지
FROM node:22-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["npm", "start"]

2. Kubernetes 배포 매니페스트

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-backend
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: backend
        image: registry.example.com/app:latest
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"

3. Helm Charts 구성

# values.yaml
replicaCount: 3
image:
  repository: registry.example.com/app
  tag: latest
  pullPolicy: Always

# secrets
secrets:
  databaseUrl: postgres://user:pass@db:5432/app
  redisUrl: redis://redis:6379

4. CI/CD 파이프라인

# .github/workflows/deploy.yaml
name: Deploy to Kubernetes

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build Docker Image
        run: docker build -t ${{ secrets.REGISTRY }}/app:${{ github.sha }} .
      - name: Push to Registry
        run: docker push ${{ secrets.REGISTRY }}/app:${{ github.sha }}
      - name: Deploy with Helm
        run: |
          helm upgrade --install app ./helm-chart \
            --set image.tag=${{ github.sha }} \
            --namespace production

성과

배포 시간

  • 개선 전: 평균 45분 (수동 배포)
  • 개선 후: 평균 9분 (자동 배포)
  • 단축율: 80%

안정성

  • 가용성: 99.9% → 99.99%
  • 롤백 시간: 30분 → 1분
  • 확장 속도: 10분 → 30초

배운 점

“Infrastructure as Code (IaC)는 선택이 아닌 필수”

Kubernetes와 Helm을 도입하면서 인프라 관리가 코드로 가능해졌습니다. 이는:

  • 버전 관리 가능
  • 재현성 보장
  • 협업 용이
  • 자동화 기반

결과적으로 팀의 배포 자신감이 크게 향상되었습니다.