本文說明如何使用稱為「節點系統設定」的設定檔,自訂 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 中的運算類別」。
如要使用節點系統設定檔,請按照下列步驟操作:
建立設定檔
以 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 設定選項」一節。
將設定新增至節點集區
建立設定檔後,請使用 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 建立具有自訂節點系統設定的地區叢集,請參閱下列範例:
如要進一步瞭解如何使用 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
:包含kubelet
和sysctl
設定的檔案路徑
Terraform
如要使用 Terraform 建立具有自訂節點系統設定的節點集區,請參閱下列範例:
如要進一步瞭解如何使用 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
:包含kubelet
和sysctl
設定的檔案路徑
這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定異動的詳細資訊,請在「手動變更:使用節點升級策略重建節點,但不遵守維護政策」表格中,找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。
編輯節點系統設定
如要編輯節點系統設定,您可以建立具有所需設定的新節點集區,或是更新現有節點集區的節點系統設定。
透過建立節點集區進行編輯
如要透過建立節點集區來編輯節點系統設定,請按照下列步驟操作:
透過更新現有節點集區進行編輯
如要編輯現有節點集區的節點系統設定,請按照「更新節點集區」分頁中的操作說明,將設定新增至節點集區。更新節點系統設定會以新設定覆寫節點集區的系統設定,因此需要重新建立節點。如果在更新期間省略任何參數,系統會將這些參數設為各自的預設值。
如要將節點系統設定重設為預設值,請更新設定檔,將 kubelet
和 sysctl
的值設為空白。例如:
kubeletConfig: {}
linuxConfig:
sysctl: {}
刪除節點系統設定
如要移除節點系統設定,請按照下列步驟操作:
Kubelet 設定選項
下表列出可修改的 kubelet
選項。
Kubelet 設定 | 限制 | 預設設定 | 說明 |
---|---|---|---|
allowedUnsafeSysctls |
sysctl 名稱或群組清單。允許的sysctl
群組:kernel.shm* 、kernel.msg* 、kernel.sem 、fs.mqueue.* 和 net.* 。
例如:[kernel.msg*, net.ipv4.route.min_pmtu] 。
|
none
|
這項設定會定義以半形逗號分隔的不安全sysctl 名稱或sysctl 群組允許清單,可在 Pod 上設定。適用於 GKE 1.32.0-gke.1448000 以上版本。 |
containerLogMaxSize |
值必須是正數,且單位後置字串介於 10Mi 至 500Mi 之間 (包含 10Mi 和 500Mi )。有效單位為
Ki, Mi, Gi 。
|
10Mi
|
這項設定會控管容器記錄檔輪替政策的 containerLogMaxSize 設定,可讓您設定每個記錄檔的大小上限。預設值為 10Mi 。 |
containerLogMaxFiles |
值必須是介於 2 和 10 之間的整數,
包括 2 和 10 。
|
5
|
這項設定會控管容器記錄檔輪替政策的 containerLogMaxFiles 設定,可讓您分別為每個容器設定允許的檔案數量上限。預設值為 5 。每個容器的記錄總大小 (container_log_max_size*container_log_max_files) 不得超過節點總儲存空間的 1%。 |
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 節流行為。 |
imageGcLowThresholdPercent |
值必須是介於 10 到 85 之間的整數 (含首尾),且小於 imageGcHighThresholdPercent
|
80
|
imageGcLowThresholdPercent 是磁碟使用率的百分比,達到這個百分比之前,系統一律不會執行圖片垃圾收集作業。垃圾收集作業的最低磁碟用量。百分比的計算方式是將這個欄位值除以 100。指定值時,該值必須小於 imageGcThresholdPercent 。 |
imageGcHighThresholdPercent |
值必須是介於 10 到 85 之間的整數 (含),且高於 imageGcLowThresholdPercent
|
85
|
imageGcHighThresholdPercent 是磁碟使用量百分比,超過這個值就會執行映像檔垃圾收集作業。垃圾收集作業的磁碟用量上限。百分比的計算方式是將這個欄位值除以 100。指定的值必須大於 imageGcLowThresholdPercent 。 |
imageMinimumGcAge |
值必須是時間長度,且不得超過「2m」。有效時間單位為 "ns", "us" (or "µs"), "ms", "s", "m", "h" |
2m
|
imageMinimumGcAge 是垃圾收集作業開始前,未使用的圖片必須經過的最短時間。 |
imageMaximumGcAge | 值必須是時間長度 |
0s
|
imageMaximumGcAge 是圖片未使用的最長時間,超過這個時間就會進行垃圾收集。這個欄位的預設值為「0 秒」,這會停用這個欄位。也就是說,系統不會因為圖片閒置過久而進行垃圾收集。指定的值必須大於 imageMinimumGcAge 。imageMaximumGcAge 適用於 GKE 1.30.7-gke.1076000、1.31.3-gke.1023000 以上版本 |
insecureKubeletReadonlyPortEnabled |
值必須是布林值 (true 或 false ) |
true |
這項設定會停用叢集中每個新節點集區的不安全 kubelet 唯讀通訊埠 10255 。如果您在這個檔案中設定這項設定,就無法使用 GKE API 用戶端在叢集層級變更設定。 |
podPidsLimit | 值必須介於 1024 至 4194304 之間 |
none
|
這項設定會為每個 Pod 設定可使用的程序 ID (PID) 數量上限。 |
資源管理員
Kubernetes 提供一系列資源管理工具。您可以設定這些 Resource Manager,協調及最佳化節點資源的對齊方式,以符合為 Pod 設定的 CPU、裝置和記憶體 (hugepages) 資源特定需求。詳情請參閱「節點資源管理員」。
使用 GKE 時,您可以為這些資源管理員設定下列設定。您可以分別設定這些選項,但建議一併使用這些設定,以利資源管理。您可以搭配使用拓撲管理工具設定、CPU 管理工具設定和記憶體管理工具設定,將 CPU 和記憶體與 Pod 規格中要求的其他資源對齊。
Kubelet 設定 | 限制 | 預設設定 | 說明 |
---|---|---|---|
cpuManagerPolicy: |
值必須為 none 或 static
|
none
|
這項設定會控管 kubelet 的 CPU 管理工具政策。預設值為 none ,這是預設的 CPU 親和性配置,除了 OS 排程器自動執行的作業外,不會提供任何親和性。將這個值設為 static ,即可為屬於 Guaranteed QoS 類別且有整數 CPU 要求的 Pod 指派專屬 CPU。 |
memoryManager: policy: |
值必須為 None 或 Static |
None |
這項設定會控管 kubelet 的記憶體管理工具政策。如果使用預設值 如果將這個值設為 這項設定適用於控制層執行 GKE 1.32.3-gke.1785000 以上版本的叢集。 |
topologyManager: policy: scope: |
值必須是各個欄位支援的設定之一 |
|
這些設定會控管 kubelet 的拓撲管理員政策,該政策會協調一組元件,負責與 CPU 隔離、記憶體和裝置位置相關的效能最佳化作業。 您可以分別設定政策和範圍設定。如要進一步瞭解這些設定,請參閱「拓撲管理員範圍和政策」。 下列 GKE 資源支援這項設定:
|
以下範例顯示節點系統設定,其中已設定所有三項 Resource Manager 政策:
cpuManagerPolicy: static
memoryManager:
policy: Static
topologyManager:
policy: best-effort
scope: pod
Sysctl 設定選項
如要調整系統效能,可以修改下列核心屬性:
kernel.shmmni
kernel.shmmax
kernel.shmall
net.core.busy_poll
net.core.busy_read
net.core.netdev_max_backlog
net.core.rmem_max
net.core.rmem_default
net.core.wmem_default
net.core.wmem_max
net.core.optmem_max
net.core.somaxconn
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
net.ipv4.tcp_tw_reuse
net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.default.disable_ipv6
net.netfilter.nf_conntrack_acct
- 適用於 GKE 1.32.0-gke.1448000 以上版本。net.netfilter.nf_conntrack_max
- 適用於 GKE 1.32.0-gke.1448000 以上版本。net.netfilter.nf_conntrack_buckets
- 適用於 GKE 1.32.0-gke.1448000 以上版本。net.netfilter.nf_conntrack_tcp_timeout_close_wait
- 適用於 GKE 1.32.0-gke.1448000 以上版本。net.netfilter.nf_conntrack_tcp_timeout_established
- 適用於 GKE 1.32.0-gke.1448000 以上版本。net.netfilter.nf_conntrack_tcp_timeout_time_wait
- 適用於 GKE 1.32.0-gke.1448000 以上版本。vm.max_map_count
不同的 Linux 命名空間可能會有特定 sysctl
的專屬值,其他則為整個節點的全域值。使用節點系統設定更新 sysctl
選項,可確保 sysctl
全域套用至節點和每個命名空間,因此每個 Pod 在每個 Linux 命名空間中都有相同的 sysctl
值。
Linux cgroup 模式設定選項
kubelet 和容器執行階段會使用 Linux 核心 cgroups 進行資源管理,例如限制 Pod 中每個容器可存取的 CPU 或記憶體數量。核心中有兩個版本的 cgroup 子系統:cgroupv1
和 cgroupv2
。Kubernetes cgroupv2
支援功能在 Kubernetes 1.18 版中以 Alpha 版推出,1.22 版中以 Beta 版推出,1.25 版中則以正式版推出。詳情請參閱 Kubernetes cgroups v2 說明文件。
節點系統設定可讓您自訂節點集區的 cgroup 設定。您可以使用 cgroupv1
或 cgroupv2
。對於執行 1.26 以上版本的新 Standard 節點集區,GKE 會使用 cgroupv2
,對於 1.26 之前的版本,則會使用 cgroupv1
。如果是透過節點自動佈建功能建立的節點集區,cgroup 設定取決於初始叢集版本,而非節點集區版本。Arm 電腦不支援「cgroupv1
」。
您可以使用節點系統設定,將節點集區的設定變更為明確使用 cgroupv1
或 cgroupv2
。將現有節點集區升級至 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 以上版本。
- 您必須使用搭載 containerd 的 Container-Optimized OS 節點映像檔。
- 如果任何工作負載需要讀取 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 設定,請選取節點並按照下列操作說明連線至該節點:
- 使用節點集區中的任何節點建立互動式殼層。將指令中的
mynode
替換為節點集區中任一節點的名稱。 - 找出 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 機型。