진지한 개발자

Kubernetes 운영 시 자원할당 (Node, Pod, CPU, Memory) 본문

카테고리 없음

Kubernetes 운영 시 자원할당 (Node, Pod, CPU, Memory)

제이_엔 2025. 8. 14. 10:03
728x90

1. Node와 Pod의 관계

  • Node: 실제 또는 가상 머신. Kubernetes 클러스터의 워커 유닛.
  • Pod: 하나 이상의 컨테이너를 포함하는 최소 배포 단위. Node 위에 스케줄됨.
  • 스케줄링: Kubernetes는 Pod의 리소스 요청을 기반으로 적절한 Node에 Pod를 배치함.

2. CPU와 Memory 자원 요청 및 제한

resources.requests

  • Pod가 최소한으로 필요한 자원을 명시
  • 스케줄러가 이 값을 기준으로 Node에 배치
  • 예: requests.cpu: "500m" → 최소 0.5 CPU core 필요

    resources.limits

  • Pod가 사용할 수 있는 최대 자원을 제한
  • 초과 시 CPU는 throttling, Memory는 OOM(Out of Memory)으로 종료
resources:
  requests:
    cpu: "500m"
    memory: "256Mi"
  limits:
    cpu: "1"
    memory: "512Mi"

3. Node의 자원 관리

  • Node는 kubelet을 통해 각 Pod의 리소스를 모니터링
  • Node의 전체 자원 중 일부는 시스템 데몬(kubelet, kube-proxy 등)을 위해 예약됨
  • Allocatable 자원: Pod에 할당 가능한 실제 자원
kubectl describe node <node-name>

4. Pod 스케줄링 관련 고려사항

  • Pod는 requests 기준으로 스케줄됨
  • limits는 스케줄링에 영향을 주지 않음
  • Node에 충분한 Allocatable 자원이 없으면 Pending 상태로 남음

5. 리소스 모니터링 및 최적화

  • Metrics Server: Pod/Node의 실시간 리소스 사용량 수집
  • Vertical Pod Autoscaler (VPA): Pod의 리소스 요청/제한 자동 조정
  • Horizontal Pod Autoscaler (HPA): CPU 사용률 기반으로 Pod 수 자동 조정
kubectl top pod
kubectl top node

6. Best Practices

  • 리소스 요청 설정 : 모든 Pod에 requests를 설정하여 안정적인 스케줄링 보장
  • 리소스 제한 설정 : limits를 설정하여 과도한 자원 사용 방지
  • 모니터링 도구 : Prometheus + Grafana, Metrics Server 등 활용
  • 오토스케일링 : HPA/VPA를 통해 동적 자원 조절
  • Node 자원 예약 : system-reserved, kube-reserved 설정으로 안정성 확보

7. Pod 리소스 요청/제한에 따른 배치 예시

예시 1: Pod당 cpu: 500m, memory: 1Gi 요청

  • 8core 64GB 노드:

    • CPU 기준: 8 / 0.5 = 최대 16개

    • Memory 기준: 64 / 1 = 최대 64개 → CPU 기준으로 최대 16개 Pod 배치 가능

    • 4core 32GB 노드:

    • CPU 기준: 4 / 0.5 = 최대 8개

    • Memory 기준: 32 / 1 = 최대 32개 → CPU 기준으로 최대 8개 Pod 배치 가능

예시 2: 다양한 Pod 리소스 조합 예시

Pod 리소스 요청 8core 64GB 노드 4core 32GB 노드
cpu: 1, memory: 2Gi 최대 8개 최대 4개
cpu: 250m, memory: 512Mi 최대 32개 최대 16개
cpu: 2, memory: 8Gi 최대 4개 최대 2개

실제로는 kubelet, system daemon 등이 사용하는 리소스를 고려해 약간 줄어듬

5. Pod 배치 최적화 팁

  • 리소스 요청(requests)와 제한(limits)을 명확히 설정
  • HPA/VPA를 통해 자동 조절
  • Node Affinity / Taints & Tolerations로 특정 노드에만 배치
  • Pod Overhead 고려 (특히 CNI, CSI 등)

6. 실전 운영 팁

  • kubectl describe node 로 실제 allocatable 자원 확인
  • kubectl top node / kubectl top pod로 실시간 사용량 모니터링
  • Prometheus + Grafana로 리소스 시각화
  • 리소스 부족 시 Pending 상태 확인 → 스케줄링 실패 원인 분석
728x90