Scheduling-Resource Requirements and Limits
2024. 12. 31. 14:33ㆍ쿠버네티스/쿠버네티스
728x90
반응형
1. 리소스 요청과 제한의 개념
- 리소스 요청 (Resource Requests):
- Pod이 실행되기 위해 필요한 최소한의 CPU와 메모리 양을 지정합니다.
- Kubernetes 스케줄러는 이 값을 기준으로 Pod을 배치할 노드를 결정합니다.
- 요청된 리소스는 Pod에 보장됩니다.
- 리소스 제한 (Resource Limits):
- Pod이 사용할 수 있는 최대 CPU와 메모리 양을 지정합니다.
- Pod이 제한을 초과하려고 하면, CPU는 쓰로틀링(Throttling) 되고, 메모리는 초과 시 **Pod이 종료(OOM Kill)**됩니다.
2. 리소스 요청 및 제한 설정 방법
Pod 정의 파일에 resources 섹션을 추가하여 설정
resources:
requests:
memory: "1Gi" # 최소 1GiB 메모리 요청
cpu: "500m" # 최소 0.5 vCPU 요청
limits:
memory: "2Gi" # 최대 2GiB 메모리 제한
cpu: "1" # 최대 1 vCPU 제한
단위
- CPU:
- 1 = 1 vCPU (AWS), 1 코어(GCP/Azure).
- 100m = 0.1 vCPU (m은 milli 단위).
- 메모리:
- Mi = Mebibyte (1024 KiB).
- Gi = Gibibyte (1024 MiB).
- M, G는 Megabyte(1000 KiB), Gigabyte(1000 MB)로 다릅니다.
리소스 요청 및 제한 동작
CPU
- 요청(Requests)만 설정:
- Pod은 요청된 CPU를 보장받습니다.
- 사용 가능한 추가 CPU가 있다면, 다른 Pod이 사용하지 않는 한 자유롭게 사용할 수 있습니다.
- 제한(Limits)만 설정:
- Kubernetes는 요청 값을 제한 값으로 자동 설정합니다.
- Pod은 지정된 한도까지만 CPU를 사용할 수 있습니다.
- 요청과 제한 모두 설정:
- Pod은 요청된 CPU는 보장받으며, 지정된 한도까지만 사용할 수 있습니다.
- 요청도 제한도 설정하지 않음:
- 어떤 Pod도 노드의 모든 CPU를 사용할 수 있어 다른 Pod을 굶주리게 할 위험 존재
메모리
- 메모리는 CPU와 유사하지만, 중요한 차이가 있습니다:
- 메모리는 쓰로틀링되지 않습니다.
- Pod이 제한을 초과하면 OOM(Out of Memory) 오류로 종료됩니다
기본값 및 LimitRange
Kubernetes는 기본적으로 리소스 요청이나 제한을 설정하지 않습니다. 이를 방지하기 위해 다음을 사용할 수 있습니다:
LimitRange
- 네임스페이스 수준에서 기본값, 최소 및 최대 값을 설정할 수 있습니다.
- 예시 YAML:↑
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-resource-constraint
spec:
limits:
- default:
cpu: "500m"
memory: "256Mi"
defaultRequest:
cpu: "200m"
memory: "128Mi"
max:
cpu: "2"
memory: "1Gi"
min:
cpu: "100m"
memory: "64Mi"
Resource Quota
- 네임스페이스 전체에서 사용 가능한 총 리소스를 제한합니다.
- 예시 YAML:
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
requests.cpu: "4"
requests.memory: "4Gi"
limits.cpu: "10"
limits.memory: "10Gi"
Behavior - CPU
1. CPU 리소스 요청과 제한
- 요청(Requests):
- Pod이 실행되기 위해 필요한 최소 CPU를 지정.
- Kubernetes 스케줄러는 요청 값을 기준으로 Pod을 배치할 노드를 선택.
- 요청된 리소스는 보장됩니다.
- 제한(Limits):
- Pod이 사용할 수 있는 최대 CPU를 지정.
- Pod이 제한을 초과하려고 하면, CPU 사용량은 쓰로틀링(Throttling) 됩니다.
2. CPU 동작 방식
1) 요청(Requests)만 설정
- Pod은 요청된 만큼의 CPU를 보장받습니다.
- 추가로 사용 가능한 CPU가 있다면, 다른 Pod이 사용하지 않는 한 자유롭게 사용할 수 있습니다.
2) 제한(Limits)만 설정
- Kubernetes는 요청 값을 제한 값과 동일하게 자동 설정합니다.
- Pod은 지정된 최대 한도까지만 CPU를 사용할 수 있습니다.
3) 요청과 제한 모두 설정
- Pod은 최소한의 CPU 사용량(Requests)을 보장받으며, 지정된 한도(Limits)까지만 사용할 수 있습니다.
- 예:
- 요청: 1 vCPU
- 제한: 3 vCPU
- -> 최소 1 vCPU는 보장되며, 최대 3 vCPU까지 사용 가능.
4) 요청도 제한도 설정하지 않음
- Pod은 노드의 모든 CPU를 사용할 수 있어 다른 Pod을 굶주리게 할 위험이 있습니다.
3. 이상적인 설정
요청(Requests)을 설정하고, 제한(Limits)을 생략
- 각 Pod은 최소한의 리소스를 보장받으면서, 시스템에 여유가 있을 경우 추가 리소스를 자유롭게 사용할 수 있습니다.
- 예:
- 요청: 1 vCPU
- 제한: 없음
- -> 여유가 있을 경우 더 많은 CPU를 사용 가능.
제한(Limits)을 사용하는 경우
- 공용 환경에서 악용 방지(예: 비트코인 채굴 방지).
- 특정 애플리케이션에 자원 소비를 강하게 제어해야 할 때.
4. 기본값 및 LimitRange
기본값(Default Behavior)
- Kubernetes는 기본적으로 리소스 요청이나 제한을 설정하지 않습니다.
- 이로 인해 특정 Pod이 모든 리소스를 독점할 위험이 있습니다.
LimitRange 사용
- 네임스페이스 수준에서 기본값, 최소 및 최대 값을 설정할 수 있습니다.
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-resource-constraint
spec:
limits:
- default:
cpu: "500m"
defaultRequest:
cpu: "200m"
max:
cpu: "2"
min:
cpu: "100m"
Behavior - Memory
1. 메모리 요청(Requests)과 제한(Limits)의 개념
- 메모리 요청(Requests):
- Pod이 실행되기 위해 필요한 최소 메모리를 지정합니다.
- Kubernetes 스케줄러는 이 값을 기준으로 Pod을 배치할 노드를 선택합니다.
- 요청된 메모리는 Pod에 보장됩니다.
- 메모리 제한(Limits):
- Pod이 사용할 수 있는 최대 메모리를 지정합니다.
- Pod이 제한을 초과하려고 하면, OOM(Out of Memory) 오류로 인해 종료됩니다.
2. 메모리 동작 방식
1) 요청(Requests)만 설정
- Pod은 요청된 만큼의 메모리를 보장받습니다.
- 추가로 사용 가능한 메모리가 있다면, 다른 Pod이 사용하지 않는 한 자유롭게 사용할 수 있습니다.
- 그러나 제한(Limits)이 없으므로, Pod이 너무 많은 메모리를 사용할 경우 다른 Pod에 영향을 줄 수 있습니다.
2) 제한(Limits)만 설정
- Kubernetes는 요청 값을 제한 값과 동일하게 자동 설정합니다.
- Pod은 지정된 최대 한도까지만 메모리를 사용할 수 있습니다.
- 제한을 초과하려는 경우, OOM 오류로 인해 Pod이 종료됩니다.
3) 요청과 제한 모두 설정
- Pod은 최소한의 메모리(Requests)를 보장받으며, 지정된 한도(Limits)를 초과하지 않습니다.
- 예:
- 요청: 1Gi
- 제한: 3Gi
- -> 최소 1Gi는 보장되며, 최대 3Gi까지 사용 가능.
4) 요청도 제한도 설정하지 않음
- 어떤 Pod도 노드의 모든 메모리를 사용할 수 있어 다른 Pod을 굶주리게 할 위험이 있습니다.
- 이는 BestEffort QoS 클래스에 해당하며, 리소스 압박 상황에서 가장 먼저 퇴출(Eviction) 대상이 됩니다.
3. OOM(Out of Memory) 동작
- CPU와 달리, 메모리는 비압축성 자원입니다. 즉, 부족한 경우 쓰로틀링(Throttling)이 불가능합니다.
- Pod이 제한(Limits)을 초과하여 메모리를 소비하려고 하면:
- 커널의 OOM 서브시스템이 작동하여 컨테이너를 종료시킵니다.
- 종료된 컨테이너는 재시작 정책에 따라 kubelet에 의해 재시작될 수 있습니다.
- 로그 또는 kubectl describe pod 명령어를 통해 OOM 오류를 확인할 수 있습니다.
4. QoS 클래스와 메모리 동작
Kubernetes는 리소스 요청 및 제한 설정 여부에 따라 QoS(Quality of Service) 클래스를 할당합니다:
- Guaranteed:
- 모든 컨테이너가 동일한 요청(Requests)과 제한(Limits)을 설정한 경우.
- 가장 높은 우선 순위를 가지며, 리소스 압박 시 퇴출되지 않습니다.
- Burstable:
- 일부 컨테이너만 요청(Requests)을 설정하거나, 요청과 제한 값이 다른 경우.
- 유연하게 리소스를 사용할 수 있지만, Guaranteed보다 낮은 우선 순위를 가집니다.
- BestEffort:
- 요청(Requests)이나 제한(Limits)이 전혀 설정되지 않은 경우.
- 가장 낮은 우선 순위를 가지며, 리소스 압박 시 가장 먼저 퇴출됩니다.
5. 이상적인 설정
요청(Requests)을 설정하고, 제한(Limits)을 생략
- 각 Pod은 최소한의 리소스를 보장받으면서, 시스템에 여유가 있을 경우 추가 리소스를 자유롭게 사용할 수 있습니다.
- 예:
- 요청: 1Gi
- 제한: 없음
- -> 여유가 있을 경우 더 많은 메모리를 사용 가능.
제한(Limits)을 사용하는 경우
- 공용 환경에서 악용 방지(예: 비트코인 채굴 방지).
- 특정 애플리케이션에 자원 소비를 강하게 제어해야 할 때.
6. LimitRange와 ResourceQuota 활용
LimitRange
- 네임스페이스 수준에서 기본값(Default), 최소(Min), 최대(Max)를 정의하여 컨테이너별 리소스 사용을 제어합니다.
apiVersion: v1
kind: LimitRange
metadata:
name: memory-limits
spec:
limits:
- default:
memory: "512Mi"
defaultRequest:
memory: "256Mi"
max:
memory: "1Gi"
min:
memory: "128Mi"
ResourceQuota
- 네임스페이스 전체에서 사용 가능한 총 리소스를 제한합니다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-quota
spec:
hard:
requests.memory: "4Gi"
limits.memory: "8Gi"
단어정리
1. 쓰로틀링 (Throttling)
- 정의: CPU 사용량이 Pod의 **리소스 제한(Limits)**을 초과하려고 할 때, Kubernetes가 CPU 사용량을 제한하는 동작.
- 작동 방식:
- CPU는 압축 가능한 자원으로, 사용량을 동적으로 조정할 수 있습니다.
- Pod이 제한된 CPU 이상을 사용하려고 하면, Kubernetes는 해당 Pod의 CPU 사용량을 강제로 줄입니다.
- 이 과정에서 애플리케이션 성능이 저하될 수 있지만, Pod은 종료되지 않습니다.
- 예시:
- Pod의 CPU 제한(Limits)이 2 vCPU로 설정된 경우, 해당 Pod은 최대 2 vCPU까지만 사용할 수 있으며, 이를 초과하면 쓰로틀링됩니다.
2. OOM 오류 (Out of Memory Error)
- 정의: Pod이 메모리 제한(Limits)을 초과하여 더 많은 메모리를 사용하려고 할 때 발생하는 오류.
- 작동 방식:
- 메모리는 비압축성 자원으로, 부족할 경우 동적으로 조정할 수 없습니다.
- Pod이 제한된 메모리 이상을 사용하려고 하면, 커널의 OOM(Out of Memory) 킬러가 작동하여 해당 컨테이너를 종료합니다.
- 종료된 컨테이너는 Kubernetes의 재시작 정책에 따라 다시 시작될 수 있습니다.
- 확인 방법:
- kubectl describe pod <pod-name> 명령어를 통해 OOM 오류 로그를 확인할 수 있습니다.
- 예시:
- Pod의 메모리 제한(Limits)이 512Mi로 설정된 경우, 해당 Pod이 512Mi를 초과하면 OOM 오류가 발생하고 종료됩니다.
3. QoS 클래스 (Quality of Service Class)
- 정의: Kubernetes가 Pod에 할당된 리소스 요청(Requests) 및 제한(Limits)에 따라 Pod의 우선순위를 결정하는 분류 시스템.
- QoS 클래스는 리소스 압박 상황에서 어떤 Pod이 먼저 퇴출(Eviction)될지를 결정합니다.
QoS 클래스 유형
Guaranteed:
- 모든 컨테이너가 동일한 요청(Requests)과 제한(Limits)을 설정한 경우.
- 가장 높은 우선순위를 가지며, 리소스 압박 상황에서 퇴출되지 않습니다.
- 예시:
resources:
requests:
memory: "1Gi"
cpu: "1"
limits:
memory: "1Gi"
cpu: "1"
Burstable:
- 일부 컨테이너만 요청(Requests)을 설정하거나, 요청과 제한 값이 다른 경우.
- 유연성을 제공하지만, Guaranteed보다 낮은 우선순위를 가집니다.
- 예시:
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1"
BestEffort:
- 요청(Requests)이나 제한(Limits)이 전혀 설정되지 않은 경우.
- 가장 낮은 우선순위를 가지며, 리소스 압박 상황에서 가장 먼저 퇴출됩니다.
- 예시:
resources: {}
The elephant pod runs a process that consumes 15Mi of memory. Increase the limit of the elephant pod to 20Mi.
kubectl edit pod elephant
error: pods "elephant" is invalid
A copy of your changes has been stored to "/tmp/kubectl-edit-386529057.yaml"
error: Edit cancelled, no valid changes were saved.
kubectl replace --force -f /tmp/kubectl-edit-386529057.yaml
###
pod "elephant" deleted
pod/elephant replaced
###
kubectl get pod
NAME READY STATUS RESTARTS AGE
elephant 1/1 Running 0 13s
반응형
'쿠버네티스 > 쿠버네티스' 카테고리의 다른 글
Scheduling-Static Pods (0) | 2024.12.31 |
---|---|
Scheduling-DaemonSets (0) | 2024.12.31 |
Scheduling-Node Selectors-Node Affinity (0) | 2024.12.31 |
Scheduling-Taints and Tolerations (0) | 2024.12.31 |
Scheduling-Labels and Selectors (0) | 2024.12.31 |