반응형
아래 글은 쿠버네티스 공식문서를 참고하여 작성하였습니다.
메모리 할당과 제한 방법은 CPU 할당과 제한 방법과 유사합니다. resources.requests에 cpu를 추가, resources.limits에 cpu를 추가하여 값을 할당해 주면 됩니다.
컨테이너 및 파드 메모리 리소스 할당
메모리 요청량 및 상한선 지정
컨테이너에 메모리 요청량을 지정하기 위해서는 컨테이너의 리소스 manifest에 resources:requests 필드를 포함합니다.
리소스 상한을 지정하기 위해서는 resoures:limits 필드를 포함합니다.
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
namespace: mem-example
spec:
containers:
- name: memory-demo-ctr
image: polinux/stress
resources:
requests:
memory: "100Mi"
limits:
memory: "200Mi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
- 생성된 컨테이너는 100MiB 메모리 요청량과 200MiB 메모리 상한을 갖습니다.
# Pod Container 실행 중 확인하기
kubectl get pod memory-demo -n=mem-example
# Pod에 대한 자세한 정보
kubectl get pod memory-demo --output=yaml -n=mem-example
컨테이너의 메모리 상한을 초과
노드 내 메모리가 충분하다면 컨테이너는 지정한 요청량보다 많은 메모리를 사용할 수 있습니다. (requests보다 많이 사용 가능)
하지만, 컨테이너는 지정한 메모리 상한보다 많은 메모리를 사용할 수 없습니다. (limits 보다는 많이 사용 불가능)
만약 컨테이너가 지속적으로 지정된 상한보다 많은 메모리를 사용한다면, 해당 컨테이너는 종료됩니다. 종료된 컨테이너가 재실행 가능하다면 다른 런타임 실패와 같이 kubelet에 의해 재실행됩니다.
노드에 비해 너무 큰 메모리 요청량 지정
메모리 요청량과 상한은 컨테이너와 관련있지만, 파드가 가지는 메모리 요청량과 상한으로 이해할 수 있습니다.
파드의 메모리 요청량은 파드 내 모든 컨테이너의 메모리 요청량의 합입니다. (즉, 파드의 메모리 상한은 파드 내 모든 컨테이너의 메모리 상한의 합이다.)
파드는 요청량을 기반하여 스케줄링됩니다. 노드에 파드의 메모리 요청량을 충족하기에 충분한 메모리가 있는 경우에만 파드가 노드에 스케줄링됩니다.
메모리 상한을 지정하지 않으면 ‼️
- 컨테이너가 실행 중인 노드에서 사용 가능한 모든 메모리를 사용하여 OOM Killer가 실행될 수 있습니다. 또한, 메모리 부족으로 인한 종료 시 메모리 상한이 없는 컨테이너가 종료될 가능성이 큽니다.
- 기본 메모리 상한을 갖는 namespace 내에서 실행 중인 컨테이너인 경우 자동으로 기본 메모리 상한이 할당됩니다.
OOM Killer란
Out of Memory Killer의 약자로, 리눅스 커널에서 메모리가 부족할 때 시스템이 계속해서 정상적으로 작동할 수 있도록 특정 프로세스를 강제로 종료하는 메커니즘입니다.
선택 기준 (oom_score)
- 메모리를 많이 사용하는 프로세스일수록 높은 점수
- 시스템의 중요한 프로세스는 낮은 점수
방지 방법
- 리소스 제한 : 각 컨테이너나 프로세스가 사용할 수 있는 최대 메모리를 제한합니다.
- 스왑 사용 : 스왑 메모리를 활용하여 물리 메모리가 소진되더라도 일정 부분 메모리 사용을 보장해 줍니다.
- 메모리 모니터링 : 시스템 자원을 주기적으로 모니터링하고 사용 패턴을 분석하여 과도한 메모리 사용을 방지합니다.
참고자료
반응형
'Infra > Kubernetes' 카테고리의 다른 글
Helm 차트란, helm 구조 이해하기 (0) | 2024.11.14 |
---|---|
[K8S] Kubernetes Job, CronJob 이해 및 활용법 (0) | 2024.09.27 |
[Kubernetes] 쿠버네티스 ReplicaSet, Deployment 리소스 차이 이해하기 (0) | 2024.07.25 |
[Kubernets] 쿠버네티스 주요 특징 4가지 - Ingress, Service 로드밸런싱 차이 이해하기 (0) | 2024.07.25 |
[K8S] Argo CD 및 GitHub으로 Kubernetes 애플리케이션을 쉽고 빠르게 자동 배포하는 방법 (0) | 2024.05.20 |