오픈소스 인사이트
home
오픈소스 기술 동향
home
🥏

컨테이너 메모리 사용량

들어가며

수행중인 파드가 메모리가 부족하여 쫒겨(evict)나거나 OOM(Out-of-memory)로 종료되는 경우가 있습니다. 이 글에서는 컨테이너가 사용중인 메모리양을 확인하는 방법과 최소 메모리양, 최대 메모리양을 설정하는 방법에 대해 알아보겠습니다.
이 글에서는 이런 내용에 대해 살펴 보겠습니다.

리눅스 시스템 메모리 이해 (free 명령어)

controlplane ~ ➜ free -m total used free shared buff/cache available Mem: 209558 58317 2935 378 148306 149508 Swap: 0 0 0
Bash
복사
free 수행 예
free 명령어의 아래와 같은 항목들이 있습니다.
Used: 실제 프로세스가 점유 중인 메모리.
Free: 완전히 비어 있는 메모리 (단순히 이 수치가 낮다고 메모리가 부족한 것은 아님).
Buff/Cache: 디스크 성능 향상을 위한 임시 저장 공간. 응용 프로그램이 메모리를 요청하면 시스템이 이 영역을 반환하여 할당해 줍니다.
Available: 시스템이 프로세스에 할당 가능한 실제 여유 공간 (Free + 반환 가능한 Buff/Cache).
유사하게 컨테이너의 메모리 사용량은 단순히 응용 프로그램이 사용하는 영역뿐만 아니라 캐시등 커널에서 사용하는 영역도 포함되어야 합니다. 이런 영역을 표현하기 위해 Working Set이라는 개념이 생겨났습니다.
쿠버네티스에서 kubectl top 등으로 확인하는 메모리 수치는 단순 점유량이 아닌 Working Set 기준입니다.
정의: 응용 프로그램 작동을 위해 반드시 필요한 메모리 영역 (실제 사용량 + 반환 불가능한 일부 캐시).
특징: 메모리가 부족해도 시스템이 강제로 회수할 수 없는 영역이므로, 실제 컨테이너의 메모리 사용량을 판단하는 기준이 됩니다.
controlplane ~ ➜ kubectl top pod -n kube-system NAME CPU(cores) MEMORY(bytes) coredns-6799fbcd5-lsstk 3m 18Mi local-path-provisioner-84db5d44d9-9wwqc 1m 10Mi metrics-server-67c658944b-qh9qd 6m 22Mi svclb-traefik-605f6ebc-g8j55 0m 7Mi traefik-f4564c4f4-29n6w 1m 29Mi
Bash
복사
파드의 메모리 사용량(working set)
리소스의 Request와 Limit 설정을 통해 컨테이너 수행에 필요한 최소 메모리와 최대 메모리를 설정할 수 있습니다.

리소스 설정: Request와 Limit

Request (요청량): 컨테이너 실행을 위해 보장되어야 하는 최소 메모리. 노드 스케줄링의 기준이 되며, 초과 사용 시 노드 자원이 부족하면 파드가 쫓겨날(Evict) 수 있습니다.
Limit (제한량): 컨테이너가 사용할 수 있는 최대 메모리. 이 수치를 넘으려고 하면 커널이 OOM(Out Of Memory) Killer를 통해 해당 프로세스를 강제 종료합니다.
Limit 미설정 위험: 컨테이너가 노드의 모든 메모리를 점유하여 다른 프로세스나 시스템 전체에 영향을 줄 수 있습니다.

LimitRange를 통한 자동 관리

네임스페이스 단위로 LimitRange를 설정하면, 개별 파드 설정이 누락되더라도 기본값이 자동으로 적용됩니다.
작동 방식: LimitRange 객체를 생성한 네임스페이스 내에서 파드 생성 시, 설정된 default와 defaultRequest 값이 리소스 항목에 자동으로 적용됩니다.
주요 설정 예시:
default: 메모리 Limit 기본값 (예: 512Mi)
defaultRequest: 메모리 Request 기본값 (예: 256Mi)

LimitRange 설정 예시

네임스페이스 생성

테스트용 네임스페이스 default-mem-example를 생성합니다.
kubectl create namespace default-mem-example
Bash
복사

LimitRange와 Pod 생성

아래 manifest 파일은 디폴트 메모리 request와  limit을 지정합니다.
apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range spec: limits: - default: memory: 512Mi defaultRequest: memory: 256Mi type: Container
YAML
복사
memory-defaults.yaml
default-mem-example 네임스페이스에 LimitRange 생성합니다.
kubectl apply -f memory-defaults.yaml --namespace=default-mem-example
Bash
복사
이제 default-mem-example 네임스페이스에서 생성된 Pod들은 디폴트 메모리 설정을 적용 받습니다.
default-mem-demo Pod를 실행해 보겠습니다.
apiVersion: v1 kind: Pod metadata: name: default-mem-demo spec: containers: - name: default-mem-demo-ctr image: nginx
YAML
복사
memory-defaults-pod.yaml
kubectl apply -f memory-defaults-pod.yaml --namespace=default-mem-example
Bash
복사
Pod의 상세 정보를 확인해보면 디폴트 메모리 설정이 적용된 것을 확인할 수 있습니다.
kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example containers: - image: nginx imagePullPolicy: Always name: default-mem-demo-ctr resources: limits: memory: 512Mi requests: memory: 256Mi
Bash
복사

마치며

이  글에서는 컨테이너의 메모리 사용량 대해 알아 보았습니다.
실제 컨테이너가 사용하는 메모리양을 의미하는 Working Set의 개념을 살펴보았습니다.
또 컨테이너가 수행하는데 필요한 최소 메모리양, 최대 메모리양을 설정하는 방법을 알아보았습니다.

참고자료

김유성 프로
에스코어㈜ 소프트웨어사업부 OSS사업팀
Kubernetes , Istio 기술 지원을 하였으며, 현재는 Zabbix  기술 지원을 하고 있습니다.