Google Kubernetes Engine (GKE) 節點記憶體交換功能可讓 GKE 節點在實體記憶體用盡時,將磁碟空間做為虛擬記憶體使用。節點記憶體交換功能可提升應用程式韌性,並防止特定工作負載發生記憶體不足 (OOM) 錯誤。
使用節點記憶體交換的時機
使用節點記憶體交換功能,為記憶體密集型應用程式提供緩衝區,防止發生 OOM 錯誤,尤其是在用量意外激增時。節點記憶體交換功能可提升工作負載彈性,例如在下列情況:
- 執行記憶體模式難以預測的工作負載。
- 降低應用程式因節點記憶體耗盡而停止運作的風險。
- 避免為了因應偶爾出現的高峰而過度佈建記憶體,進而降低成本。
節點記憶體交換的運作方式
啟用節點記憶體交換功能後,GKE 會設定節點的作業系統,將磁碟空間做為虛擬記憶體使用。這個程序可為暫時面臨記憶體壓力的應用程式提供緩衝。
GKE 會根據容器的記憶體資源限制和節點的總記憶體,計算容器交換限制。
您可以在不同儲存空間類型上設定 swap,平衡效能和成本:
- 開機磁碟:使用節點的開機磁碟做為交換空間。
- 本機暫時 SSD:使用與 Pod 暫時儲存空間共用的本機 SSD。如果節點使用混合本機 SSD 容量,swap 只會使用本機 SSD 的臨時儲存空間部分。
- 專用本機 SSD:保留一或多個本機 SSD,專門用於交換。
為保護機密資料,GKE 預設會使用臨時金鑰加密交換空間。
需求條件和限制
節點記憶體交換有下列需求條件和限制:
- GKE 叢集必須為
1.34.1-gke.1341000以上版本。 - 只有具備
Burstable服務品質 (QoS) 類別的 Pod 才能使用節點記憶體交換。如要進一步瞭解 QoS 類別,請參閱 Kubernetes 說明文件中的 Pod 服務品質類別。 - 如要調整容器的記憶體資源大小,必須將容器大小調整政策設為
RestartContainer。 - 如果將節點記憶體交換設定為使用開機磁碟,交換大小不得超過開機磁碟總容量的 50%。
如果將節點記憶體交換設為使用本機 SSD,請務必符合下列規定:
- 機器類型必須支援本機 SSD。您只能使用佈建為臨時儲存空間或混合儲存空間的本機 SSD。您無法使用佈建為原始區塊裝置儲存空間的本機 SSD。如要查看這個模式支援的交換設定檔清單,請參閱「混合本機 SSD 容量的節點記憶體交換」。
- 節點必須佈建本機 SSD。佈建方法取決於機器系列:
- 如果是第一代或第二代機器系列,請設定
--ephemeral-storage-local-ssd=count旗標。 - 如果是第三或第四代機器系列,請選擇與本機 SSD 綁定的機型。
- 如果是第一代或第二代機器系列,請設定
- 預設的
e2-medium機器類型不支援本機 SSD,因此您必須選取其他機器類型。 - 如要瞭解如何建立或更新叢集,以便佈建本機 SSD,請參閱「佈建及使用本機 SSD 支援的臨時儲存空間」。
最佳做法
節點記憶體交換功能是為了因應無法預測的記憶體用量激增,而非取代充足的實體記憶體。如需最佳化工作負載的指引,請參閱「大規模調整 GKE 工作負載」。
使用節點記憶體交換時,也請考量下列最佳做法:
- 如要隔離啟用節點記憶體交換功能的節點,請對節點集區套用污點 (例如
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
您可以調整其他設定。以下範例會設定未加密的交換空間,使用 30% 的暫時性本機 SSD 儲存空間:
linuxConfig:
swapConfig:
enabled: true
encryptionConfig:
disabled: true
ephemeralLocalSsdProfile:
swapSizePercent: 30
如需可設定的選項欄位清單,請參閱 LinuxNodeConfig API 說明文件。
在叢集啟用節點記憶體交換
如要在叢集啟用節點記憶體交換功能,請完成下列任一步驟:
如要建立啟用節點記憶體交換功能的新叢集,請執行下列指令:
gcloud 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 container clusters update CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yaml更改下列內容:
CLUSTER_NAME:新叢集的名稱。LOCATION:叢集所在的區域或可用區。
啟用節點集區的節點記憶體交換功能
如要在節點集區啟用節點記憶體交換,請完成下列任一步驟:
如要建立新的節點集區,並啟用節點記憶體交換功能,請執行下列指令:
gcloud 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 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 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 監控節點記憶體。
監控
根據預設,您可以使用下列系統指標觀察 swap 使用情形:
kubernetes.io/node/memory/swap_used_byteskubernetes.io/container/memory/swap_used_bytes
GKE 也會透過 cAdvisor 提供容器層級的 Swap 使用量指標。如要使用這些指標,請在叢集上啟用 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}
節點記憶體交換,具備混合本機 SSD 容量
您可以在佈建混合本機 SSD 的節點集區上啟用節點記憶體交換功能。GKE 支援下列 swap 設定檔:
- 開機磁碟 (
bootDiskProfile) - 暫時性本機 SSD (
ephemeralLocalSsdProfile):GKE 會從本機 SSD 的暫時性儲存空間部分分配 swap 空間,而非從原始區塊分區分配。
GKE 不支援混合本機 SSD 的專用本機 SSD 交換設定檔 (dedicatedLocalSsdProfile)。
如果使用暫時性本機 SSD 設定檔,請注意下列事項:
swapSizePercent欄位是您使用capacity子欄位設定的臨時容量百分比,而非實體本機 SSD 總容量。舉例來說,如果設定為capacity=200GB和swapSizePercent: 20,GKE 會分配 40 GiB 的 swap。- 交換空間會減少 Pod 可用的臨時儲存空間。GKE 會從暫時容量中扣除 swap 大小,計算出預留的暫時儲存空間。
- 交換空間大小不得超過臨時容量的 80%,且須扣除 GKE 預留給系統使用的臨時儲存空間。如果臨時容量太小,無法容納 swap,要求就會失敗。
下列 system-config.yaml 檔案範例會將 20% 的臨時容量分配給 swap:
linuxConfig:
swapConfig:
enabled: true
ephemeralLocalSsdProfile:
swapSizePercent: 20
如要建立混合本機 SSD 容量和節點記憶體交換的節點集區,請執行下列指令:
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--machine-type=MACHINE_TYPE \
--ephemeral-storage-local-ssd count=NUMBER_OF_DISKS,capacity=CAPACITY \
--system-config-from-file=system-config.yaml
更改下列內容:
POOL_NAME:要建立的新節點集區名稱。CLUSTER_NAME:叢集名稱。MACHINE_TYPE:要使用的機器類型。本機 SSD 無法與預設的e2-medium機型搭配使用,因為共用核心機型不支援本機 SSD。NUMBER_OF_DISKS:要在各節點佈建的本機 SSD 磁碟數量。CAPACITY:要格式化為臨時儲存空間的本機 SSD 總容量。這個值必須大於 0,且絕對小於實體本機 SSD 總容量 (磁碟數量 × 每個磁碟的大小),例如200GB。
停用節點記憶體交換
如要停用節點記憶體交換,請完成下列步驟,更新 system-config.yaml 檔案:
更新
system-config.yaml檔案,將swapConfig.enabled設為false:linuxConfig: swapConfig: enabled: false使用新設定更新節點集區:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --system-config-from-file=system-config.yaml
後續步驟
- 進一步瞭解如何自訂節點系統設定。
- 進一步瞭解 GKE 儲存空間選項。