Стадия жизненного цикла модуля: Preview
У модуля есть требования для установки
TrinoClass
Custer Wide Ресурс TrinoClass позволяет ограничить создание невалидных конфигураций и предопределить некоторые значения.
Каждый ресурс Trino обязательно должен быть связан с существующим ресурсом TrinoClass.
Перед развертыванием сервиса, вся конфигурация будет проверена о соответсвующий TrinoClass.
Sizing Policies
Структура позволяет создавать набор политик определения размера связанных Trino.
Это позволит избегать неравномерного распределения ресурсов CPU и Memory на нодах кластера.
Определяющим фактором выбора той или иной политики является попадание в интервал cores.
Далее будет проверено соответствие остальных полей конкретной политики.
spec:
sizingPolicies:
- cores:
min: 1
max: 4
memory:
min: 100Mi
max: 1Gi
step: 1Mi
coreFraction: [10%, 30%, 50%]
- cores:
min: 5
max: 10
memory:
min: 500Mi
max: 2Gi
coreFraction: [50%, 70%, 100%]Validation Rules
В качестве синтаксиса используется CEL (Common Expression Language) для создания гибких механизмов валидаций.
Мы предоставляем набор предопределенных переменных, которые можно использовать в rule:
- instance.memory.size
int - instance.cpu.cores
int
spec:
validations:
- message: "instance.memory.size should be more than 2Gi"
rule: "instance.memory.size > 2 * 1024 * 1024 * 1024"Default Values
Значения по умолчанию, которые устанавливаются Trino Operator, исходят из следующей логики.
Расчёт параметров памяти и CPU
Оператор автоматически рассчитывает ключевые параметры Trino на основе ресурсов пода (instance.memory.size и instance.cpu.cores).
Память (instance.memory.size):
| Параметр Trino | Формула | Описание |
|---|---|---|
-Xmx (JVM heap) |
80% × memory |
20% оставляется ОС и JVM off-heap структурам |
memory.heap-headroom-per-node |
30% × Xmx |
Резерв для внутренних аллокаций, не отслеживаемых Trino (ридеры, райтеры и т.д.) |
query.max-memory-per-node |
Xmx − heap-headroom |
Память, доступная запросам на одном узле |
query.max-memory |
= query.max-memory-per-node |
В standalone-режиме кластер состоит из одного узла, поэтому лимит совпадает с per-node |
CPU (instance.cpu.cores):
| Параметр Trino | Формула | Описание |
|---|---|---|
task.concurrency |
Наибольшая степень двойки ≤ cores | Trino требует степень двойки; например, при 6 ядрах → 4 |
Фиксированные параметры конфигурации
jvm.config — JVM-флаги:
-server
-agentpath:/usr/lib/trino/bin/libjvmkill.so
-Xmx<рассчитывается>M
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
-XX:+EnableDynamicAgentLoading
-XX:+UnlockDiagnosticVMOptions
-XX:G1NumCollectionsKeepPinned=10000000Пример расчёта для инстанса 16 GiB / 6 CPU
| Параметр | Значение |
|---|---|
-Xmx |
16 GiB × 0.8 = 12 GiB (12288 MiB) |
memory.heap-headroom-per-node |
12288 × 0.3 ≈ 3686 MiB |
query.max-memory-per-node |
12288 − 3686 = 8602 MiB |
query.max-memory |
8602 MiB |
task.concurrency |
4 (наибольшая степень двойки ≤ 6) |
Affinity
Стандартный механизм Kubernetes для управления планированием разворачиваемых подов.
spec:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "node.deckhouse.io/group"
operator: "In"
values:
- "trino"Tolerations
Стандартный механизм Kubernetes для управления планированием разворачиваемых подов.
spec:
tolerations:
- key: primary-role
operator: Equal
value: trino
effect: NoScheduleNode Selector
Стандартный механизм Kubernetes для управления планированием разворачиваемых подов.
nodeSelector:
"node.deckhouse.io/group": "trino"Примеры использования
Базовое использование
apiVersion: managed-services.deckhouse.io/v1alpha1
kind: TrinoClass
spec:
sizingPolicies:
- cores:
min: 2
max: 4
memory:
min: 2Gi
max: 8Gi
step: 1Gi
coreFractions:
- "25%"
- "50%"
- "75%"
- "100%"
- cores:
min: 5
max: 8
memory:
min: 8Gi
max: 16Gi
step: 1Gi
coreFractions:
- "25%"
- "50%"
- "75%"
- "100%"
validations:
- message: "instance.memory.size should be more than 2Gi"
rule: "instance.memory.size > 2 * 1024 * 1024 * 1024"