개요

Kubernetes(K8s)는 컨테이너 오케스트레이션의 사실상 표준으로 자리잡았지만, 클러스터를 안정적으로 운영하는 것은 설치보다 훨씬 어렵습니다. 리소스 관리, 모니터링, 업그레이드, 장애 대응 등 운영 과정에서 마주치는 현실적인 문제들을 제대로 다루지 않으면 서비스 장애로 이어질 수 있습니다. 이 글에서는 프로덕션 Kubernetes 클러스터 운영에 필요한 핵심 지식과 실전 노하우를 정리합니다.

핵심 개념

리소스 관리: Pod의 requests와 limits를 적절히 설정하는 것이 안정 운영의 기본입니다. requests는 스케줄링 기준, limits는 OOM Kill 기준입니다. requests 없이 배포하면 노드 과부하의 원인이 됩니다.

HPA와 VPA: Horizontal Pod Autoscaler는 Pod 수를 조정하고, Vertical Pod Autoscaler는 개별 Pod의 리소스를 조정합니다. 두 가지를 동시에 사용할 때는 충돌에 주의해야 합니다.

PDB(Pod Disruption Budget): 노드 유지보수나 업그레이드 시 최소 가용 Pod 수를 보장합니다. 프로덕션 서비스에는 반드시 설정해야 합니다.

네트워크 정책: NetworkPolicy로 Pod 간 통신을 제한하여 마이크로서비스 보안을 강화합니다. 기본은 모든 통신이 허용이므로 명시적 차단이 필요합니다.

실전 예제: 운영 필수 설정

# 리소스 관리가 포함된 Deployment 예제
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: app
        image: myapp:v1.2.3
        resources:
          requests:
            cpu: 250m
            memory: 256Mi
          limits:
            cpu: 500m
            memory: 512Mi
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 15
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          periodSeconds: 5
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: web-app
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: web-app-pdb
  namespace: production
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: web-app
EOF

운영 중 자주 사용하는 디버깅 명령입니다.

# Pod 상태 진단
kubectl get pods -n production -o wide
kubectl describe pod web-app-xxx -n production
kubectl logs web-app-xxx -n production --previous

# 노드 리소스 사용량 확인
kubectl top nodes
kubectl top pods -n production --sort-by=memory

# 이벤트 확인 (최근 장애 원인 파악)
kubectl get events -n production --sort-by='.lastTimestamp' | tail -20

# 노드 유지보수 (drain)
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data
# 작업 완료 후
kubectl uncordon node-1

활용 팁

  • LimitRange 설정: 네임스페이스에 LimitRange를 적용하면 리소스 미설정 Pod이 배포되는 것을 방지할 수 있습니다.
  • ResourceQuota: 팀별 네임스페이스에 ResourceQuota를 설정하여 특정 팀이 클러스터 리소스를 독점하는 것을 방지하세요.
  • Graceful Shutdown: terminationGracePeriodSeconds를 애플리케이션의 종료 시간에 맞게 설정하세요. 기본 30초가 부족한 경우가 많습니다.
  • GitOps 도입: ArgoCD나 Flux를 사용하여 클러스터 상태를 Git으로 관리하면 변경 이력 추적과 롤백이 용이합니다.
  • etcd 백업: etcd는 클러스터의 뇌입니다. 정기적인 스냅샷 백업을 반드시 설정하세요.

마무리

Kubernetes 클러스터 운영의 핵심은 리소스 관리, 가용성 보장, 그리고 관측 가능성(Observability)입니다. 적절한 requests/limits 설정, PDB, 헬스체크를 기본으로 갖추고, GitOps로 선언적 관리를 하면 안정적인 운영이 가능합니다. 완벽한 자동화보다는 장애 발생 시 빠르게 원인을 파악하고 복구할 수 있는 역량을 갖추는 것이 더 중요합니다.