將節點設為使用磁碟空間做為虛擬記憶體

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:叢集所在的區域或可用區。

驗證設定

如要確認節點記憶體交換空間已啟用,請完成下列步驟:

  1. 執行下列指令,確認 system-config.yaml 已套用 swapConfig 設定:

    gcloud beta container node-pools describe NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --format='yaml(config.linuxNodeConfig.swapConfig)'
    
  2. 執行下列指令,確認節點上是否有 kubelet 設定:

    kubectl get --raw "/api/v1/nodes/NODE_NAME/proxy/configz" | jq .kubeletconfig.memorySwap
    

監控記憶體交換使用情形

您可以使用 Cloud Monitoring 或 kubectl 監控節點記憶體。

監控

根據預設,下列系統指標可用於觀察交換空間用量:

  • kubernetes.io/node/memory/swap_used_bytes
  • kubernetes.io/container/memory/swap_used_bytes

GKE 也會透過 cAdvisor 提供容器層級的交換空間用量指標。如要使用這些指標,請在叢集上啟用 cAdvisor

  • prometheus.googleapis.com/container_memory_swap/gauge

kubectl

如要使用 kubectl 指令監控交換空間用量,請完成下列步驟:

  1. 執行下列指令,檢查節點物件的 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"
    }
    
  2. 執行下列指令,檢查交換容量:

    kubectl get node NODE_NAME -o jsonpath='{.status.nodeInfo.swap}'
    

    輸出結果會與下列內容相似:

    {"capacity":53687087104}
    

停用節點記憶體交換

如要停用節點記憶體交換,請完成下列步驟來更新 system-config.yaml 檔案:

  1. 更新 system-config.yaml 檔案,將 swapConfig.enabled 設為 false

    linuxConfig:
      swapConfig:
        enabled: false
    
  2. 使用新設定更新節點集區:

    gcloud beta container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=system-config.yaml
    

後續步驟