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

컨테이너 메모리 사용량

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

controlplane ~ ➜ free -m total used free shared buff/cache available Mem: 209558 58317 2935 378 148306 149508 Swap: 0 0 0
Bash
복사
free 수행 예
리눅스는 성능 최적화를 위해 남는 메모리를 캐시(Cache) 영역으로 최대한 활용합니다.
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 (요청량): 컨테이너 실행을 위해 보장되어야 하는 최소 메모리. 노드 스케줄링의 기준이 되며, 초과 사용 시 노드 자원이 부족하면 파드가 쫓겨날(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
복사

참조

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