Стадия жизненного цикла модуля: 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: NoSchedule

Node 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"