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

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

驗證設定

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

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

    gcloud 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 監控節點記憶體。

監控

根據預設,您可以使用下列系統指標觀察 swap 使用情形:

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

GKE 也會透過 cAdvisor 提供容器層級的 Swap 使用量指標。如要使用這些指標,請在叢集上啟用 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}
    

節點記憶體交換,具備混合本機 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 檔案:

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

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

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

後續步驟