自訂節點系統設定

本文說明如何使用稱為「節點系統設定」的設定檔,自訂 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 模式和 Standard 模式下使用 ComputeClass。詳情請參閱「自訂節點系統設定」。
  • DaemonSets:您也可以使用 DaemonSet 自訂節點。詳情請參閱「使用 DaemonSet 自動啟動 GKE 節點」。

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

事前準備

開始之前,請務必完成下列步驟:

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

在 GKE Standard 模式中使用節點系統設定

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

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

  1. 建立設定檔。這個檔案包含 kubeletsysctl 設定。
  2. 您可以在建立叢集時新增設定,也可以在建立或更新節點集區時新增設定。

建立設定檔

以 YAML 格式編寫節點系統設定。以下範例會為 kubeletsysctl 選項新增設定:

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 個位元組。

如要只為 kubeletsysctl 新增設定,請只在節點系統設定中加入該區段。舉例來說,如要新增 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:包含 kubeletsysctl 設定的檔案路徑

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

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,請參閱「GKE 的 Terraform 支援」。

使用節點系統設定建立新的節點集區

使用 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:包含 kubeletsysctl 設定的檔案路徑

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,請參閱「GKE 的 Terraform 支援」。

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

如要更新現有節點集區的節點系統設定,請執行下列指令:

   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:包含 kubeletsysctl 設定的檔案路徑

這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要進一步瞭解這項特定變更,請在手動變更資料表中找到對應的資料列,這些變更會使用節點升級策略重新建立節點,而不遵守維護政策。

如要進一步瞭解節點更新,請參閱規劃節點更新中斷情形

編輯節點系統設定

如要編輯節點系統設定,您可以建立具有所需設定的新節點集區,或是更新現有節點集區的節點系統設定。

建立節點集區以進行編輯

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

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

透過更新現有節點集區進行編輯

如要編輯現有節點集區的節點系統設定,請按照「更新節點集區」分頁中的操作說明,將設定新增至節點集區。更新節點系統設定時,如果新設定會覆寫節點集區現有的系統設定,就必須重新建立節點。如果在更新期間省略任何參數,系統會將參數設為各自的預設值。

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

kubeletConfig: {}
linuxConfig:
  sysctl: {}

刪除節點系統設定

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

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

kubelet」的設定選項

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

CPU 管理

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

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

在某些情況下,Pod 對 CPU 限制很敏感,忽略 CPU 限制可能會有好處。停用 cpuCFSQuota 的風險在於,惡意 Pod 可能會耗用超出預期的 CPU 資源。
cpuCFSQuotaPeriod 必須是時間長度。 "100ms" 這項設定會設定 CPU CFS 配額週期值 cpu.cfs_period_us,指定重新分配 cgroup CPU 資源存取權的週期。這個選項可讓您調整 CPU 節流行為。

記憶體管理和逐出機制

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

kubelet 設定 限制 預設設定 說明
evictionSoft 信號名稱對應。如需值限制,請參閱下表。 none 這項設定會將信號名稱對應至數量或百分比,定義軟性逐出門檻。軟性驅逐門檻必須有寬限期。kubelet 不會驅逐 Pod,直到超過寬限期為止。
evictionSoftGracePeriod 信號名稱對應。每個信號名稱的值都必須是小於 5m 的正數時間長度。有效時間單位為 nsus (或 µs)、mssm none 這項設定會將信號名稱對應至時間長度,定義軟性逐出門檻的寬限期。每個軟性驅逐門檻都必須有對應的寬限期。
evictionMinimumReclaim 信號名稱對應。每個信號名稱的值都必須是小於 10% 的正百分比。 none 這項設定會將信號名稱對應至百分比,定義 kubelet 執行 Pod 驅逐作業時,可回收特定資源的最低量。
evictionMaxPodGracePeriodSeconds 值必須是介於 0300 之間的整數。 0 這項設定定義了 Pod 在驅逐期間終止的正常終止時間上限 (以秒為單位)。

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

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 信號量。
singleProcessOOMKill 值必須為 truefalse 如果是 cgroupv1 節點,請使用 true;如果是 cgroupv2 節點,請使用 false 這項設定會決定容器中的程序是個別 OOMkill,還是以群組形式 OOMkill。

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

PID 管理

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

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

記錄

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

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

圖片垃圾收集

下表說明圖片垃圾收集的可修改選項。

kubelet 設定 限制 預設設定 說明
imageGCHighThresholdPercent 值必須是介於 10 到 85 之間的整數 (含 10 和 85),且大於 imageGcLowThresholdPercent 85 這項設定會定義磁碟使用率百分比,超過這個值就會執行映像檔垃圾收集作業。這是指垃圾收集作業可達到的最高磁碟使用量。百分比的計算方式是將這個欄位的值除以 100。
imageGCLowThresholdPercent 值必須是介於 10 到 85 之間的整數 (含 10 和 85),且小於 imageGcHighThresholdPercent 80 這項設定會定義磁碟用量百分比,如果未達到這個百分比,系統就不會執行映像檔垃圾收集作業。這代表垃圾收集作業的最低磁碟用量。百分比的計算方式是將這個欄位的值除以 100。
imageMinimumGcAge 值必須是時間長度,且不得大於 2m。有效時間單位為 nsus (或 µs)、mssmh 2m 這項設定會定義未使用的圖片在垃圾收集前,必須經過的最短時間。
imageMaximumGcAge 值必須是時間長度。 0s

這項設定定義圖片未使用的最長時間,超過這個時間就會進行垃圾收集。這個欄位的預設值為 0s,會停用這個欄位。因此,系統不會根據圖片是否未使用而進行垃圾收集。指定這個值時,必須大於 imageMinimumGcAge 欄位的值。

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

提取映像檔

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

kubelet 設定 限制 預設設定 說明
maxParallelImagePulls 值必須是介於 2 和 5 之間的整數 (含首尾)。 23,視磁碟類型而定。 這項設定定義了平行提取圖片的最大數量。預設值取決於開機磁碟類型。

安全和不安全的作業

下表說明可修改的選項,用於設定安全性及處理不安全的操作。

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

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

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

資源管理員

Kubernetes 提供一系列資源管理工具。您可以設定這些資源管理工具,協調及最佳化節點資源的對齊方式,以滿足 Pod 對 CPU、裝置和記憶體 (巨頁) 資源的特定需求。

下表說明資源管理員可修改的選項。

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

將這個值設為 static,可讓屬於 Guaranteed QoS 類別且具有整數 CPU 要求的 Pod 專用 CPU。
memoryManager.policy 值必須為 NoneStatic None

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

如果將這個值設為 Static,Memory Manager 政策會傳送取決於 Pod 類型的拓撲提示。詳情請參閱靜態政策

這項設定適用於控制層執行 GKE 1.32.3-gke.1785000 以上版本的叢集。

topologyManager

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

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

  • policynone
  • scopecontainer

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

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

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

  • 控制層執行 GKE 1.32.3-gke.1785000 以上版本的叢集。如果叢集的控制層和節點執行 1.33.0-gke.1712000 以上版本,拓撲管理工具也會收到 GPU 拓撲資訊。
  • 節點的機型如下:A2、A3、A4、C3、C4、C4A、G2、G4、M3、N4

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 鍵叫用的函式。可能的值如下:

網路參數 (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 Socket 所用傳送緩衝區的最小大小 (以位元組為單位)。預設值為 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 通訊端數量上限。如果超過這個數字,系統會立即毀損等待時間的通訊端,並列印警告。
net.ipv4.tcp_syn_retries 必須介於 [1, 127] 之間。 這項設定會定義主動 TCP 連線嘗試的初始 SYN 重新傳輸次數。
net.ipv4.tcp_ecn 必須介於 [0, 2] 之間。 這項設定可控管 TCP 是否使用明確擁塞通知 (ECN)。只有在 TCP 連線的兩端都表示支援 ECN 時,系統才會使用這項功能。
net.ipv4.tcp_mtu_probing 必須介於 [0, 2] 之間。

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

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

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

支援的值會因圖片類型而異:

  • COSrenocubicbbrlp
  • Ubunturenocubicbbrlphtcpvegasdctcpbiccdghighspeedhyblaillinoisnvscalablevenowestwoodyeah
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 以上版本。

虛擬記憶體參數 (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_bytesvm.dirty_background_ratio 的對應項目。只能指定其中一項設定。

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

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

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

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

這項設定會決定核心處理記憶體過度配置的策略。值如下:

  • 0:拒絕大型分配作業
  • 1:一律允許
  • 2:防止超出交換空間 + RAM 比率的提交
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 核心 cgroups 進行資源管理,例如限制 Pod 中每個容器可存取的 CPU 或記憶體數量。核心中有兩個版本的 cgroup 子系統:cgroupv1cgroupv2。Kubernetes cgroupv2 支援功能在 Kubernetes 1.18 版中以 Alpha 版推出,1.22 版為 Beta 版,1.25 版則為正式版。詳情請參閱 Kubernetes cgroups v2 說明文件

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

您可以使用節點系統設定,將節點集區的設定變更為明確使用 cgroupv1cgroupv2。將使用 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 以上版本。
  • 您必須使用 Container-Optimized OS (含 containerd) 或 Ubuntu (含 containerd) 節點映像檔
  • 如果任何工作負載需要讀取 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 或記憶體類似。

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

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

下表說明 Linux Hugepage 的可修改設定。

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

透明巨頁 (THP)

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

下表說明 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 的重組設定。

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

後續步驟