본문 바로가기
IT 개발/클라우드

[쿠버네티스] 쿠버네티스 실전 배포 시나리오와 운영 팁: 현장 가이드

by 이것 저것 모든것 2025. 2. 5.
728x90

들어가며

이전 포스트에서 다룬 쿠버네티스의 핵심 개념들을 실제 환경에서 어떻게 활용하는지 알아보겠습니다. 실제 배포 시나리오와 함께 현장에서 유용한 운영 팁들을 공유하겠습니다.

1. 무중단 배포 전략

롤링 업데이트 (Rolling Update)

가장 기본적인 무중단 배포 방식입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    # ... pod 템플릿 설정 ...

블루-그린 배포

새 버전을 완전히 배포한 후 트래픽을 전환합니다.

# 블루 버전 (현재 운영 버전)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
      version: blue
  template:
    metadata:
      labels:
        app: my-app
        version: blue
    spec:
      containers:
      - name: my-app
        image: my-app:1.0

---
# 그린 버전 (새 버전)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
      version: green
  template:
    metadata:
      labels:
        app: my-app
        version: green
    spec:
      containers:
      - name: my-app
        image: my-app:2.0

---
# 서비스 (트래픽 전환용)
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
    version: blue  # 버전 전환 시 이 부분만 수정
  ports:
  - port: 80
    targetPort: 8080

2. 리소스 관리와 오토스케일링

리소스 요청과 제한 설정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
      - name: my-app
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "200m"
            memory: "256Mi"

HorizontalPodAutoscaler 설정

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

3. 모니터링과 로깅 설정

Prometheus + Grafana 설정

# Prometheus ServiceMonitor 예제
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-app-monitor
spec:
  selector:
    matchLabels:
      app: my-app
  endpoints:
  - port: metrics

중앙 로깅 시스템 연동

# Fluentd ConfigMap 예제
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
data:
  fluent.conf: |
    <source>
      @type tail
      path /var/log/containers/*.log
      pos_file /var/log/fluentd-containers.log.pos
      tag kubernetes.*
      read_from_head true
      <parse>
        @type json
      </parse>
    </source>
728x90

4. 실전 운영 팁

1. 헬스체크 설정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
      - name: my-app
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

2. 네트워크 정책 설정

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-app-network-policy
spec:
  podSelector:
    matchLabels:
      app: my-app
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 8080

5. 유용한 운영 명령어 모음

문제 해결을 위한 명령어

# 파드 상태 확인
kubectl get pods -n <namespace> -o wide

# 파드 로그 확인
kubectl logs <pod-name> -n <namespace> -f

# 파드 내부 접속
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh

# 리소스 사용량 확인
kubectl top pods -n <namespace>

배포 관련 명령어

# 롤아웃 상태 확인
kubectl rollout status deployment/<deployment-name>

# 이전 버전으로 롤백
kubectl rollout undo deployment/<deployment-name>

# 배포 히스토리 확인
kubectl rollout history deployment/<deployment-name>

6. 장애 대응 시나리오

메모리 누수 대응

  1. 모니터링 지표 확인
  2. 해당 파드의 로그 분석
  3. 임시 조치로 메모리 제한 상향
  4. 주기적 재시작 설정
# 주기적 재시작을 위한 CronJob 예제
apiVersion: batch/v1
kind: CronJob
metadata:
  name: restart-deployment
spec:
  schedule: "0 0 * * *"  # 매일 자정
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: kubectl
            image: bitnami/kubectl
            command:
            - /bin/sh
            - -c
            - kubectl rollout restart deployment/my-app
          restartPolicy: OnFailure

마치며

 

실제 운영 환경에서는 이러한 배포 전략과 운영 팁들을 상황에 맞게 조합하여 사용해야 합니다. 특히 중요한 점은:

  1. 충분한 테스트 환경에서의 검증
  2. 모니터링과 알림 체계 구축
  3. 롤백 절차 준비
  4. 장애 대응 시나리오 문서화

다음 포스트에서는 쿠버네티스 클러스터 자체의 관리와 보안에 대해 다루도록 하겠습니다.

728x90