
SOFTMOA TECHNOLOGY
Kubernetes 클러스터 운영 실전 가이드
소프트모아가 정리한 기술 기록입니다.
Contents
개요
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로 선언적 관리를 하면 안정적인 운영이 가능합니다. 완벽한 자동화보다는 장애 발생 시 빠르게 원인을 파악하고 복구할 수 있는 역량을 갖추는 것이 더 중요합니다.
