本文說明如何使用稱為「節點系統設定」的設定檔,自訂 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 模式中使用節點系統設定,請按照下列步驟操作:
建立設定檔
以 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 建立具有自訂節點系統設定的地區叢集,請參閱下列範例:
如要進一步瞭解如何使用 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:包含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 選項。
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 節流行為。 |
記憶體管理和逐出機制
下表說明記憶體管理和清除作業的可修改選項。本節也包含另一個表格,說明 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 在驅逐期間終止的正常終止時間上限 (以秒為單位)。 |
下表列出 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 信號量。 |
singleProcessOOMKill
|
值必須為 true 或 false。 |
如果是 cgroupv1 節點,請使用 true;如果是 cgroupv2 節點,請使用 false。 |
這項設定會決定容器中的程序是個別 OOMkill,還是以群組形式 OOMkill。
適用於 GKE 1.32.4-gke.1132000、1.33.0-gke.1748000 以上版本。 |
PID 管理
下表說明 PID 管理的可修改選項。
kubelet 設定 |
限制 | 預設設定 | 說明 |
|---|---|---|---|
podPidsLimit |
值必須介於 1024 至 4194304 之間 |
none |
這項設定會為每個 Pod 設定可使用的程序 ID (PID) 數量上限。 |
記錄
下表說明可修改的記錄選項。
kubelet 設定 |
限制 | 預設設定 | 說明 |
|---|---|---|---|
containerLogMaxSize |
值須為正數,且單位後置字元介於 10Mi 至 500Mi 之間 (含)。 |
10Mi |
這項設定會控管容器記錄檔輪替政策的 containerLogMaxSize 設定,可讓您設定每個記錄檔的大小上限。預設值為 10Mi。有效單位為 Ki、Mi 和 Gi。 |
containerLogMaxFiles |
值必須是介於 2 和 10 之間的整數 (含 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 之間的整數 (含 10 和 85),且小於 imageGcHighThresholdPercent。 |
80 |
這項設定會定義磁碟用量百分比,如果未達到這個百分比,系統就不會執行映像檔垃圾收集作業。這代表垃圾收集作業的最低磁碟用量。百分比的計算方式是將這個欄位的值除以 100。 |
imageMinimumGcAge |
值必須是時間長度,且不得大於 2m。有效時間單位為 ns、us (或 µs)、ms、s、m 或 h。 |
2m |
這項設定會定義未使用的圖片在垃圾收集前,必須經過的最短時間。 |
imageMaximumGcAge |
值必須是時間長度。 | 0s |
這項設定定義圖片未使用的最長時間,超過這個時間就會進行垃圾收集。這個欄位的預設值為 適用於 GKE 1.30.7-gke.1076000、1.31.3-gke.1023000 以上版本。 |
提取映像檔
下表說明可修改的映像檔提取選項。
kubelet 設定 |
限制 | 預設設定 | 說明 |
|---|---|---|---|
maxParallelImagePulls |
值必須是介於 2 和 5 之間的整數 (含首尾)。 | 2 或 3,視磁碟類型而定。 |
這項設定定義了平行提取圖片的最大數量。預設值取決於開機磁碟類型。 |
安全和不安全的作業
下表說明可修改的選項,用於設定安全性及處理不安全的操作。
kubelet 設定 |
限制 | 預設設定 | 說明 |
|---|---|---|---|
allowedUnsafeSysctls |
|
none |
這項設定定義了以半形逗號分隔的不安全 sysctl 名稱或 sysctl 群組允許清單,可設定在 Pod 上。 |
insecureKubeletReadonlyPortEnabled |
這個值必須是布林值,可以是 true 或 false。 |
true |
這項設定會停用叢集中每個新節點集區的不安全kubelet唯讀通訊埠10255。如果您在這個檔案中設定這項設定,就無法使用 GKE API 用戶端在叢集層級變更設定。 |
資源管理員
Kubernetes 提供一系列資源管理工具。您可以設定這些資源管理工具,協調及最佳化節點資源的對齊方式,以滿足 Pod 對 CPU、裝置和記憶體 (巨頁) 資源的特定需求。
下表說明資源管理員可修改的選項。
kubelet 設定 |
限制 | 預設設定 | 說明 |
|---|---|---|---|
cpuManagerPolicy |
值必須為 none 或 static。 |
none |
這項設定會控管 kubelet CPU 管理工具政策。預設值為 none,這是預設的 CPU 親和性配置,除了 OS 排程器自動執行的作業外,不會提供任何親和性。將這個值設為 static,可讓屬於 Guaranteed QoS 類別且具有整數 CPU 要求的 Pod 專用 CPU。 |
memoryManager.policy |
值必須為 None 或 Static。 |
None |
這項設定會控管 如果將這個值設為 這項設定適用於控制層執行 GKE 1.32.3-gke.1785000 以上版本的叢集。 |
topologyManager |
值必須是各個欄位支援的設定之一。 使用 Terraform 指令將設定新增至 Standard 節點集區時,無法設定 |
|
這些設定會使用 您可以分別設定政策和範圍設定。如要進一步瞭解這些設定,請參閱「拓撲管理工具範圍和政策」。 下列 GKE 資源支援這項設定:
|
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] 之間。 |
這項設定會定義
|
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 探索。支援的值如下:
|
net.ipv4.tcp_congestion_control |
必須是「說明」欄中支援的值。 | 如果叢集已啟用 GKE Dataplane V2,則不支援這項設定。 支援的值會因圖片類型而異:
|
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] 之間。 |
這項設定會定義雜湊表的大小。建議設定是根據下列因素得出: 適用於 GKE 1.32.0-gke.1448000 以上版本。 |
net.netfilter.nf_conntrack_tcp_timeout_close_wait |
必須介於 [60, 3600] 之間。 |
這項設定定義 TCP 連線可維持在 適用於 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 連線可維持在 適用於 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_expire_centisecs |
必須介於 [0, 6000] 之間。 | 這項設定定義了髒資料在核心清除器執行緒將資料寫入磁碟前,可保留在記憶體中的最長時間 (以百分之一秒為單位)。 |
vm.dirty_ratio |
必須介於 [1, 100] 之間。 | 這項設定定義系統記憶體可填入髒頁的百分比,超過這個百分比後,執行寫入作業的程序就會強制封鎖,並同步寫出髒資料。 |
vm.dirty_bytes |
必須介於 [0, 68719476736] 之間。 |
這項設定可定義產生磁碟寫入的程序,在髒記憶體達到多少時開始寫回。 請注意, |
vm.dirty_writeback_centisecs |
必須介於 [0, 1000] 之間。 | 這項設定會定義核心清除器執行緒喚醒的間隔 (以百分之一秒為單位),以便將舊的髒資料寫入磁碟。 |
vm.overcommit_memory |
必須介於 {0, 1, 2} 之間。 |
這項設定會決定核心處理記憶體過度配置的策略。值如下:
|
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 子系統: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。將使用 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/...),請確保這些工作負載與cgroupv2API 相容。 - 如果您使用任何監控或第三方工具,請確認這些工具與
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:節點使用cgroupv1EFFECTIVE_CGROUP_MODE_V2:節點使用cgroupv2
節點集區中的節點重新建立後,輸出內容只會顯示新的 cgroup 設定。Windows Server 節點集區不支援 cgroup,因此輸出內容為空白。
kubectl
如要使用 kubectl 驗證這個節點集區中節點的 cgroup 設定,請選取節點並按照下列指示連線:
- 使用節點集區中的任一節點建立互動式殼層。在指令中,將
mynode替換為節點集區中任何節點的名稱。 - 找出 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 |
|
UNSPECIFIED |
這項設定可控制是否為匿名記憶體啟用 THP。 |
transparentHugepageDefrag |
|
UNSPECIFIED |
這項設定會定義 THP 的重組設定。 |
GKE 1.33.2-gke.4655000 以上版本支援 THP。在 GKE 1.33.2-gke.4655000 以上版本中,新的 TPU 節點集區也會預設啟用這項功能。將現有節點集區升級至支援的版本或更新版本時,系統不會啟用 THP。