自訂節點系統設定

本文說明如何使用節點系統設定設定檔,自訂 Google Kubernetes Engine (GKE) 節點設定。

節點系統設定檔可讓您調整一組有限的系統設定。在節點集區中,您可以使用節點系統設定,為 kubelet Kubernetes 節點代理程式和 sysctl 低階 Linux 核心設定指定自訂設定。

本文詳細說明節點系統設定的可用設定,以及如何將這些設定套用至 GKE Standard 節點集區。請注意,GKE Autopilot 叢集的節點環境代管程度較高,因此與 GKE Standard 節點集區相比,直接設定節點系統的選項較少。

使用節點系統設定的原因

節點系統設定具有下列優點:

  • 效能調整:針對 AI 訓練或服務、資料庫、高流量網路伺服器或延遲敏感服務等高需求應用程式,最佳化網路堆疊效能、記憶體管理、CPU 排程或 I/O 行為。
  • 安全性強化:套用特定核心層級安全性設定,或限制特定系統行為,縮小攻擊面。
  • 資源管理:微調 kubelet 管理 PID、磁碟空間、映像檔垃圾收集,或 CPU 和記憶體資源的方式。
  • 工作負載相容性:確保節點環境符合特定先決條件,適用於需要特定核心設定的專業軟體或舊版應用程式。

自訂節點設定的其他選項

您也可以使用其他方法自訂節點設定:

  • 執行階段設定檔:如要自訂 GKE 節點上的 containerd 容器執行階段,可以使用另一個稱為執行階段設定檔的檔案。詳情請參閱「自訂 GKE 節點中的 containerd 設定」。
  • ComputeClass:您可以在 GKE ComputeClass 規格中指定節點屬性。在 GKE 1.32.1-gke.1729000 以上版本中,您可以在 GKE Autopilot 模式和標準模式中使用 ComputeClass。詳情請參閱「自訂節點系統設定」。
  • DaemonSets:您也可以使用 DaemonSet 自訂節點。詳情請參閱「使用 DaemonSet 自動啟動 GKE 節點」。

Windows Server 節點不支援節點系統設定。

事前準備

開始前,請務必完成下列操作:

  • 安裝指令列工具:
    • 如要使用本文中的 gcloud CLI 範例,請務必安裝並設定 Google Cloud CLI。
    • 如要使用 Terraform 範例,請務必安裝並設定 Terraform。
  • 授予權限:您需要適當的身分與存取權管理權限,才能建立及更新 GKE 叢集和節點集區,例如 container.clusterAdmin 或具備同等權限的其他角色。
  • 規劃潛在的工作負載中斷:自訂節點設定會在節點集區層級套用。變更通常會觸發集區中節點的滾動式更新,包括重新建立節點。規劃可能的工作負載中斷,並視情況使用 Pod 中斷預算 (PDB)。
  • 備份並測試所有變更:請務必先在測試或開發環境中測試設定變更,再套用至正式環境。設定錯誤可能導致節點不穩定或工作負載失敗。
  • 查看 GKE 預設設定:GKE 節點映像檔隨附最佳化的預設設定。除非有特定需求,且瞭解變更帶來的影響,否則請勿自訂參數。

新增節點系統設定

您可以使用 ComputeClass 或設定檔,自訂節點系統設定。

使用 ComputeClass 設定節點系統

您可以使用自訂 ComputeClass,自訂 kubelet 和 Linux 核心中的特定參數。這個方法適用於 GKE 1.32.1-gke.1729000 以上版本。

如要使用 ComputeClass 自訂節點系統設定,請按照下列步驟操作:

  1. 建立包含 spec.nodePoolAutoCreation.enabled: true 欄位值組合的 ComputeClass,並在 priorityDefaults 欄位中指定系統設定。
  2. 部署會選取 ComputeClass 的工作負載。

建立 ComputeClass

以 YAML 格式編寫 ComputeClass 設定。使用 priorityDefaults 規格中的 nodeSystemConfig 欄位,設定所有優先順序的系統設定。

下列 ComputeClass 範例會設定靜態 CPU 管理工具政策和自訂核心參數:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: custom-sysconfig
spec:
  nodePoolAutoCreation:
    enabled: true
  priorityDefaults:
    nodeSystemConfig:
      kubeletConfig:
        cpuManagerPolicy: static
      linuxNodeConfig:
        sysctls:
          net.core.somaxconn: 2048
  priorities:
  - machineFamily: n4

套用 ComputeClass:

kubectl apply -f custom-sysconfig.yaml

部署選取 ComputeClass 的工作負載

在 Pod 規格中,為 ComputeClass 名稱新增節點選取器:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      nodeSelector:
        cloud.google.com/compute-class: custom-sysconfig
      containers:
      - name: app-container
        image: nginx

套用工作負載:

kubectl apply -f my-app.yaml

詳情請參閱「自訂節點系統設定」。

使用設定檔進行節點系統設定

使用節點系統設定檔時,您會使用包含 kubelet 和 Linux 核心設定參數的 YAML 檔案。雖然 GKE Autopilot 模式也提供節點系統設定,但本文步驟說明的是如何建立及使用 GKE Standard 模式的設定檔。

如要在 GKE Standard 模式中使用節點系統設定檔,請按照下列步驟操作:

  1. 建立設定檔。這個檔案包含 kubelet 和 sysctl 設定。
  2. 在建立叢集或節點集區時新增設定,或更新現有節點集區。

建立設定檔

以 YAML 格式編寫節點系統設定。以下範例會新增 kubelet 和 sysctl 選項的設定:

kubeletConfig:
  cpuManagerPolicy: static
  allowedUnsafeSysctls:
    - 'kernel.shm*'
    - 'kernel.msg*'
    - 'kernel.sem'
    - 'fs.mqueue.*'
    - 'net.*'
linuxConfig:
  sysctl:
    net.core.somaxconn: '2048'
    net.ipv4.tcp_rmem: '4096 87380 6291456'

在這個例子中,適用下列條件:

  • cpuManagerPolicy: static 欄位會設定 kubelet,以使用靜態 CPU 管理政策。
  • net.core.somaxconn: '2048' 欄位會將 socket listen() 待處理項目限制為 2,048 個位元組。
  • net.ipv4.tcp_rmem: '4096 87380 6291456' 欄位會將 TCP 通訊端接收緩衝區的最小值、預設值和最大值分別設為 4,096 位元組、87,380 位元組和 6,291,456 位元組。

如果只想為 kubelet 或 sysctl 新增設定,請在節點系統設定中僅加入該部分。舉例來說,如要新增 kubelet 設定,請建立下列檔案:

kubeletConfig:
  cpuManagerPolicy: static

如需可新增至節點系統設定的完整欄位清單,請參閱「Kubelet 設定選項」和「Sysctl 設定選項」一節。

將設定新增至 Standard 節點集區

建立節點系統設定後,請使用 Google Cloud CLI 新增 --system-config-from-file 旗標。您可以在建立叢集或節點集區時,或更新現有節點集區時,新增這個旗標。您無法使用 Google Cloud 控制台新增節點系統設定。

建立具有節點系統設定的叢集

您可以在建立叢集時,使用 gcloud CLI 或 Terraform 新增節點系統設定。下列操作說明會將節點系統設定套用至預設節點集區:

gcloud CLI

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --system-config-from-file=SYSTEM_CONFIG_PATH

更改下列內容:

  • CLUSTER_NAME:叢集名稱
  • LOCATION:叢集的運算可用區或區域
  • SYSTEM_CONFIG_PATH:包含 kubelet 和 sysctl 設定的檔案路徑

套用節點系統設定後,叢集的預設節點集區會使用您定義的設定。

Terraform

如要使用 Terraform 建立具有自訂節點系統設定的區域叢集,請參考下列範例:

resource "google_container_cluster" "default" {
  name     = "gke-standard-regional-cluster"
  location = "us-central1"

  initial_node_count = 1

  node_config {
    # Kubelet configuration
    kubelet_config {
      cpu_manager_policy = "static"
    }

    linux_node_config {
      # Sysctl configuration
      sysctls = {
        "net.core.netdev_max_backlog" = "10000"
      }

      # Linux cgroup mode configuration
      cgroup_mode = "CGROUP_MODE_V2"

      # Linux huge page configuration
      hugepages_config {
        hugepage_size_2m = "1024"
      }
    }
  }
}

如要進一步瞭解如何使用 Terraform,請參閱「Terraform 對 GKE 的支援」。

建立新的節點集區,並套用節點系統設定

使用 gcloud CLI 或 Terraform 建立新的節點集區時,可以新增節點系統設定。

下列操作說明會將節點系統設定套用至新的節點集區:

gcloud CLI

gcloud container node-pools create POOL_NAME \
     --cluster CLUSTER_NAME \
     --location=LOCATION \
     --system-config-from-file=SYSTEM_CONFIG_PATH

更改下列內容:

  • POOL_NAME:節點集區的名稱
  • CLUSTER_NAME:要新增節點集區的叢集名稱
  • LOCATION:叢集的運算可用區或區域
  • SYSTEM_CONFIG_PATH:包含 kubelet 和 sysctl 設定的檔案路徑

Terraform

如要使用 Terraform 建立節點集區,並自訂節點系統設定,請參考下列範例:

resource "google_container_node_pool" "default" {
  name    = "gke-standard-regional-node-pool"
  cluster = google_container_cluster.default.name

  node_config {
    # Kubelet configuration
    kubelet_config {
      cpu_manager_policy = "static"
    }

    linux_node_config {
      # Sysctl configuration
      sysctls = {
        "net.core.netdev_max_backlog" = "10000"
      }

      # Linux cgroup mode configuration
      cgroup_mode = "CGROUP_MODE_V2"

      # Linux huge page configuration
      hugepages_config {
        hugepage_size_2m = "1024"
      }
    }
  }
}

如要進一步瞭解如何使用 Terraform,請參閱「Terraform 對 GKE 的支援」。

更新現有節點集區的節點系統設定

如果您使用設定檔管理節點系統設定,可以透過下列任一方式更新現有節點集區:

  • 不中斷服務的即時更新:直接將更新後的 sysctl 和 kubelet 設定套用至執行中的節點,不必重新建立 VM 或移除 Pod。如果只想變更 sysctl 或 kubelet 設定,並盡可能減少干擾,請使用這個方法。
  • 標準升級策略:使用新設定重新建立節點。如果變更的設定不支援即時更新、叢集或節點集區執行的 GKE 版本早於 1.37.1-gke.1954000,或您希望 GKE 排除 Pod 並重新排程至新節點,請使用這個方法。

如要變更使用 ComputeClass 的節點設定,請改為參閱「編輯 ComputeClass 的節點系統設定」。

使用不中斷服務的即時更新功能

您可以直接將設定檔中更新的 sysctl 和 kubelet 設定套用至執行中的節點。這項程序會更新參數,而不重新建立或重新啟動基礎 VM,因此可減少中斷情形並加快更新速度。下列 linuxConfig 選項仍須採用標準升級策略:

最新即時資訊的運作方式

最新即時資訊功能在各項支援設定中的運作方式如下:

  • sysctl 設定:GKE 會在每個節點上重新啟動 sysctl systemd 服務,以套用 linuxConfig.sysctl 欄位中的核心參數。如果您更新命名空間 sysctl 參數,GKE 也會重新啟動 kubelet 服務,以更新 Pod 層級 sysctl 設定。如要瞭解支援的參數,請參閱「Sysctl 設定選項」。
  • kubelet 設定:GKE 會重新啟動各節點上的 kubelet 服務,套用 kubeletConfig 欄位中的參數。大多數 kubelet 設定選項都支援即時更新。不過,cpuManagerPolicy、shutdownGracePeriodSeconds 和 shutdownGracePeriodCriticalPodsSeconds 選項需要標準升級策略。

無論是哪一種情況,GKE 都會直接在執行中的節點上套用變更,不會重新建立 VM、剔除 Pod 或建立臨時激增 VM。GKE 會將節點集區的 --max-surge-upgrade 和 --max-unavailable-upgrade 設定總和做為並行限制,決定要同時更新多少現有節點。

最新即時資訊功能的必要條件

如要使用即時更新功能,叢集和節點集區必須符合下列必要條件:

  • 執行 GKE 1.37.1-gke.1954000 以上版本。
  • 在叢集上啟用 NodeReadinessController 外掛程式。在即時更新期間,這個控制器會暫時將 readiness.k8s.io/gke-node-live-update-reconciling:NoSchedule 污點套用至每個更新中的節點,這樣 GKE 就不會在更新完成前,將新的 Pod 排程至該節點:
    • 如果是新叢集,請在建立叢集時,於 --addons 旗標中加入 NodeReadinessController 外掛程式。這個旗標只會啟用您指定的外掛程式,並停用所有其他外掛程式,因此請一併加入要保留的任何預設外掛程式。
    • 如果是現有叢集,請在更新叢集時傳遞 --update-addons=NodeReadinessController=ENABLED 旗標。

套用即時更新

如要套用即時更新,請按照下列步驟操作:

  1. 建立或修改節點系統設定 YAML 檔案,使其包含節點集區的完整設定,包括您要變更的 kubelet 或 sysctl 設定。為避免重設不想變更的設定,請從節點集區的現有設定開始。
  2. 使用設定檔更新節點集區,並將 --node-config-update-mode 旗標的值設為 LIVE_UPDATE_WITHOUT_DRAIN:

    gcloud container node-pools update POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=SYSTEM_CONFIG_PATH \
        --node-config-update-mode=LIVE_UPDATE_WITHOUT_DRAIN
    

    更改下列內容:

    • POOL_NAME:要更新的節點集區名稱
    • CLUSTER_NAME:節點集區所在叢集的名稱
    • LOCATION:叢集的運算可用區或區域
    • SYSTEM_CONFIG_PATH:節點系統設定 YAML 檔案的路徑
  3. 確認 GKE 已將更新後的設定套用至節點集區:

    gcloud container node-pools describe POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --format="yaml(config.kubeletConfig, config.linuxNodeConfig)"
    

    指令輸出內容會在 config.kubeletConfig 和 config.linuxNodeConfig 欄位中,顯示節點集區的有效設定。

  4. 選用:重新啟動現有 Pod。即時更新不會中斷執行中的 Pod,因此 GKE 只會將更新後的設定套用至更新完成後啟動的 Pod。如要將設定套用至已執行的工作負載,請重新啟動其 Pod,例如在 Deployment 上執行 kubectl rollout restart。

如果即時更新未如預期進行,復原路徑取決於更新作業是否完成:

從失敗的即時更新中復原

如果節點的即時更新失敗,GKE 會立即停止推出作業,並讓節點集區處於部分更新狀態。如要檢查失敗詳情,請執行下列任一操作:

  • 執行 gcloud container operations describe 指令。在輸出內容中,statusMessage 欄位會指出即時更新失敗的節點,以及節點回報的錯誤,例如:

    statusMessage: 'Failed precondition: live update failed on node gke-my-cluster-default-pool-ae3770ee-2kk0:
      Live update fails with error: failed to write new kubelet config: ...'
    
  • 在Logs Explorer中,檢查受影響節點上的 gke-node-live-update-reconciler 元件是否有錯誤。

由於即時更新失敗不會變更節點集區儲存的設定,因此使用 gcloud container node-pools update 指令重新套用先前的設定不會觸發更新。檢查失敗原因後,請選擇下列其中一個復原選項:

  • 修正問題並完成即時更新 (建議):解決導致失敗的問題,然後使用目標設定重新執行先前程序中的 gcloud container node-pools update 指令。
  • 還原至先前的設定:如果無法解決問題,請執行 gcloud container node-pools rollback 指令,將節點集區還原至先前的設定。與即時更新不同,這個指令會重新建立節點集區中的所有節點,因此會中斷在這些節點上執行的工作負載。

還原已完成的最新即時資訊

如果即時更新作業成功,但新套用的設定導致非預期的工作負載行為,請套用另一個採用先前設定的即時更新,就地還原變更。這項即時更新會還原先前的設定,不會剔除 Pod 或重新啟動節點。作業成功後,gcloud container node-pools rollback 指令就無法使用,只有在作業失敗時才能使用。

如要還原已完成的即時更新,請按照下列步驟操作:

  1. 更新節點系統設定 YAML 檔案,使其包含節點集區的完整先前設定。如果先前未設定某項設定,請明確將其設為預設值,而非省略或留空。如要瞭解預設值,請參閱「Kubelet 設定選項」和「Sysctl 設定選項」。
  2. 將先前的設定套用至節點集區:

    gcloud container node-pools update POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --system-config-from-file=SYSTEM_CONFIG_PATH \
        --node-config-update-mode=LIVE_UPDATE_WITHOUT_DRAIN
    

使用標準升級策略更新

如果您要更新不支援即時更新的設定選項、叢集或節點集區執行的 GKE 版本低於 1.37.1-gke.1954000,或希望 GKE 自動排空 Pod 並重新排程至新建立的節點,請使用標準升級策略。

如要使用標準升級策略更新現有節點集區,請執行下列指令:

gcloud container node-pools update POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --system-config-from-file=SYSTEM_CONFIG_PATH

更改下列內容:

  • POOL_NAME:要更新的節點集區名稱
  • CLUSTER_NAME:節點集區所在叢集的名稱
  • LOCATION:叢集的運算可用區或區域
  • SYSTEM_CONFIG_PATH:節點系統設定 YAML 檔案的路徑

這項變更需要重新建立節點,可能會中斷執行中的工作負載。如要進一步瞭解這項特定變更,請在手動變更表格中,找出對應的資料列。

如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。

編輯節點系統設定

您可以根據使用的是 ComputeClasses 還是設定檔,編輯節點系統設定。

ComputeClass

如要在使用 ComputeClasses 時編輯節點系統設定,請選擇下列其中一種方法:

方法 1:更新現有的 ComputeClass

如果您更新現有 ComputeClass 中的 nodeSystemConfig,GKE 只會將更新後的設定套用至新建立的節點。現有節點不會自動更新。

如要將工作負載遷移至採用新設定的節點,您可以採取下列任一做法:

  • 在 ComputeClass 中設定主動遷移。
  • 如要觸發新節點的擴充作業,請手動重新啟動或重新建立工作負載。

如要更新 ComputeClass,請編輯 YAML 檔案並套用:

kubectl apply -f custom-sysconfig.yaml

方法 2:建立新的 ComputeClass

為確保工作負載遷移至採用更新設定的新節點,請按照下列步驟操作:

  1. 使用新名稱和更新後的設定建立新的 ComputeClass。
  2. 更新工作負載規格中的節點選取器,參照新的 ComputeClass。
  3. 套用更新後的工作負載規格。叢集自動配置器會使用新設定佈建新節點,並最終縮減舊節點。
  4. 刪除舊的 ComputeClass 物件。

設定檔

如要使用設定檔編輯節點系統設定,您可以建立新的節點集區並套用所需設定,或更新現有節點集區的節點系統設定。

建立節點集區來編輯

如要透過建立節點集區來編輯節點系統設定,請按照下列步驟操作:

  1. 建立設定檔,並加入所需設定。
  2. 將設定新增至新的節點集區。
  3. 將工作負載遷移至新的節點集區。
  4. 刪除舊節點集區。

更新現有節點集區

如要就地變更現有節點集區的節點系統設定,請參閱「更新現有節點集區的節點系統設定」。

取得現有節點系統設定

如要擷取節點集區現有的節點系統設定 (例如您已自訂設定,並想新增設定),請使用 gcloud container node-pools describe 指令。指令輸出內容會列出 kubeletConfig 和 linuxNodeConfig 下的所有現有設定。

舉例來說,請參閱下列程式碼片段,瞭解 describe 指令的輸出格式:

  kubeletConfig:
    allowedUnsafeSysctls:
    - kernel.shm*
    - kernel.msg*
    - kernel.sem
    - fs.mqueue.*
    - net.*
    cpuManagerPolicy: static
    insecureKubeletReadonlyPortEnabled: false
    maxParallelImagePulls: 2
  linuxNodeConfig: # IMPORTANT: Use linuxConfig when updating these settings
    sysctl:
      net.core.somaxconn: '2048'
      net.ipv4.tcp_rmem: 4096 87380 6291456

如果您尚未設定節點系統,輸出內容就不會列出 kubeletConfig 或 linuxNodeConfig。

重設現有的節點系統設定

如要將節點系統設定重設為預設值,請更新設定檔,將 kubelet 和 sysctl 欄位的值留空,例如:

```yaml
kubeletConfig: {}
linuxConfig:
  sysctl: {}
```

刪除節點系統設定

如要移除節點系統設定,請根據您使用的是 ComputeClasses 還是設定檔,按照下列步驟操作。

ComputeClass

如要移除自訂節點系統設定,請按照下列步驟操作:

  1. 從工作負載規格中移除 cloud.google.com/compute-class 節點選取器。
  2. 套用更新後的工作負載規格。GKE 會在預設節點上重新建立工作負載。叢集自動配置器最終會縮減資源,並刪除為 ComputeClass 佈建的節點。
  3. 從叢集刪除 ComputeClass 物件:

    kubectl delete computeclass CUSTOM_COMPUTE_CLASS_NAME
    

設定檔

如要移除使用設定檔套用的節點系統設定,請按照下列步驟操作:

  1. 建立新的節點集區,但不使用設定檔。
  2. 將工作負載遷移至新的節點集區。
  3. 刪除具有舊節點系統設定的節點集區。

kubelet 的設定選項

本節表格說明可修改的 kubelet 選項。

CPU 管理

下表說明 kubelet 的 CPU 管理選項。

kubelet 項設定 限制 預設設定 說明
cpuCFSQuota 必須是 true 或 false。 true 這項設定會強制執行 Pod 的 CPU 限制。如果將這個值設為 false,系統會忽略 Pod 的 CPU 限制。

在某些 Pod 對 CPU 限制較敏感的情況下,忽略 CPU 限制可能會有幫助。停用 cpuCFSQuota 的風險在於,惡意 Pod 可能會耗用超過預期的 CPU 資源。
cpuCFSQuotaPeriod 必須是時間長度。 "100ms" 這項設定會設定 CPU CFS 配額週期值 cpu.cfs_period_us,指定 cgroup 存取 CPU 資源的重新分配頻率。這個選項可讓您調整 CPU 節流行為。
reservedSystemCPUs (預先發布版) 必須是要保留的特定 CPU 核心清單 (例如 0-1 或 0,1,用於保留核心 0 和 1)。由於核心是以零為索引,因此值必須小於機型的 vCPU 數量。 none

明確保留特定 CPU 核心,用於主機系統服務,例如 OS Daemon 和 kubelet 服務。根據預設,這些服務可以在任何 CPU 核心上執行,這可能會導致 CPU 敏感工作負載發生效能問題。雖然 cpuManagerPolicy: static 設定會將專用核心指派給具有整數 CPU 要求的 Guaranteed Pod,但不會阻止主機系統服務使用這些核心。新增 reservedSystemCPUs 設定後,主機系統服務會限制在專屬核心中,不會干擾工作負載的專屬核心。為執行這項工作,GKE 會在節點啟動時,自動將 system.slice cgroup 固定至保留的核心。

預留系統 CPU 會減少節點的整體可分配容量。雖然 Burstable 和 BestEffort Pod 仍可在這些保留的核心上執行,但其 CPU 要求 (包括 GKE DaemonSet 的部分要求) 仍會計入節點的可分配容量。由於專屬 Guaranteed 工作負載需要整個核心,因此即使是少量的部分要求,也會減少可用的專屬核心數量。

請務必在 reservedSystemCPUs 中預留足夠的 CPU 核心。如果保留的核心太少,主機系統 Daemon 和 OS 程序可能會在高負載下受到 CPU 限制,導致不穩定或網路封包遺失。

記憶體管理和淘汰機制

下表說明記憶體管理和淘汰的可修改選項。本節也包含另一個表格,說明 evictionSoft 旗標的可修改選項。

kubelet 項設定 限制 預設設定 說明
evictionSoft 信號名稱對應。如需值限制,請參閱下表。 none 這項設定會將信號名稱對應至定義軟性淘汰門檻的數量或百分比。軟性淘汰門檻必須有寬限期。kubelet 會等到寬限期結束後,才剔除 Pod。
evictionSoftGracePeriod 信號名稱對應。每個信號名稱的值都必須是正數,且小於 5m。有效時間單位為 ns、us (或 µs)、ms、s 或 m。 none 這項設定會將信號名稱對應至時間長度,定義軟性淘汰門檻的寬限期。每個軟性淘汰門檻都必須有對應的寬限期。
evictionMinimumReclaim 信號名稱對應。每個信號名稱的值都必須是小於 10% 的正百分比。 none 這項設定會將信號名稱對應至百分比,定義 kubelet 執行 Pod 淘汰作業時,回收特定資源的最低數量。
evictionMaxPodGracePeriodSeconds 值必須是介於 0 和 300 之間的整數。 0 這項設定定義了 Pod 在遭到淘汰時,終止作業的寬限期上限 (以秒為單位)。
singleProcessOOMKill 值必須為 true 或 false。 cgroupv1 節點為 true,cgroupv2 節點為 false。 這項設定會決定容器中的程序是否會個別或以群組形式終止。

適用於 GKE 1.32.4-gke.1132000、1.33.0-gke.1748000 以上版本。

下表列出 evictionSoft 旗標的可修改選項。相同的選項也適用於 evictionSoftGracePeriod 和 evictionMinimumReclaim 旗標,但限制不同。

kubelet 項設定 限制 預設設定 說明
memoryAvailable 值必須大於 100Mi,且小於節點記憶體的 50%。 none 這項設定代表軟性淘汰前可用的記憶體容量。定義 kubelet 中 memory.available 訊號的量。
nodefsAvailable 值必須介於 10% 至 50% 之間 none 這項設定代表軟性淘汰前可用的 nodefs。定義 kubelet 中 nodefs.available 訊號的數量。
nodefsInodesFree 值必須介於 5% 至 50% 之間 none 這項設定代表軟性淘汰前可用的 nodefs inode。定義 kubelet 中 nodefs.inodesFree 訊號的量。
imagefsAvailable 值必須介於 15% 至 50% 之間 none 這項設定代表軟性淘汰前可用的 imagefs。定義 kubelet 中的 imagefs.available 訊號量。
imagefsInodesFree 值必須介於 5% 至 50% 之間 none 這項設定代表軟性淘汰前可用的 imagefs inode。定義 kubelet 中 imagefs.inodesFree 訊號的量。
pidAvailable 值必須介於 10% 至 50% 之間 none 這項設定代表軟性淘汰前可用的 PID。定義 kubelet 中 pid.available 訊號的量。

PID 管理

下表說明 PID 管理的可修改選項。

kubelet 項設定 限制 預設設定 說明
podPidsLimit 值必須介於 1024 至 4194304 之間 none 這項設定會指定每個 Pod 可使用的程序 ID (PID) 數量上限。

記錄

下表說明可修改的記錄選項。

kubelet 項設定 限制 預設設定 說明
containerLogMaxSize 值必須是正數,且單位後置字串須介於 10Mi 和 500Mi 之間 (含)。 10Mi 這項設定可控管容器記錄輪替政策的 containerLogMaxSize 設定,讓您設定各個記錄檔的大小上限。預設值為 10Mi。有效單位為 Ki、Mi 和 Gi。
containerLogMaxFiles 值必須是介於 2 和 10 之間的整數 (含 和 )。 5 這項設定可控管容器記錄檔輪替政策的 containerLogMaxFiles 設定,讓您分別設定每個容器允許的檔案數量上限。預設值為 5。每個容器的記錄總大小 (container_log_max_size*container_log_max_files) 不得超過節點總儲存空間的 1%。

映像檔垃圾收集

下表說明映像檔垃圾收集的可修改選項。

kubelet 項設定 限制 預設設定 說明
imageGcHighThresholdPercent 值必須是介於 10 和 85 之間的整數 (含 10 和 85),且大於 imageGcLowThresholdPercent。 85 這項設定會定義磁碟用量百分比,超過這個百分比就會執行映像檔垃圾收集。代表垃圾收集的磁碟用量上限。計算百分比時,系統會將這個欄位的值除以 100。
imageGcLowThresholdPercent 值必須是介於 10 至 85 之間 (含) 的整數,且小於 imageGcHighThresholdPercent。 80 這項設定定義了磁碟用量百分比,低於這個百分比時,系統不會執行映像檔垃圾收集作業。這代表垃圾收集作業的磁碟用量下限。計算百分比時,系統會將這個欄位的值除以 100。
imageMinimumGcAge 值必須是時間長度,且不得大於 2m。有效時間單位為 ns、us (或 µs)、ms、s、m 或 h。 2m 這項設定會定義未使用映像檔的最低存在時間,超過這個時間就會進行垃圾收集。
imageMaximumGcAge 值必須是時間長度。 0s

這項設定定義了圖片在垃圾收集前,可閒置的最長時間。這個欄位的預設值為 0s,會停用這個欄位。因此,系統不會因映像檔未使用而進行垃圾收集。指定這個值時,必須大於 imageMinimumGcAge 欄位的值。

適用於 GKE 1.30.7-gke.1076000、1.31.3-gke.1023000 以上版本。

提取映像檔

下表說明可修改的映像檔提取選項。

kubelet 項設定 限制 預設設定 說明
maxParallelImagePulls 值必須是介於 2 和 5 之間的整數 (含首尾)。 2 或 3 (視磁碟類型而定)。 這項設定定義了同時提取的映像檔數量上限。預設值取決於開機磁碟類型。

安全性與不安全的操作

下表說明設定安全性和處理不安全作業時,可修改的選項。

kubelet 項設定 限制 預設設定 說明
allowedUnsafeSysctls

sysctl 名稱或群組清單。允許的 sysctl 群組如下:

  • kernel.shm*
  • kernel.msg*
  • kernel.sem
  • fs.mqueue.*
  • net.*。
none 這項設定會定義不安全 sysctl 名稱或 sysctl 群組的許可清單 (以半形逗號分隔),可對 Pod 進行設定。
insecureKubeletReadonlyPortEnabled 值必須是布林值,可以是 true 或 false。 false 這項設定會停用叢集中每個新節點集區的不安全 kubelet 唯讀通訊埠 10255。如果您在這個檔案中設定這項設定,就無法使用 GKE API 用戶端在叢集層級變更設定。

資源管理員

Kubernetes 提供一套資源管理工具。您可以設定這些 Resource Manager,為 Pod 協調及最佳化節點資源的配置,並為 Pod 設定 CPU、裝置和記憶體 (hugepages) 資源的特定需求。

下表說明 Resource Manager 的可修改選項。

kubelet 項設定 限制 預設設定 說明
cpuManagerPolicy 值必須為 none 或 static。 none 這項設定可控管 kubelet CPU 管理工具政策。預設值為 none,這是預設的 CPU 親和性配置,除了 OS 排程器自動執行的操作外,不提供任何親和性。

如果將這個值設為 static,則可為 Guaranteed QoS 類別中且具有整數 CPU 要求的 Pod 指派專屬 CPU。
memoryManager.policy 值必須為 None 或 Static。 None

這項設定會控管 kubelet 記憶體管理工具政策。如果使用預設值 None,Kubernetes 的運作方式會與沒有記憶體管理工具時相同。

如果將這個值設為 Static,記憶體管理工具政策會根據 Pod 類型傳送拓撲提示。詳情請參閱「靜態政策」。

如果叢集的控制層搭載 GKE 1.32.3-gke.1785000 以上版本,則支援這項設定。

topologyManager

值必須是各個欄位支援的設定之一。

使用 Terraform 指示將設定新增至 Standard 節點集區時,無法設定 topologyManager 欄位。

  • policy:none
  • scope:container

這些設定會使用 policy 和 scope 子欄位,控管 kubelet Topology Manager 設定。拓撲管理員會協調一組元件,負責與 CPU 隔離、記憶體和裝置位置相關的效能最佳化作業。

您可以分別設定政策和範圍。如要進一步瞭解這些設定,請參閱「拓撲管理工具範圍和政策」。

下列 GKE 資源支援這項設定:

  • 叢集的控制層搭載 GKE 1.32.3-gke.1785000 以上版本。如果叢集的控制層和節點執行 1.33.0-gke.1712000 以上版本,Topology Manager 也會接收 GPU 拓撲的相關資訊。
  • 節點採用下列機型:A2、A3、A4、C3、C4、C4A、C4N、G2、G4、M3、N4

容器重新啟動延遲時間

這項設定可控制容器處於 CrashLoopBackOff 狀態時,重新啟動容器之間的最長等待時間。如果 Standard 節點集區執行 GKE 1.35 以上版本,則可調整這項設定。

下表說明 crashLoopBackOff 的可修改選項。

kubelet 項設定 限制 預設設定 說明
crashLoopBackOff.maxContainerRestartPeriod 值必須是正數,且不得超過 5 分鐘 (5m)。有效時間單位為 ns、us (或 µs)、ms、s 或 m。 none 容器重新啟動時,輪詢延遲時間可累積的最大值。重新啟動之間的延遲時間會從初始值開始,以指數方式增加,直到達到這個上限。Kubernetes 叢集的預設上限為 5 分鐘。詳情請參閱「可設定的容器重新啟動延遲時間」。

在 GKE 中安全終止 Spot VM

下表說明 GKE 中 Spot VM 終止和正常關機期間的可修改選項。如要使用這些選項,叢集的控制層必須執行 GKE 1.35.0-gke.1171000 以上版本。詳情請參閱「Spot VM 在 GKE 中的運作方式」。

kubelet 項設定 限制 預設設定 說明
shutdownGracePeriodSeconds 值必須是整數,代表時間長度 (以秒為單位)。允許的值:0、30 或 120。 30 指定節點延遲關機的總時間長度 (以秒為單位),以便安全終止 Pod。
shutdownGracePeriodCriticalPodsSeconds 值必須是介於 0 和 120 (含) 之間的整數,且必須小於 shutdownGracePeriodSeconds。必須一併設定 shutdownGracePeriodSeconds 才會生效。 15 指定在節點關機期間,終止重要 Pod 的時間長度 (以秒為單位)。

系統資源預留

如果 Standard 節點集區執行 Linux 和 GKE 1.37 以上版本,您可以自訂為系統元件保留的記憶體和 CPU 數量。這可讓您針對特定情境微調可分配容量,例如處理大量映像檔提取作業,或執行自訂節點 DaemonSet。如要進一步瞭解預設預留項目,請參閱「關於 GKE 節點大小」。

下表說明系統資源保留的可修改選項。

kubelet 項設定 限制 預設設定 說明
reservedResourcesConfig.memoryReservedMib 值須為整數。必須大於或等於節點集區 (建立時執行 1.37 以上版本) 的預設記憶體保留量,且小於節點總記憶體容量的 50%。 請參閱「記憶體預留項目」。 要為系統元件預留的記憶體量,以 MiB 為單位。
reservedResourcesConfig.cpuReservedMillicore 值須為整數。必須大於或等於節點集區的預設 CPU 預留量 (適用於 1.37 以上版本),且小於節點總 CPU 容量的 50%。 請參閱「CPU 預留項目」。 要為系統元件保留的 CPU 數量,以毫核心為單位。

確認有效預留項目

如要查看節點集區套用的有效預留項目,請檢查 effectiveMemoryReservedMib 和 effectiveCpuReservedMillicore 輸出欄位:

gcloud container node-pools describe POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --format="yaml(config.kubeletConfig.reservedResourcesConfig)"

Sysctl 設定選項

如要調整系統效能,可以修改 Linux 核心參數。本節中的表格說明您可以設定的各種核心參數。

檔案系統參數 (fs.*)

下表說明 Linux 檔案系統的可修改參數。這些設定可控管 Linux 檔案系統的行為,例如檔案處理限制和事件監控。

Sysctl 參數 限制 說明
fs.aio-max-nr 必須介於 [65536, 4194304]。 這項設定定義了整個系統的非同步 I/O 要求數量上限。
fs.file-max 必須介於 [104857, 67108864] 之間。 這項設定定義了 Linux 核心可分配的檔案控制代碼數量上限。
fs.inotify.max_user_instances 必須介於 [8192, 1048576]。 這項設定定義了使用者可建立的 inotify 執行個體數量上限。
fs.inotify.max_user_watches 必須介於 [8192, 1048576]。 這項設定定義了使用者可建立的 inotify 監控數量上限。
fs.nr_open 必須介於 [1048576, 2147483584] 之間。 這項設定定義了程序可開啟的檔案描述元數量上限。

核心參數 (kernel.*)

下表說明 Linux 核心的可修改參數。這些設定會設定核心功能,包括共用記憶體配置。

Sysctl 參數 限制 說明
kernel.shmmni 必須介於 [4096, 32768] 之間。 這項設定會定義全系統的共用記憶體區段數量上限。如未設定,則預設值為 4096。
kernel.shmmax 必須介於 [0, 18446744073692774399] 之間。 這項設定會定義核心允許的單一共用記憶體區段大小上限 (以位元組為單位)。如果這個值大於實際 RAM 容量,系統會忽略這個值,也就是說,所有可用的 RAM 都可以共用。
kernel.shmall 必須介於 [0, 18446744073692774399] 之間。 這項設定定義了系統一次可使用的共用記憶體頁面總量。在 AMD64 和 Intel 64 架構中,一個頁面為 4,096 位元組。
kernel.perf_event_paranoid 必須介於 [-1, 3] 之間。 這項設定可控管不具備 CAP_PERFMON 的非特殊權限使用者,是否能使用效能事件系統。核心中的預設值為 2。
kernel.sched_rt_runtime_us 必須介於 [-1, 1000000] 之間。 這項設定會定義即時排程可使用的時間全域限制。
kernel.softlockup_panic 選用 (布林值)。 這項設定可控制偵測到軟鎖定時,核心是否會發生錯誤。
kernel.yama.ptrace_scope 必須介於 [0, 3] 之間。

這項設定會定義 ptrace() 系統呼叫的範圍和限制,影響程序偵錯和追蹤。支援的值包括:

  • 0:傳統 ptrace 權限。
  • 1:受限制的 ptrace,這是許多發行版本的預設值。僅限子項程序或 CAP_SYS_PTRACE。
  • 2:僅限管理員的 ptrace。只有具備 CAP_SYS_PTRACE 的程序。
  • 3:沒有 ptrace。不允許 ptrace 呼叫。
kernel.kptr_restrict 必須介於 [0, 2] 之間。 這項設定會指出是否限制透過 /proc 和其他介面公開核心位址。
kernel.dmesg_restrict 選用 (布林值)。 這項設定會指出是否要禁止無權限的使用者透過 dmesg(8) 查看核心記錄緩衝區中的訊息。
kernel.sysrq 必須介於 [0, 511] 之間。

這項設定可控管允許透過 SysRq 鍵叫用的函式。可能的值如下:

  • 0:完全停用 sysrq。
  • 1:啟用所有 sysrq 函式。
  • >1:允許的 sysrq 函式位元遮罩。詳情請參閱「Linux Magic System Request Key Hacks」(Linux Magic System Request 按鍵技巧)。
kernel.keys.maxbytes 必須介於 [20000, 2097152] 之間。 這項設定定義了非根使用者在所有金鑰的酬載部分中,最多可保留的位元組數。
kernel.keys.maxkeys 必須介於 [200, 1048576] 之間。 這項設定定義了非根使用者可擁有的金鑰數量上限。

網路參數 (net.*)

下表說明可修改的網路參數。這些設定會調整網路堆疊的效能和行為,從通訊端緩衝區到連線追蹤。

Sysctl 參數 限制 說明
net.core.busy_poll 小於 2147483647 的任何正整數。 這項設定會定義輪詢和選取時,低延遲忙碌輪詢的逾時時間。代表忙碌迴圈等待事件的大約時間 (以微秒為單位)。
net.core.busy_read 小於 2147483647 的任何正整數。 這項設定會定義通訊端讀取的低延遲忙碌輪詢逾時。代表在裝置佇列中等待封包的忙碌迴圈大約時間 (以微秒為單位)。
net.core.netdev_max_backlog 小於 2147483647 的任何正整數。 這項設定定義了當介面接收封包的速度快於核心處理速度時,在 INPUT 端排隊的封包數量上限。
net.core.rmem_default 小於 2147483647 的任何正整數。 這項設定定義了預設接收通訊端緩衝區空間,以位元組為單位。
net.core.rmem_max 小於 2147483647 的任何正整數。 這項設定會定義接收通訊端緩衝區空間大小上限 (以位元組為單位)。
net.core.wmem_default 小於 2147483647 的任何正整數。 這項設定會定義通訊端傳送緩衝區的預設設定 (以位元組為單位)。
net.core.wmem_max 小於 2147483647 的任何正整數。 這項設定會定義傳送通訊端緩衝區空間大小上限 (以位元組為單位)。
net.core.optmem_max 小於 2147483647 的任何正整數。 這項設定定義了每個通訊端允許的輔助緩衝區空間上限。
net.core.somaxconn 必須介於 [128, 2147483647]。 這項設定會定義 socket listen() 待處理工作的限制,在使用者空間中稱為 SOMAXCONN。這項設定預設為 128。
net.ipv4.tcp_rmem {min, default, max} (每個值都必須 > 0,記憶體單位為位元組)。 這項設定會定義 UDP 通訊端適度使用的接收緩衝區大小下限 (以位元組為單位)。預設設定為 1 頁。
net.ipv4.tcp_wmem {min, default, max} (每個值都必須 > 0,記憶體單位為位元組)。 這項設定會定義 UDP 通訊端在適度使用時,所用傳送緩衝區的大小下限 (以位元組為單位)。預設設定為 1 頁。
net.ipv4.tcp_tw_reuse 必須介於 {0, 1} 之間。 這項設定定義是否允許在通訊協定安全的情況下,重複使用 TIME_WAIT 狀態的通訊端建立新連線。預設值為 0。
net.ipv4.tcp_max_orphans 必須介於 [16384, 262144] 之間。 這項設定會定義未附加至任何使用者檔案控制代碼的 TCP 通訊端數量上限。
net.ipv4.tcp_max_tw_buckets 必須介於 [4096, 2147483647] 之間。 這項設定定義了系統同時保留的 timewait 通訊端數量上限。如果超過這個數量,系統會立即刪除 time-wait 通訊端,並顯示警告。
net.ipv4.tcp_syn_retries 必須介於 [1, 127] 之間。 這項設定定義了嘗試建立 TCP 連線時,初始 SYN 的重新傳輸次數。
net.ipv4.tcp_ecn 必須介於 [0, 2] 之間。 這項設定可控制 TCP 是否使用明確擁塞通知 (ECN)。只有在 TCP 連線的兩端都表示支援 ECN 時,才會使用 ECN。
net.ipv4.tcp_mtu_probing 必須介於 [0, 2] 之間。

這項設定可控管 TCP 封包化層路徑 MTU 探索。支援的值如下:

  • 0:已停用。
  • 1:預設為停用,偵測到 ICMP 黑洞時會啟用。
  • 2:一律啟用。使用初始 MSS tcp_base_mss。
net.ipv4.tcp_congestion_control 必須是「說明」欄中支援的值。

如果叢集已啟用 GKE Dataplane V2,則不支援這項設定。

支援的值取決於圖片類型:

  • Container-Optimized OS:reno、cubic、bbr、lp、htcp (適用於 GKE 1.34.1-gke.3355001 以上版本)
  • Ubuntu:reno、cubic、bbr、lp、htcp、vegas、dctcp、bic、cdg、highspeed、hybla、illinois、nv、scalable、veno、westwood、yeah
net.ipv6.conf.all.disable_ipv6 布林值。 變更這個值,等同於將 conf/default/disable_ipv6 設定和所有個別介面的 disable_ipv6 設定變更為相同的值。
net.ipv6.conf.default.disable_ipv6 布林值。 這項設定會停用 IPv6 作業。
net.netfilter.nf_conntrack_acct 必須介於 {0, 1} 之間。 這項設定可啟用連線追蹤流程計費功能。預設值為 0,表示設定已停用。適用於 GKE 1.32.0-gke.1448000 以上版本。
net.netfilter.nf_conntrack_max 必須介於 [65536, 4194304]。 這項設定會定義連線追蹤表格的大小。如果達到上限,新連線就會失敗。適用於 GKE 1.32.0-gke.1448000 以上版本。
net.netfilter.nf_conntrack_buckets 必須介於 [65536, 524288] 之間。

這項設定會定義雜湊表的大小。建議設定是根據以下公式計算得出:nf_conntrack_max = nf_conntrack_buckets * 4。

適用於 GKE 1.32.0-gke.1448000 以上版本。

net.netfilter.nf_conntrack_tcp_timeout_close_wait 必須介於 [60, 3600] 之間。

這項設定定義了 TCP 連線可保持在 CLOSE_WAIT 狀態的時間長度 (以秒為單位)。預設值為 3600。

適用於 GKE 1.32.0-gke.1448000 以上版本。

net.netfilter.nf_conntrack_tcp_timeout_established 必須介於 [600, 86400] 之間。

這項設定定義了無效連線的持續時間 (以秒為單位),超過這個時間後,系統會自動從連線追蹤表格中刪除這些連線。

適用於 GKE 1.32.0-gke.1448000 以上版本。

net.netfilter.nf_conntrack_tcp_timeout_time_wait 必須介於 [1, 600] 之間。

這項設定定義了 TCP 連線可保持在 TIME_WAIT 狀態的時間長度 (以秒為單位)。預設值為 120。

適用於 GKE 1.32.0-gke.1448000 以上版本。

net.ipv4.neigh.default.gc_thresh1 必須介於 [0, 262144] 之間。 這項設定定義了 ARP 快取中應保留的項目數量下限。如果項目數量低於這項設定,垃圾收集器就不會執行。如果將這個值設為 0,可能會導致快取顛簸和效能降低。
net.ipv4.neigh.default.gc_thresh2 必須介於 [512, 524288]。 這項設定定義了 ARP 快取中保留的項目數量軟上限。垃圾收集器允許項目數量超過這個值 5 秒,然後才會開始軟垃圾收集。
net.ipv4.neigh.default.gc_thresh3 必須介於 [1024, 1048576] 之間。 這項設定會定義 ARP 快取中保留的項目數量上限。如果項目數量超過這項設定,垃圾收集器一律會執行。

虛擬記憶體參數 (vm.*)

下表說明虛擬記憶體子系統的可修改參數。這些設定會管理虛擬記憶體子系統,控制核心如何處理記憶體、交換和磁碟快取。

sysctl 參數 限制 說明
vm.max_map_count 必須介於 [65536, 2147483647] 之間。 這個檔案定義了程序可擁有的記憶體對應區域數量上限。
vm.dirty_background_ratio 必須介於 [1, 100] 之間。 這項設定定義了系統記憶體可填入髒頁的百分比,超過這個百分比後,背景核心清除器執行緒就會開始寫回。這個值必須小於「vm.dirty_ratio」欄位的值。
vm.dirty_background_bytes 必須介於 [0, 68719476736]。

這項設定定義了背景核心清除器執行緒開始寫回時的髒記憶體量。

請注意,vm.dirty_background_bytes 是 vm.dirty_background_ratio 的對應項目。只能指定其中一項設定。

vm.dirty_expire_centisecs 必須介於 [0, 6000] 之間。 這項設定定義了品質不佳的資料在記憶體中保留的時間長度上限 (以百分之一秒為單位),超過這個時間後,核心清除器執行緒就會將資料寫入磁碟。
vm.dirty_ratio 必須介於 [1, 100] 之間。 這項設定定義了系統記憶體可填入髒頁的百分比,超過這個百分比後,執行寫入作業的程序就會強制封鎖,並同步寫出品質不佳的資料 (dirty data)。
vm.dirty_bytes 必須介於 [0, 68719476736]。

這項設定定義了髒記憶體量,當產生磁碟寫入的程序達到這個量時,就會開始自行回寫。vm.dirty_bytes 的最小值為兩個頁面 (以位元組為單位)。系統會忽略低於這個限制的值,並保留舊設定。

請注意,vm.dirty_bytes 是 vm.dirty_ratio 的對應項目。只能指定其中一項設定。

vm.dirty_writeback_centisecs 必須介於 [0, 1000] 之間。 這項設定定義了核心清除執行緒喚醒並將舊的品質不佳資料寫入磁碟的時間間隔,以百分之一秒為單位。
vm.overcommit_memory 必須介於 {0, 1, 2} 之間。

這項設定會決定核心處理記憶體超額承諾的策略。值如下:

  • 0:拒絕大型分配
  • 1:一律允許 (預設值)
  • 2:防止提交超過交換空間 + RAM 比率

記憶體小於 15 GB 的機器不支援這項設定。

vm.overcommit_ratio 必須介於 [0, 100] 之間。 如果 vm.overcommit_memory 欄位的值設為 2,這項設定會定義允許超額使用的實體 RAM 百分比。
vm.vfs_cache_pressure 必須介於 [0, 100] 之間。 這項設定會調整核心的偏好設定,回收用於 dentry (目錄) 和 inode 快取的記憶體。
vm.swappiness 必須介於 [0, 200] 之間。 這項設定可控管核心將程序移出實體記憶體並移至交換磁碟的傾向。預設值為 60。
vm.watermark_scale_factor 必須介於 [10, 3000] 之間。 這項設定可控制 kswapd 的積極程度。這項設定會定義 kswapd 喚醒前剩餘的記憶體,以及休眠前要釋出的記憶體。預設值為 10。
vm.min_free_kbytes 必須介於 [67584, 1048576] 之間。 這項設定會定義 OOM 前的可用記憶體下限。預設值為 67584。

如要進一步瞭解各 sysctl 旗標支援的值,請參閱 --system-config-from-file gcloud CLI 說明文件。

不同的 Linux 命名空間可能會有特定 sysctl 旗標的不重複值,但其他旗標可能適用於整個節點。使用節點系統設定更新 sysctl 選項,有助於確保 sysctl 全域套用至節點和每個命名空間,讓每個 Pod 在每個 Linux 命名空間中都有相同的 sysctl 值。

Linux cgroup 模式設定選項

容器執行階段和 kubelet 會使用 Linux 核心 cgroup 進行資源管理,例如限制 Pod 中每個容器可存取的 CPU 或記憶體量。核心中有兩個版本的 cgroup 子系統:cgroupv1 和 cgroupv2。Kubernetes 對 cgroupv2 的支援在 Kubernetes 1.18 版中為 Alpha 版,在 1.22 版中為 Beta 版,在 1.25 版中為正式發布版。詳情請參閱 Kubernetes cgroups v2 說明文件。

節點系統設定可讓您自訂節點集區的 cgroup 設定。您可以使用 cgroupv1 或 cgroupv2。GKE 會針對執行 1.26 以上版本的新 Standard 節點集區使用 cgroupv2,並針對執行 1.26 以下版本的節點集區使用 cgroupv1。如果節點集區是透過自動佈建節點功能建立,cgroup 設定會取決於初始叢集版本,而非節點集區版本。Arm 機器不支援 cgroupv1。

您可以使用節點系統設定,明確變更節點集區的設定,改用 cgroupv1 或 cgroupv2。如果現有節點集區使用 cgroupv1,升級至 1.26 版後,設定不會變更為 cgroupv2。如果現有節點集區執行的版本早於 1.26,且不含自訂 cgroup 設定,則會繼續使用 cgroupv1。如要變更設定,您必須為現有節點集區明確指定 cgroupv2。

舉例來說,如要將節點集區設為使用 cgroupv2,請使用節點系統設定檔,例如:

linuxConfig:
  cgroupMode: 'CGROUP_MODE_V2'

支援的 cgroupMode 選項如下:

  • CGROUP_MODE_V1:在節點集區上使用 cgroupv1。
  • CGROUP_MODE_V2:在節點集區上使用 cgroupv2。
  • CGROUP_MODE_UNSPECIFIED:使用預設的 GKE cgroup 設定。

如要使用 cgroupv2,請務必遵守下列規定和限制:

  • 如果節點集區執行的版本低於 1.26,則必須使用 gcloud CLI 408.0.0 以上版本。或者,您也可以使用 gcloud beta 395.0.0 以上版本。
  • 叢集和節點集區必須執行 GKE 1.24.2-gke.300 以上版本。
  • 您必須使用搭載 containerd 的 Container-Optimized OS,或搭載 containerd 的 Ubuntu 節點映像檔。
  • 如果您的工作負載需要讀取 cgroup 檔案系統 (/sys/fs/cgroup/...),請確保這些工作負載與 cgroupv2 API 相容。
  • 如果您使用任何監控或第三方工具,請確認這些工具與 cgroupv2 相容。
  • 如果您使用 Java 工作負載 (JDK),建議使用完全支援 cgroupv2 的版本,包括 JDK 8u372、JDK 11.0.16 以上版本,或 JDK 15 以上版本。

驗證 cgroup 設定

新增節點系統設定時,GKE 必須重新建立節點,才能套用變更。將設定新增至節點集區並重新建立節點後,即可驗證新設定。

您可以使用 gcloud CLI 或 kubectl 指令列工具,驗證節點集區中節點的 cgroup 設定:

gcloud CLI

檢查節點集區的 cgroup 設定:

gcloud container node-pools describe POOL_NAME \
  --format='value(Config.effectiveCgroupMode)'

將 POOL_NAME 替換為節點集區名稱。

可能輸出結果如下:

  • EFFECTIVE_CGROUP_MODE_V1:節點使用 cgroupv1
  • EFFECTIVE_CGROUP_MODE_V2:節點使用 cgroupv2

輸出內容只會顯示節點集區中的節點重新建立後,新的 cgroup 設定。Windows Server 節點集區不支援 cgroup,因此輸出內容為空白。

kubectl

如要使用 kubectl 驗證這個節點集區中節點的 cgroup 設定,請選取節點,並按照下列操作說明連線至該節點:

  1. 使用節點集區中的任何節點建立互動式殼層。在指令中,將 mynode 替換為節點集區中任何節點的名稱。
  2. 找出 Linux 節點上的 cgroup 版本。

Linux hugepages 設定選項

您可以使用手動預先分配的巨型頁面,或自動指派的透明巨型頁面。

預先分配的巨型頁面

您可以使用節點系統設定檔預先分配巨型分頁。Kubernetes 支援預先分配的巨型頁面做為資源類型,類似於 CPU 或記憶體。

如要使用巨型分頁,請遵守下列限制和規定:

  • 為確保節點不會完全被巨型分頁占用,分配的巨型分頁整體大小不得超過下列任一項:
    • 記憶體小於 30 GB 的機器:總記憶體的 60%。舉例來說,在記憶體為 8 GB 的 e2-standard-2 機器上,您無法為 hugepages 分配超過 4.8 GB 的記憶體。
    • 記憶體超過 30 GB 的機器:總記憶體的 80%。舉例來說,在記憶體為 32 GB 的 c4a-standard-8 機器上,hugepages 不得超過 25.6 GB。
  • 1 GB 巨型分頁僅適用於 A3、C2D、C3、C3D、C4、C4A、C4D、C4N、CT5E、CT5LP、CT6E、H3、M2、M3、M4、Z3 或 Z4D 機型。

下表說明 Linux 巨型頁面的可修改設定。

設定參數 限制 預設值 說明
hugepage_size2m 整數計數。須遵守上述記憶體配置限制。 0 這項設定會預先分配特定數量的 2 MB 巨型分頁。
hugepage_size1g 整數計數。須遵守上述記憶體和機型限制。 0 這項設定會預先分配特定數量的 1 GB hugepage。

透明巨型頁面 (THP)

您可以使用節點系統設定檔,啟用 Linux 核心的透明巨型頁面支援。有了 THP,核心會自動將 hugepage 指派給程序,不需手動預先分配。

下表說明 THP 的可修改參數。

設定參數 支援的值 預設值 說明
transparentHugepageEnabled
  • TRANSPARENT_HUGEPAGE_ENABLED_ALWAYS:整個系統已啟用透明巨型頁面。
  • TRANSPARENT_HUGEPAGE_ENABLED_MADVISE:在 MADV_HUGEPAGE 區域內啟用透明巨型頁面。這項設定是預設的核心設定。
  • TRANSPARENT_HUGEPAGE_ENABLED_NEVER:已停用透明巨型頁面。
  • TRANSPARENT_HUGEPAGE_ENABLED_UNSPECIFIED:預設值。GKE 不會修改核心設定。
UNSPECIFIED 這項設定可控制是否為匿名記憶體啟用 THP。
transparentHugepageDefrag
  • TRANSPARENT_HUGEPAGE_DEFRAG_ALWAYS:要求 THP 的應用程式在分配失敗時停滯,並直接回收頁面和壓縮記憶體,以便立即分配 THP。
  • TRANSPARENT_HUGEPAGE_DEFRAG_DEFER:應用程式在背景喚醒 kswapd 以回收頁面,並喚醒 kcompactd 以壓縮記憶體,以便在不久後使用 THP。khugepaged 則負責在稍後安裝 THP 頁面。
  • TRANSPARENT_HUGEPAGE_DEFRAG_DEFER_WITH_MADVISE:應用程式會照常進入直接回收和壓縮程序,但僅限於使用 madvise(MADV_HUGEPAGE) 的區域。所有其他區域都會在背景喚醒 kswapd 以回收頁面,並喚醒 kcompactd 以壓縮記憶體,以便在不久後提供 THP。
  • TRANSPARENT_HUGEPAGE_DEFRAG_MADVISE:應用程式會照常進入直接回收和壓縮程序,但僅限於使用 madvise(MADV_HUGEPAGE) 的區域。所有其他區域都會在背景喚醒 kswapd 以回收頁面,並喚醒 kcompactd 以壓縮記憶體,以便在不久後提供 THP。
  • TRANSPARENT_HUGEPAGE_DEFRAG_NEVER:應用程式一律不會進入直接回收或壓縮狀態。
  • TRANSPARENT_HUGEPAGE_DEFRAG_UNSPECIFIED:預設值。GKE 不會修改核心設定。
UNSPECIFIED 這項設定會定義 THP 的資料重組設定。

THP 適用於 GKE 1.33.2-gke.4655000 以上版本。在 GKE 1.33.2-gke.4655000 以上版本中,新的 TPU 節點集區預設也會啟用這項功能。將現有節點集區升級至支援的版本或更新版本時,系統不會啟用 THP。

Linux 精確時間同步處理選項

如果工作負載需要準確的時間同步,以及監控時間同步的準確度,您可以設定準確時間,使用 chrony 和 ptp_kvm 將 VM 的時鐘與主機時鐘同步。GKE 1.36.0-gke.3241000 以上版本支援精確時間同步功能。這項設定旨在讓支援的設定達到 1 毫秒內的準確度。如要進一步瞭解支援的機型、作業系統和可用區,請參閱「為 Compute Engine VM 設定準確時間」。

下表說明如何設定參數,以便與 GKE 準確同步時間:

設定參數 支援的值 預設值 說明
  • 設定檔:accurateTimeConfig.enablePtpKvmTimeSync
  • Terraform:accurate_time_config.enable_ptp_kvm_time_sync
true或false false 這項設定可確保時間同步準確。這項功能僅支援特定機型、作業系統和可用區。

啟用精確時間同步功能後,GKE 會收集並匯出下列資訊:

  • compute.googleapis.com/instance/clock_accuracy/ptp_kvm/nanosecond_accuracy 指標,表示 VM 主機時鐘與世界標準時間的準確度。
  • projects/PROJECT_ID/logs/chrony.tracking 記錄,其中包含 chrony 的追蹤記錄。這些記錄會提供系統時鐘的增益或損失率等資訊。

您可以使用這項資訊,在 Cloud Monitoring 中建立記錄指標和資訊主頁,分析時間同步處理的效能和可靠性。

舉例來說,下列 gke-clock-metric.json 設定定義了主機時鐘最大誤差的記錄指標:

{
  "name": "phc-clock-max-error",
  "description": "Maximum error of the VM clock from the host clock exposed by ptp_kvm",
  "filter": "resource.type=\"k8s_node\" AND log_id(\"chrony.tracking\")",
  "metricDescriptor": {
    "metricKind": "DELTA",
    "valueType": "DISTRIBUTION",
    "unit": "s",
    "labels": []
  },
  "valueExtractor": "REGEXP_EXTRACT(textPayload, \"^.*PHC0.* ([-\\\\d\\\\.eE]+)$\")",
  "bucketOptions": {
    "explicitBuckets": {
      "bounds": [
        0.0, 5.0E-7, 1.0E-6, 2.0E-6, 4.0E-6, 5.0E-6, 8.0E-6, 1.0E-5, 2.0E-5,
        1.0E-4, 0.001, 0.01, 0.1, 1.0
      ]
    }
  }
}

下列 gke-metrics-dashboard.json 設定定義了 Monitoring 資訊主頁,可匯總記錄指標和世界標準時間準確度指標的錯誤資料:

{
  "displayName": "Overall Clock Accuracy",
  "dashboardFilters": [],
  "labels": {},
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "width": 28,
        "height": 28,
        "widget": {
          "xyChart": {
            "dataSets": [
              {
                "plotType": "LINE",
                "targetAxis": "Y1",
                "timeSeriesQuery": {
                  "prometheusQuery": "(\n  histogram_quantile(1, sum by (le, node_name) (\n    increase(logging_googleapis_com:user_phc_clock_max_error_bucket{monitored_resource=\"k8s_node\"}[1m])\n  )) * 1000000000\n)\n+ on(node_name) group_left()\nlabel_replace(\n  compute_googleapis_com:instance_clock_accuracy_ptp_kvm_nanosecond_accuracy{monitored_resource=\"gce_instance\"},\n  \"node_name\", \"$1\", \"instance_name\", \"(.*)\"\n)\n",
                  "unitOverride": "ns"
                }
              }
            ],
            "chartOptions": {
              "displayHorizontal": false,
              "mode": "COLOR"
            },
            "thresholds": [],
            "yAxis": {
              "label": "Clock Accuracy",
              "scale": "LINEAR"
            }
          }
        }
      }
    ]
  }
}

Linux VFIO 設定選項

下表說明在節點上設定 VFIO (虛擬函式 I/O) 的參數。VFIO 可讓安全、無特殊權限的使用者空間驅動程式存取 I/O 裝置。

設定參數 限制 預設值 說明
nodeVfioConfig.dmaEntryLimit 必須是介於 65535 和 4194304 之間的整數。 65535 指定 VFIO IOMMU 類型 1 驅動程式可為容器對應的 DMA 項目 (頁面) 數量上限。這項限制會影響可固定的主機記憶體總量,以便直接存取裝置,這對 TPU 和 GPU 等高效能裝置通常至關重要。這項設定對應至下列核心參數:/sys/module/vfio_iommu_type1/parameters/dma_entry_limit。如果工作負載對應大型記憶體區域,可能需要較高的值。

適用於 GKE 1.36.0-gke.3009000 以上版本。

Linux 磁碟 I/O 排程器設定選項

下表說明為節點集區設定磁碟 I/O 排程器的參數。

設定參數 支援的值 預設值 說明
diskIoScheduler.nodeSystemIoScheduler mq-deadline、bfq、kyber、none bfq:Container-Optimized OS 映像檔;none:Ubuntu 映像檔 為執行節點系統工作負載的開機磁碟或臨時本機 SSD 設定 I/O 排程器。

適用於 GKE 1.36.0-gke.3009000 以上版本。
diskIoScheduler.nodeAttachedDiskIoScheduler mq-deadline、bfq、kyber、none none 設定連接磁碟的 I/O 排程器。

適用於 GKE 1.36.0-gke.3009000 以上版本。

後續步驟