Google Kubernetes Engine(GKE) 노드 메모리 스왑을 사용하면 실제 메모리가 소진될 때 GKE 노드가 디스크 공간을 가상 메모리로 사용할 수 있습니다. 노드 메모리 스왑은 애플리케이션 복원력을 개선하고 특정 워크로드의 메모리 부족(OOM) 오류를 방지하는 데 도움이 될 수 있습니다.
노드 메모리 스왑을 사용하는 경우
노드 메모리 스왑을 사용하여 메모리 집약적인 애플리케이션의 OOM 오류에 대비한 버퍼를 제공합니다. 특히 예상치 못한 사용량 급증 시에 유용합니다. 노드 메모리 스왑은 다음과 같은 시나리오에서 워크로드 복원력을 개선하는 데 도움이 될 수 있습니다.
- 예측할 수 없는 메모리 패턴으로 워크로드를 실행합니다.
- 노드 메모리 소진으로 인해 애플리케이션이 비정상 종료될 위험을 줄입니다.
- 가끔 발생하는 급증에 대비해 메모리를 과도하게 프로비저닝할 필요가 없어 비용을 최적화할 수 있습니다.
노드 메모리 스왑 작동 방식
노드 메모리 스왑을 사용 설정하면 GKE는 디스크 공간을 가상 메모리로 사용하도록 노드의 운영체제를 구성합니다. 이 프로세스는 일시적인 메모리 부족을 겪는 애플리케이션에 버퍼를 제공합니다.
GKE는 컨테이너의 메모리 리소스 한도와 노드의 총 메모리를 기반으로 컨테이너 스왑 한도를 계산합니다.
다양한 스토리지 유형에서 스왑을 구성하여 성능과 비용의 균형을 맞출 수 있습니다.
- 부팅 디스크: 스왑 공간에 노드의 부팅 디스크를 사용합니다.
- 임시 로컬 SSD: 포드 임시 스토리지와도 공유되는 로컬 SSD를 사용합니다.
- 전용 로컬 SSD: 스왑을 위해 하나 이상의 로컬 SSD를 독점적으로 예약합니다.
민감한 정보를 보호하기 위해 GKE는 기본적으로 임시 키를 사용하여 스왑 공간을 암호화합니다.
요구사항 및 제한사항
노드 메모리 스왑에는 다음과 같은 요구사항 및 제한사항이 있습니다.
- GKE 클러스터는 버전
1.34.1-gke.1341000이상이어야 합니다. Burstable서비스 품질(QoS) 클래스가 있는 포드만 노드 메모리 스왑을 사용할 수 있습니다. QoS 클래스에 대한 자세한 내용은 Kubernetes 문서의 포드 서비스 품질 클래스를 참고하세요.- 노드 메모리 스왑을 사용 설정하는 경우 컨테이너 크기 조절 정책을
RestartContainer로 설정해야 합니다. - 부팅 디스크를 사용하도록 노드 메모리 스왑을 구성하는 경우 스왑 크기는 부팅 디스크의 총 용량의 50%를 초과할 수 없습니다.
- 로컬 SSD를 사용하도록 노드 메모리 스왑을 구성하는 경우 머신 유형이 로컬 SSD를 지원해야 합니다. 로컬 SSD에서는 원시 블록 스토리지를 사용할 수 없습니다.
권장사항
노드 메모리 스왑은 예측할 수 없는 메모리 급증을 위한 안전망으로 설계되었으며 충분한 실제 메모리를 대체하지 않습니다. 워크로드 최적화에 관한 안내는 대규모 워크로드의 적절한 크기 조정을 참고하세요.
노드 메모리 스왑을 사용할 때는 다음 권장사항도 고려해야 합니다.
- 예를 들어 노드 풀에 taint를 적용(
gke-swap=enabled:NoSchedule)하고 스왑을 사용하려는 워크로드에 해당 톨러레이션(toleration)을 추가하여 노드 메모리 스왑 지원 노드를 격리합니다. - 노드 메모리 스왑 공간의 크기를 적절하게 조정합니다. 노드 메모리 스왑 공간이 부족하면 OOM 오류를 방지하지 못할 수 있으며 과도하게 사용하면 성능이 저하될 수 있습니다.
- 워크로드에서 노드 메모리 스왑 사용을 모니터링합니다. 노드 메모리 스왑을 자주 사용하면 메모리 부족을 나타낼 수 있습니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
노드 메모리 스왑 사용 설정
클러스터 또는 노드 풀 단위로 노드 메모리 스왑을 사용 설정할 수 있습니다. 노드 메모리 스왑을 사용 설정하려면 원하는 노드 메모리 스왑 구성이 포함된 system-config.yaml 파일을 만들거나 업데이트합니다. 다음 예에서는 기본 설정으로 노드 메모리 스왑을 사용 설정합니다.
linuxNodeConfig:
swapConfig:
enabled: true
구성할 수 있는 추가 설정이 있습니다. 이 예시에서는 암호화되지 않은 스왑이 임시 로컬 SSD 스토리지의 30%를 사용하도록 구성합니다.
linuxNodeConfig:
swapConfig:
enabled: true
encryptionConfig:
disabled: true
ephemeral_local_ssd_profile:
swapSizePercent: 30
ephemeralStorageLocalSsdConfig:
localSsdCount: 1
구성할 수 있는 선택적 필드 목록은 LinuxNodeConfig API 참고 리소스를 참고하세요.
클러스터에서 노드 메모리 스왑 사용 설정
클러스터에서 노드 메모리 스왑을 사용 설정하려면 다음 단계 중 하나를 완료하세요.
노드 메모리 스왑이 사용 설정된 새 클러스터를 만들려면 다음 명령어를 실행합니다.
gcloud beta container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=1.34.1-gke.1341000 \ --system-config-from-file=system-config.yaml다음을 바꿉니다.
CLUSTER_NAME: 새 클러스터의 이름입니다.LOCATION: 클러스터의 리전 또는 영역입니다.
기존 클러스터를 업데이트하여 노드 메모리 스왑을 사용 설정하려면 다음 명령어를 실행합니다.
gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yaml다음을 바꿉니다.
CLUSTER_NAME: 새 클러스터의 이름입니다.LOCATION: 클러스터의 리전 또는 영역입니다.
노드 풀에서 노드 메모리 스왑 사용 설정
노드 풀에서 노드 메모리 스왑을 사용 설정하려면 다음 단계 중 하나를 완료하세요.
노드 메모리 스왑이 사용 설정된 새 노드 풀을 만들려면 다음 명령어를 실행합니다.
gcloud beta container node-pools create NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --node-version=1.34.1-gke.1293000 \ --system-config-from-file=system-config.yaml다음을 바꿉니다.
NODEPOOL_NAME: 새 노드 풀의 이름입니다.CLUSTER_NAME: 클러스터 이름입니다.LOCATION: 클러스터의 리전 또는 영역입니다.
노드 메모리 스왑을 사용 설정하도록 기존 노드 풀을 업데이트하려면 다음 명령어를 실행합니다.
gcloud beta container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yaml다음을 바꿉니다.
NODEPOOL_NAME: 노드 풀의 이름입니다.CLUSTER_NAME: 클러스터 이름입니다.LOCATION: 클러스터의 리전 또는 영역입니다.
구성 확인
노드 메모리 스왑이 사용 설정되어 있는지 확인하려면 다음 단계를 완료하세요.
다음 명령어를 실행하여
system-config.yaml이swapConfig설정으로 적용되었는지 확인합니다.gcloud beta container node-pools describe NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format='yaml(config.linuxNodeConfig.swapConfig)'다음 명령어를 실행하여 kubelet 구성이 노드에 있는지 확인합니다.
kubectl get --raw "/api/v1/nodes/NODE_NAME/proxy/configz" | jq .kubeletconfig.memorySwap
메모리 스왑 사용 모니터링
Cloud Monitoring 또는 kubectl을 사용하여 노드 메모리를 모니터링할 수 있습니다.
모니터링
다음 시스템 측정항목은 스왑 사용량을 관찰하는 데 기본적으로 사용할 수 있습니다.
kubernetes.io/node/memory/swap_used_byteskubernetes.io/container/memory/swap_used_bytes
GKE는 cAdvisor를 통해 컨테이너 수준 스왑 사용량 측정항목도 제공합니다. 이러한 측정항목을 사용하려면 클러스터에서 cAdvisor를 사용 설정하세요.
prometheus.googleapis.com/container_memory_swap/gauge
kubectl
다음 단계를 완료하여 kubectl 명령어로 스왑 사용량을 모니터링합니다.
다음 명령어를 실행하여 노드 객체의
SwapDetected조건을 확인합니다.kubectl get node NODE_NAME -o jsonpath='{.status.conditions[?(@.type=="Swap")]}' | jq .출력은 다음과 비슷합니다.
{ "lastHeartbeatTime": "2025-07-11T00:14:52Z", "lastTransitionTime": "2025-06-25T05:20:10Z", "message": "Swap is active: Total=49Gi Used=0B Free=49Gi", "reason": "SwapDetected", "status": "True", "type": "Swap" }다음 명령어를 실행하여 스왑 용량을 확인합니다.
kubectl get node NODE_NAME -o jsonpath='{.status.nodeInfo.swap}'출력은 다음과 비슷합니다.
{"capacity":53687087104}
노드 메모리 스왑 사용 중지
노드 메모리 스왑을 사용 중지하려면 다음 단계를 완료하여 system-config.yaml 파일을 업데이트하세요.
swapConfig.enabled를false로 설정하도록system-config.yaml파일을 업데이트합니다.linuxNodeConfig: swapConfig: enabled: false새 구성으로 노드 풀을 업데이트합니다.
gcloud beta container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yaml
다음 단계
- 노드 시스템 구성 맞춤설정 자세히 알아보기
- GKE 스토리지 옵션 자세히 알아보기