本文說明如何使用節點系統設定設定檔,自訂 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 自訂節點系統設定,請按照下列步驟操作:
- 建立包含
spec.nodePoolAutoCreation.enabled: true欄位值組合的 ComputeClass,並在priorityDefaults欄位中指定系統設定。 - 部署會選取 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 模式中使用節點系統設定檔,請按照下列步驟操作:
建立設定檔
以 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,請參閱「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 建立節點集區,並自訂節點系統設定,請參考下列範例:
如要進一步瞭解如何使用 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 會在每個節點上重新啟動sysctlsystemd 服務,以套用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旗標。
- 如果是新叢集,請在建立叢集時,於
套用即時更新
如要套用即時更新,請按照下列步驟操作:
- 建立或修改節點系統設定 YAML 檔案,使其包含節點集區的完整設定,包括您要變更的
kubelet或sysctl設定。為避免重設不想變更的設定,請從節點集區的現有設定開始。 使用設定檔更新節點集區,並將
--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 檔案的路徑
確認 GKE 已將更新後的設定套用至節點集區:
gcloud container node-pools describe POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --format="yaml(config.kubeletConfig, config.linuxNodeConfig)"指令輸出內容會在
config.kubeletConfig和config.linuxNodeConfig欄位中,顯示節點集區的有效設定。選用:重新啟動現有 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 指令就無法使用,只有在作業失敗時才能使用。
如要還原已完成的即時更新,請按照下列步驟操作:
- 更新節點系統設定 YAML 檔案,使其包含節點集區的完整先前設定。如果先前未設定某項設定,請明確將其設為預設值,而非省略或留空。如要瞭解預設值,請參閱「Kubelet 設定選項」和「Sysctl 設定選項」。
將先前的設定套用至節點集區:
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
為確保工作負載遷移至採用更新設定的新節點,請按照下列步驟操作:
- 使用新名稱和更新後的設定建立新的 ComputeClass。
- 更新工作負載規格中的節點選取器,參照新的 ComputeClass。
- 套用更新後的工作負載規格。叢集自動配置器會使用新設定佈建新節點,並最終縮減舊節點。
- 刪除舊的 ComputeClass 物件。
設定檔
如要使用設定檔編輯節點系統設定,您可以建立新的節點集區並套用所需設定,或更新現有節點集區的節點系統設定。
建立節點集區來編輯
如要透過建立節點集區來編輯節點系統設定,請按照下列步驟操作:
更新現有節點集區
如要就地變更現有節點集區的節點系統設定,請參閱「更新現有節點集區的節點系統設定」。
取得現有節點系統設定
如要擷取節點集區現有的節點系統設定 (例如您已自訂設定,並想新增設定),請使用 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
如要移除自訂節點系統設定,請按照下列步驟操作:
- 從工作負載規格中移除
cloud.google.com/compute-class節點選取器。 - 套用更新後的工作負載規格。GKE 會在預設節點上重新建立工作負載。叢集自動配置器最終會縮減資源,並刪除為 ComputeClass 佈建的節點。
從叢集刪除 ComputeClass 物件:
kubectl delete computeclass CUSTOM_COMPUTE_CLASS_NAME
設定檔
如要移除使用設定檔套用的節點系統設定,請按照下列步驟操作:
- 建立新的節點集區,但不使用設定檔。
- 將工作負載遷移至新的節點集區。
- 刪除具有舊節點系統設定的節點集區。
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 和 預留系統 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 |
這項設定定義了圖片在垃圾收集前,可閒置的最長時間。這個欄位的預設值為 適用於 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。 |
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 |
這項設定會控管 如果將這個值設為 如果叢集的控制層搭載 GKE 1.32.3-gke.1785000 以上版本,則支援這項設定。 |
topologyManager |
值必須是各個欄位支援的設定之一。 使用 Terraform 指示將設定新增至 Standard 節點集區時,無法設定 |
|
這些設定會使用 您可以分別設定政策和範圍。如要進一步瞭解這些設定,請參閱「拓撲管理工具範圍和政策」。 下列 GKE 資源支援這項設定:
|
容器重新啟動延遲時間
這項設定可控制容器處於 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] 之間。 |
這項設定會定義
|
kernel.kptr_restrict |
必須介於 [0, 2] 之間。 | 這項設定會指出是否限制透過 /proc 和其他介面公開核心位址。 |
kernel.dmesg_restrict |
選用 (布林值)。 | 這項設定會指出是否要禁止無權限的使用者透過 dmesg(8) 查看核心記錄緩衝區中的訊息。 |
kernel.sysrq |
必須介於 [0, 511] 之間。 |
這項設定可控管允許透過 SysRq 鍵叫用的函式。可能的值如下:
|
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 探索。支援的值如下:
|
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 以上版本。 |
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_expire_centisecs |
必須介於 [0, 6000] 之間。 | 這項設定定義了品質不佳的資料在記憶體中保留的時間長度上限 (以百分之一秒為單位),超過這個時間後,核心清除器執行緒就會將資料寫入磁碟。 |
vm.dirty_ratio |
必須介於 [1, 100] 之間。 | 這項設定定義了系統記憶體可填入髒頁的百分比,超過這個百分比後,執行寫入作業的程序就會強制封鎖,並同步寫出品質不佳的資料 (dirty data)。 |
vm.dirty_bytes |
必須介於 [0, 68719476736]。 |
這項設定定義了髒記憶體量,當產生磁碟寫入的程序達到這個量時,就會開始自行回寫。 請注意, |
vm.dirty_writeback_centisecs |
必須介於 [0, 1000] 之間。 | 這項設定定義了核心清除執行緒喚醒並將舊的品質不佳資料寫入磁碟的時間間隔,以百分之一秒為單位。 |
vm.overcommit_memory |
必須介於 {0, 1, 2} 之間。 |
這項設定會決定核心處理記憶體超額承諾的策略。值如下:
記憶體小於 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/...),請確保這些工作負載與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 或記憶體。
如要使用巨型分頁,請遵守下列限制和規定:
- 為確保節點不會完全被巨型分頁占用,分配的巨型分頁整體大小不得超過下列任一項:
- 記憶體小於 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 |
|
UNSPECIFIED |
這項設定可控制是否為匿名記憶體啟用 THP。 |
transparentHugepageDefrag |
|
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 準確同步時間:
| 設定參數 | 支援的值 | 預設值 | 說明 |
|---|---|---|---|
|
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 以上版本。 |
後續步驟
- 瞭解如何將節點遷移至 Linux cgroupv2。
- 瞭解如何新增及管理節點集區。
- 瞭解如何自訂 GKE 節點中的 containerd 設定。
- 瞭解如何使用 DaemonSet 自動啟動 GKE 節點。