Google Kubernetes Engine (GKE) 節點記憶體交換功能可讓 GKE 節點在實體記憶體用盡時,使用磁碟空間做為虛擬記憶體。節點記憶體交換可協助提升應用程式復原能力,並避免特定工作負載發生記憶體不足 (OOM) 錯誤。
使用節點記憶體交換的時機
使用節點記憶體交換功能,為耗用大量記憶體的應用程式提供緩衝區,避免發生 OOM 錯誤,尤其是在用量突然暴增時。節點記憶體交換有助於提升工作負載的復原能力,例如在下列情境中:
- 執行記憶體模式無法預測的工作負載。
- 降低節點記憶體耗盡導致應用程式當機的風險。
- 避免為偶爾出現的尖峰用量過度佈建記憶體,進而節省成本。
節點記憶體交換的運作方式
啟用節點記憶體交換功能後,GKE 會將節點的作業系統設定為使用磁碟空間做為虛擬記憶體。這個程序可為暫時記憶體不足的應用程式提供緩衝區。
GKE 會根據容器的記憶體資源限制和節點的總記憶體,計算容器交換空間限制。
您可以在不同儲存空間類型上設定交換空間,以平衡效能和成本:
- 開機磁碟:使用節點的開機磁碟做為交換空間。
- 本機暫時 SSD:使用與 Pod 暫時儲存空間共用的本機 SSD。
- 專屬本機 SSD:專門保留一或多個本機 SSD 做為交換空間。
為保護機密資料,GKE 預設會使用暫時性金鑰加密交換空間。
需求條件和限制
節點記憶體交換空間有下列規定和限制:
- GKE 叢集必須是
1.34.1-gke.1341000以上版本。 - 只有具有
Burstable服務品質 (QoS) 類別的 Pod 才能使用節點記憶體交換。如要進一步瞭解 QoS 類別,請參閱 Kubernetes 說明文件中的 Pod 服務品質類別。 - 如果啟用節點記憶體交換,容器大小調整政策必須設為
RestartContainer。 - 如果將節點記憶體交換空間設定為使用開機磁碟,交換空間大小不得超過開機磁碟總容量的 50%。
如果將節點記憶體交換設定為使用本機 SSD,請務必符合下列規定:
- 機器類型必須支援本機 SSD。您無法搭配本機 SSD 使用原始區塊儲存空間。
- 節點必須佈建本機 SSD。佈建方法取決於機器系列:
- 如果是第一代或第二代機器系列,請設定
--ephemeral-storage-local-ssd=count標記。 - 如果是第三代或第四代機器系列,請選擇綁定本機 SSD 的機型。
- 如果是第一代或第二代機器系列,請設定
- 預設的
e2-medium機型不支援本機 SSD,因此您必須選取其他機型。 - 如要瞭解如何建立或更新叢集,以便佈建本機 SSD,請參閱「佈建及使用本機 SSD 支援的臨時儲存空間」。
最佳做法
節點記憶體交換功能是為了應付無法預測的記憶體用量尖峰,而不是取代足夠的實體記憶體。如需工作負載最佳化指南,請參閱「大規模調整 GKE 工作負載的資源配置」。
使用節點記憶體交換時,也請考慮下列最佳做法:
- 如要隔離啟用節點記憶體交換的節點,請將 taint 套用至節點集區,例如
gke-swap=enabled:NoSchedule,並將對應的容許條件新增至要使用交換空間的工作負載。 - 適當調整節點記憶體交換空間大小。節點記憶體不足 交換空間可能無法避免 OOM 錯誤,過度使用則會降低 效能。
- 監控工作負載的節點記憶體交換使用情形。節點記憶體交換空間經常使用,可能代表記憶體壓力過大。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。
啟用節點記憶體交換
您可以針對叢集或節點集區啟用節點記憶體交換功能。如要啟用節點記憶體交換,請建立或更新 system-config.yaml 檔案,其中包含所需的節點記憶體交換設定。以下範例會啟用節點記憶體交換功能,並採用預設設定:
linuxConfig:
swapConfig:
enabled: true
您還可以調整其他設定。這個範例會設定未加密的交換空間,使用暫時性本機 SSD 儲存空間的 30%:
linuxConfig:
swapConfig:
enabled: true
encryptionConfig:
disabled: true
ephemeralLocalSsdProfile:
swapSizePercent: 30
如要查看可設定的選用欄位清單,請參閱 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 \ --machine-type=MACHINE_TYPE更改下列內容:
NODEPOOL_NAME:新節點集區的名稱。CLUSTER_NAME:叢集名稱。LOCATION:叢集所在的區域或可用區。MACHINE_TYPE:相容的機器類型。如果是本機 SSD,請務必選擇隨附本機 SSD 的機型,例如n1-standard-1。
如要更新現有節點集區,以啟用節點記憶體交換功能,請執行下列指令:
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 檔案:
更新
system-config.yaml檔案,將swapConfig.enabled設為false:linuxConfig: swapConfig: enabled: false使用新設定更新節點集區:
gcloud beta container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yaml
後續步驟
- 進一步瞭解如何自訂節點系統設定。
- 進一步瞭解 GKE 儲存空間選項。