自訂節點系統設定


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

總覽

您可以使用各種方法自訂節點設定。舉例來說,您可以在建立節點集區時指定機器類型和最低 CPU 平台等參數。

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

您也可以使用不同的檔案 (稱為「執行階段設定檔」),在 GKE 節點上自訂 containerd 容器執行階段。如需操作說明,請參閱「在 GKE 節點中自訂 containerd 設定」。

您也可以使用 DaemonSet 自訂節點,例如「使用 DaemonSet 自動啟動 GKE 節點」一文所述。

使用節點系統設定

你可以使用下列任一方法自訂節點系統設定:

  • 設定檔:僅適用於標準模式。您可以使用包含 kubelet 和 Linux 核心設定參數的 YAML 檔案。本頁的步驟說明如何建立及使用設定檔。
  • ComputeClass:適用於 Autopilot 模式和 Standard 模式。您可以在 GKE ComputeClass 規格中指定節點系統設定。您可以定義一組節點屬性,供 GKE 在擴充叢集時使用。適用於 GKE 1.32.1-gke.1729000 以上版本。詳情請參閱「關於 GKE 中的運算類別」。

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

  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 設定選項」一節。

將設定新增至節點集區

建立設定檔後,請使用 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

``` Replace the following:
  • 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 選項。

Kubelet 設定 限制 預設設定 說明
allowedUnsafeSysctls sysctl名稱或群組清單。允許的sysctl 群組:kernel.shm*kernel.msg*kernel.semfs.mqueue.*net.*。 例如:[kernel.msg*, net.ipv4.route.min_pmtu] none 這項設定會定義以半形逗號分隔的不安全sysctl名稱或sysctl群組允許清單,可在 Pod 上設定。

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

containerLogMaxSize 值必須是正數,且單位後置字串介於 10Mi500Mi 之間 (包含 10Mi500Mi)。有效單位為 Ki, Mi, Gi 10Mi 這項設定會控管容器記錄檔輪替政策的 containerLogMaxSize 設定,可讓您設定每個記錄檔的大小上限。預設值為 10Mi

containerLogMaxFiles 值必須是介於 210 之間的整數 (含 210)。 5 這項設定會控管容器記錄檔輪替政策的 containerLogMaxFiles 設定,可讓您分別為每個容器設定允許的檔案數量上限。預設值為 5。每個容器的記錄總大小 (container_log_max_size*container_log_max_files) 不得超過節點總儲存空間的 1%。

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 節流行為。
imageGcLowThresholdPercent 值必須是介於 10 到 85 之間的整數 (含首尾),且小於 imageGcHighThresholdPercent 80 這項設定會定義磁碟用量百分比,如果低於這個值,系統就不會執行映像檔垃圾收集作業。垃圾收集作業的最低磁碟用量。百分比的計算方式是將這個欄位值除以 100。指定值時,該值必須小於 imageGcHighThresholdPercent
imageGcHighThresholdPercent 值必須是介於 10 到 85 之間的整數 (含 10 和 85),且大於 imageGcLowThresholdPercent 85 這項設定會定義磁碟使用率百分比,超過這個值就會執行映像檔垃圾收集作業。垃圾收集作業的磁碟用量上限。百分比的計算方式是將這個欄位值除以 100。指定的值必須大於 imageGcLowThresholdPercent
imageMinimumGcAge 值必須是時間長度,且不得超過「2m」。有效時間單位為 "ns", "us" (or "µs"), "ms", "s", "m", "h" 2m imageMinimumGcAge 是垃圾收集作業開始前,未使用的圖片必須經過的最短時間。
imageMaximumGcAge 值必須是時間長度 0s imageMaximumGcAge 是圖片未使用的最長時間,超過這個時間就會進行垃圾收集。這個欄位的預設值為「0 秒」,這會停用這個欄位。也就是說,系統不會因為圖片閒置過久而進行垃圾收集。指定的值必須大於 imageMinimumGcAge

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

insecureKubeletReadonlyPortEnabled 值必須是布林值 (truefalse) true 這項設定會停用叢集中每個新節點集區的不安全 kubelet 唯讀通訊埠 10255。如果您在這個檔案中設定這項設定,就無法使用 GKE API 用戶端在叢集層級變更設定。
podPidsLimit 值必須介於 1024 至 4194304 之間 none 這項設定會為每個 Pod 設定可使用的程序 ID (PID) 數量上限。
maxParallelImagePulls 值必須是介於 2 至 5 之間的整數 (含首尾) 23 (視磁碟類型而定) 這項設定定義了平行提取圖片的最大數量。預設值取決於開機磁碟類型:

  • 預設 3pd-balancedpd-ssd 或暫時性本機 SSD。
  • 預設 2pd-standard 或其他類型的開機磁碟。
  • 適用於 GKE 1.33.1-gke.1918000 以上版本。

    資源管理員

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

    使用 GKE 時,您可以為這些資源管理員設定下列設定。您可以分別設定這些選項,但建議一併使用,以利資源管理。您可以搭配使用拓撲管理工具設定、CPU 管理工具設定和記憶體管理工具設定,將 CPU 和記憶體與 Pod 規格中要求的其他資源對齊。

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

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

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

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

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

          topologyManager:
            policy:
            scope:
          
    值必須是各個欄位支援的設定之一
    • topologyManager.policy 預設值為 none
    • topoloyManager.scope 的預設值為 container

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

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

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

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

    以下範例顯示節點系統設定,其中已設定所有三項 Resource Manager 政策:

    cpuManagerPolicy: static
    memoryManager:
      policy: Static
    topologyManager:
      policy: best-effort
      scope: pod
    

    Sysctl 設定選項

    如要調整系統效能,可以修改下列核心屬性:

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

    不同的 Linux 命名空間可能會有特定 sysctl 的專屬值,其他則為整個節點的全域值。使用節點系統設定更新 sysctl 選項,可確保 sysctl 全域套用至節點和每個命名空間,因此每個 Pod 在每個 Linux 命名空間中都有相同的 sysctl 值。

    Linux cgroup 模式設定選項

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

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

    您可以使用節點系統設定,將節點集區的設定變更為明確使用 cgroupv1cgroupv2。將現有節點集區升級至 1.26 版時,設定不會變更為 cgroupv2,因為使用 1.26 之前的版本建立的現有節點集區 (沒有自訂 cgroup 設定) 會繼續使用 cgroupv1,除非您明確指定其他設定。

    舉例來說,如要將節點集區設為使用 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 相容。
    • 如果您使用 JDK (Java 工作負載),建議使用完全支援 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 大頁面設定選項

    您可以使用節點系統設定檔,使用 Linux 核心功能「巨頁」

    Kubernetes 支援節點上的巨頁,這是一種資源類型,與 CPU 或記憶體類似。使用下列參數指示 Kubernetes 節點預先配置巨頁,供 Pod 使用。如要管理 Pod 的 HugePages 消耗量,請參閱「管理 HugePages」。

    如要為節點預先配置巨頁,請指定數量和大小。舉例來說,如要設定節點,分配三個 1 GB 大小的巨頁,以及 1024 個 2 MB 大小的巨頁,請使用下列節點系統設定:

    linuxConfig:
      hugepageConfig:
        hugepage_size2m: 1024
        hugepage_size1g: 3
    

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

    • 為確保節點不會完全由巨頁佔用,分配的巨頁總大小不得超過機器總記憶體的 60% (記憶體小於 30 GB 的機器) 和 80% (記憶體大於 30 GB 的機器)。舉例來說,在記憶體為 8 GB 的 e2-standard-2 機器上,您無法為巨頁分配超過 4.8 GB 的空間。在記憶體為 32 GB 的 c4a-standard-8 上,巨頁不得超過 25.6 GB。
    • 1 GB 巨頁僅適用於 A3、C2D、C3、C3D、C4、C4A、C4D、CT5E、CT5LP、CT6E、H3、M2、M3 或 Z3 機型

    透明 HugePage 支援

    您可以使用節點系統設定檔,啟用 Linux 核心功能「透明巨頁支援」。透明巨頁支援 (THP) 是靜態巨頁的替代解決方案。使用 THP 時,核心會自動將巨頁指派給程序,因此不需要手動保留巨頁。系統支援下列欄位:

    linuxConfig:
      transparentHugepageEnabled: TRANSPARENT_HUGEPAGE_ENABLED_ALWAYS
      transparentHugepageDefrag: TRANSPARENT_HUGEPAGE_DEFRAG_ALWAYS
    
    • transparentHugepageEnabled 可控管匿名記憶體的透明巨頁支援功能。支援的值如下:

      • TRANSPARENT_HUGEPAGE_ENABLED_ALWAYS:系統已啟用透明巨頁。
      • TRANSPARENT_HUGEPAGE_ENABLED_MADVISE:透明巨頁已在 MADV_HUGEPAGE 區域內啟用。這是預設核心設定。
      • TRANSPARENT_HUGEPAGE_ENABLED_NEVER:透明巨頁已停用。
      • TRANSPARENT_HUGEPAGE_ENABLED_UNSPECIFIED:預設值。GKE 不會修改核心設定。
    • 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 不會修改核心設定。

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

    後續步驟