지니데비 기록 자세히보기

데브옵스/Orchestration

[Kubernetes] 17. Resources, LimitRange

지니데비 2024. 11. 6. 17:42
728x90

Resources
apiVersion: v1
kind: Pod
metadata:
  name: resource-limits-example
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      requests:
        memory: "64Mi"     # 최소 보장 메모리 64Mi
        cpu: "250m"        # 최소 보장 CPU 0.25 vCPU
      limits:
        memory: "128Mi"    # 최대 메모리 128Mi
        cpu: "500m"        # 최대 CPU 0.5 vCPU
  • requests.memory와 requests.cpu: 컨테이너가 배치될 때 스케줄러는 이 Pod가 64Mi 메모리와 0.25 vCPU가 필요한 것으로 간주하고 배치할 노드를 선택한다.
  • limits.memory와 limits.cpu: 컨테이너는 최대 128Mi 메모리와 0.5 vCPU까지만 사용할 수 있다. 이를 초과하는 자원을 사용하려고 하면 메모리 부족으로 종료되거나 CPU 사용량이 자동으로 줄어든다.

CPU와 메모리의 단위

  • CPU: 1은 전체 CPU(1 vCPU)를 의미하고, 500m은 0.5 vCPU를 의미한다.
  • Memory: 메모리의 단위는 Mi, Gi 같은 이진 표기법(1 MiB = 1024 KiB)을 사용해. 64Mi는 64 MiB를 의미한다.

Resources 설정의 중요성

  1. 클러스터 안정성 보장: Pod가 과도한 자원을 사용하지 않도록 제어해 다른 Pod에 영향을 주지 않도록 할 수 있다.
  2. 스케줄링 최적화: Requests를 설정하면 스케줄러가 Pod를 적절한 노드에 배치할 수 있다.
  3. 자원 낭비 방지: 불필요한 자원 소비를 줄여서 클러스터 전체의 자원 효율성을 높일 수 있다.
LimitRange
apiVersion: v1
kind: LimitRange
metadata:
  name: resource-limits
  namespace: my-namespace
spec:
  limits:
    - type: Container
      max:
        cpu: "1"          # 최대 1 vCPU
        memory: "512Mi"   # 최대 512Mi 메모리
      min:
        cpu: "100m"       # 최소 0.1 vCPU
        memory: "128Mi"   # 최소 128Mi 메모리
      default:
        cpu: "500m"       # 기본값 0.5 vCPU
        memory: "256Mi"   # 기본값 256Mi 메모리
      defaultRequest:
        cpu: "200m"       # 기본 요청값 0.2 vCPU
        memory: "200Mi"   # 기본 요청값 200Mi 메모리
    - type: Pod
      max:
        memory: "1Gi"     # Pod 전체에 대한 최대 메모리 1Gi
      min:
        memory: "200Mi"   # Pod 전체에 대한 최소 메모리 200Mi
  • type: Container 또는 Pod로, Container 타입은 개별 컨테이너에 대한 리소스 제한을, Pod 타입은 전체 Pod에 대한 제한을 설정할 수 있다.
  • max: 설정 가능한 최대 리소스로, 이 값을 초과하는 설정을 방지한다.
  • min: 설정 가능한 최소 리소스로, 너무 낮은 자원 설정을 방지한다.
  • default: 리소스 요청/제한 값이 명시되지 않은 경우 적용될 기본값
  • defaultRequest: 리소스 요청(requests)에 대해 별도로 설정하지 않을 때 사용할 기본 요청값을 설정한다.

LimitRange를 설정하는 이유

  1. 네임스페이스 자원 관리: 네임스페이스 내에서 모든 리소스가 과도하게 설정되지 않도록 통제할 수 있어.
  2. 자원 낭비 방지: 필요 이상의 자원을 요청하지 못하게 하여 효율적인 자원 사용을 유도해.
  3. 예상치 못한 장애 방지: 각 컨테이너와 Pod가 적정한 자원을 사용할 수 있도록 해, 클러스터 안정성을 높여.
kubectl get pod [pod name] -o yaml > pod-definition.yaml
728x90
반응형