DevLog 2024년 11월 20일
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을 도입하면서 인프라 관리가 코드로 가능해졌습니다. 이는:
- 버전 관리 가능
- 재현성 보장
- 협업 용이
- 자동화 기반
결과적으로 팀의 배포 자신감이 크게 향상되었습니다.