Contents
see List개요
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로 선언적 관리를 하면 안정적인 운영이 가능합니다. 완벽한 자동화보다는 장애 발생 시 빠르게 원인을 파악하고 복구할 수 있는 역량을 갖추는 것이 더 중요합니다.