Перейти к содержимому
Последнее обновление

02 Настройка кластера Doris

Планирование кластера​

В ресурсе DorisCluster по умолчанию могут использоваться не самые последние версии образов FE и BE. Для обоих компонентов по умолчанию задано 3 реплики. По умолчанию FE использует вычислительные ресурсы 6c 12Gi, а BE — 8c 16Gi. В следующих разделах описано, как изменить эти параметры в соответствии с вашими потребностями.

Настройка образов​

Версия Doris Operator не привязана к версии Doris. Doris Operator поддерживает развёртывание Doris версии 2.0 и выше.

Настройка образа FE

Чтобы указать образ FE, задайте следующую конфигурацию:

spec:
feSpec:
image: ${image}

Замените ${image} именем образа для развёртывания, затем обновите конфигурацию в ресурсе DorisCluster, который будет развёрнут. Можно использовать официальный образ FE, предоставляемый Doris.

Настройка образа BE

Чтобы указать образ BE, задайте следующую конфигурацию:

spec:
beSpec:
image: ${image}

Замените ${image} именем образа для развёртывания, затем обновите конфигурацию в ресурсе DorisCluster, который будет развёрнут. Можно использовать официальный образ BE, предоставляемый Doris.

Настройка реплик​

Изменение числа реплик FE

Чтобы изменить число реплик FE с 3 по умолчанию на 5, задайте следующую конфигурацию:

spec:
feSpec:
replicas: 5

Обновите конфигурацию в ресурсе DorisCluster, который будет развёрнут.

Изменение числа реплик BE

Чтобы изменить число реплик BE с 3 по умолчанию на 5, задайте следующую конфигурацию:

spec:
beSpec:
replicas: 5

Обновите конфигурацию в ресурсе DorisCluster, который будет развёрнут.

Настройка вычислительных ресурсов​

Настройка вычислительных ресурсов FE

По умолчанию FE выделяются вычислительные ресурсы 6c 12Gi. Чтобы изменить их на 8c 16Gi, задайте следующую конфигурацию:

spec:
feSpec:
requests:
cpu: 8
memory: 16Gi
limits:
cpu: 8
memory: 16Gi

Обновите конфигурацию в ресурсе DorisCluster, который будет развёрнут.

Настройка вычислительных ресурсов BE

По умолчанию BE выделяются вычислительные ресурсы 8c 16Gi. Чтобы изменить их на 16c 32Gi, задайте следующую конфигурацию:

spec:
beSpec:
requests:
cpu: 16
memory: 32Gi
limits:
cpu: 16
memory: 32Gi

Обновите конфигурацию в ресурсе DorisCluster, который будет развёрнут.

Совет

Минимальные ресурсы, необходимые для запуска FE и BE, составляют 4c 8Gi. Для обычного тестирования возможностей рекомендуется 8c 8Gi.

Пользовательская конфигурация запуска​

В Kubernetes Doris использует ConfigMap, чтобы отделить файлы конфигурации от сервисов. По умолчанию сервисы используют стандартную конфигурацию из образа в качестве параметров запуска. На основе документации по конфигурации FE и документации по конфигурации BE заранее подготовьте пользовательские параметры запуска в отдельном ConfigMap. После настройки разверните его в пространстве имён, где находится целевой ресурс DorisCluster.

Пользовательская конфигурация запуска FE​

Шаг 1: Настройка и развёртывание ConfigMap​

В следующем примере определяется ConfigMap с именем fe-conf, который можно использовать для Doris FE:

apiVersion: v1
kind: ConfigMap
metadata:
name: fe-conf
labels:
app.kubernetes.io/component: fe
data:
fe.conf: |
CUR_DATE=`date +%Y%m%d-%H%M%S`
# Log dir
LOG_DIR = ${DORIS_HOME}/log
# For jdk 8
JAVA_OPTS="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xss4m -Xmx8192m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintClassHistogramAfterFullGC -Xloggc:$LOG_DIR/log/fe.gc.log.$CUR_DATE -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Dlog4j2.formatMsgNoLookups=true"

# For jdk 17, this JAVA_OPTS will be used as default JVM options
JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djavax.security.auth.useSubjectCredsOnly=false -Xmx8192m -Xms8192m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$LOG_DIR -Xlog:gc*,classhisto*=trace:$LOG_DIR/fe.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED"
# Set your own JAVA_HOME
# JAVA_HOME=/path/to/jdk/
##
## the lowercase properties are read by main program.
##
# store metadata, must be created before start FE.
# Default value is ${DORIS_HOME}/doris-meta
# meta_dir = ${DORIS_HOME}/doris-meta
# Default dirs to put jdbc drivers,default value is ${DORIS_HOME}/jdbc_drivers
# jdbc_drivers_dir = ${DORIS_HOME}/jdbc_drivers

http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
arrow_flight_sql_port = -1

# Choose one if there are more than one ip except loopback address.
# Note that there should at most one ip match this list.
# If no ip match this rule, will choose one randomly.
# use CIDR format, e.g. 10.10.10.0/24 or IP format, e.g. 10.10.10.1
# Default value is empty.
# priority_networks = 10.10.10.0/24;192.168.0.0/16

# Advanced configurations
# log_roll_size_mb = 1024
# INFO, WARN, ERROR, FATAL
sys_log_level = INFO
# NORMAL, BRIEF, ASYNC
sys_log_mode = ASYNC
# audit_log_dir = $LOG_DIR
# audit_log_modules = slow_query, query
# audit_log_roll_num = 10
# meta_delay_toleration_second = 10
# qe_max_connection = 1024
# qe_query_timeout_second = 300
# qe_slow_log_ms = 5000
enable_fqdn_mode = true

При использовании ConfigMap для монтирования конфигурации запуска FE ключ конфигурации должен быть fe.conf. Подготовив файл конфигурации, разверните его в пространстве имён, в котором будет развёрнут ресурс DorisCluster, с помощью следующей команды.

kubectl -n ${namespace} apply -f ${feConfigMapFile}.yaml

Здесь ${namespace} — пространство имён, в котором будет развёрнут целевой ресурс DorisCluster, а ${feConfigMapFile} — имя файла, содержащего приведённую выше конфигурацию.

Шаг 2: Настройка ресурса DorisCluster​

Для ConfigMap с именем fe-conf добавьте следующие сведения в развёрнутый ресурс DorisCluster:

spec:
feSpec:
configMapInfo:
configMapName: fe-conf
resolveKey: fe.conf
Совет

Для развёртывания в Kubernetes рекомендуется режим FQDN. Добавьте enable_fqdn_mode=true в конфигурацию запуска. Если вы хотите использовать режим IP и кластер Kubernetes может гарантировать, что IP-адрес pod не изменится после перезапуска, настройте запуск в режиме IP, следуя рекомендациям в обсуждении #138.

Пользовательская конфигурация запуска BE​

Шаг 1: Настройка и развёртывание ConfigMap​

Ниже определяется ConfigMap с именем be-conf, который можно использовать для Doris BE:

apiVersion: v1
kind: ConfigMap
metadata:
name: be-conf
labels:
app.kubernetes.io/component: be
data:
be.conf: |
CUR_DATE=`date +%Y%m%d-%H%M%S`
# Log dir
LOG_DIR="${DORIS_HOME}/log/"
# For jdk 8
JAVA_OPTS="-Dfile.encoding=UTF-8 -Xmx2048m -DlogPath=$LOG_DIR/jni.log -Xloggc:$LOG_DIR/be.gc.log.$CUR_DATE -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=50M -Djavax.security.auth.useSubjectCredsOnly=false -Dsun.security.krb5.debug=true -Dsun.java.command=DorisBE -XX:-CriticalJNINatives"
# For jdk 17, this JAVA_OPTS will be used as default JVM options
JAVA_OPTS_FOR_JDK_17="-Dfile.encoding=UTF-8 -Djol.skipHotspotSAAttach=true -Xmx2048m -DlogPath=$LOG_DIR/jni.log -Xlog:gc*:$LOG_DIR/be.gc.log.$CUR_DATE:time,uptime:filecount=10,filesize=50M -Djavax.security.auth.useSubjectCredsOnly=false -Dsun.security.krb5.debug=true -Dsun.java.command=DorisBE -XX:-CriticalJNINatives -XX:+IgnoreUnrecognizedVMOptions --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED --add-opens=java.base/sun.util.calendar=ALL-UNNAMED --add-opens=java.security.jgss/sun.security.krb5=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED -Darrow.enable_null_check_for_get=false"
# Set your own JAVA_HOME
# JAVA_HOME=/path/to/jdk/
# https://doris.apache.org/community/developer-guide/debug-tool#jemalloc-heap-profile
# https://jemalloc.net/jemalloc.3.html
JEMALLOC_CONF="percpu_arena:percpu,background_thread:true,metadata_thp:auto,muzzy_decay_ms:5000,dirty_decay_ms:5000,oversize_threshold:0,prof:true,prof_active:false,lg_prof_interval:-1"
JEMALLOC_PROF_PRFIX="jemalloc_heap_profile_"
# ports for admin, web, heartbeat service
be_port = 9060
webserver_port = 8040
heartbeat_service_port = 9050
brpc_port = 8060
arrow_flight_sql_port = -1
# HTTPS configures
enable_https = false
# path of certificate in PEM format.
ssl_certificate_path = "$DORIS_HOME/conf/cert.pem"
# path of private key in PEM format.
ssl_private_key_path = "$DORIS_HOME/conf/key.pem"

# Choose one if there are more than one ip except loopback address.
# Note that there should at most one ip match this list.
# If no ip match this rule, will choose one randomly.
# use CIDR format, e.g. 10.10.10.0/24 or IP format, e.g. 10.10.10.1
# Default value is empty.
# priority_networks = 10.10.10.0/24;192.168.0.0/16

# data root path, separate by ';'
# You can specify the storage type for each root path, HDD (cold data) or SSD (hot data)
# eg:
# storage_root_path = /home/disk1/doris;/home/disk2/doris;/home/disk2/doris
# storage_root_path = /home/disk1/doris,medium:SSD;/home/disk2/doris,medium:SSD;/home/disk2/doris,medium:HDD
# /home/disk2/doris,medium:HDD(default)
#
# you also can specify the properties by setting '<property>:<value>', separate by ','
# property 'medium' has a higher priority than the extension of path
#
# Default value is ${DORIS_HOME}/storage, you should create it by hand.
# storage_root_path = ${DORIS_HOME}/storage

# Default dirs to put jdbc drivers,default value is ${DORIS_HOME}/jdbc_drivers
# jdbc_drivers_dir = ${DORIS_HOME}/jdbc_drivers

# Advanced configurations
# INFO, WARNING, ERROR, FATAL
sys_log_level = INFO
# sys_log_roll_mode = SIZE-MB-1024
# sys_log_roll_num = 10
# sys_log_verbose_modules = *
# log_buffer_level = -1

# aws sdk log level
# Off = 0,
# Fatal = 1,
# Error = 2,
# Warn = 3,
# Info = 4,
# Debug = 5,
# Trace = 6
# Default to turn off aws sdk log, because aws sdk errors that need to be cared will be output through Doris logs
aws_log_level=0
## If you are not running in aws cloud, you can disable EC2 metadata
AWS_EC2_METADATA_DISABLED=true

При использовании ConfigMap для монтирования конфигурации запуска BE ключ конфигурации должен быть be.conf. Подготовив файл конфигурации, разверните его в пространстве имён, в котором будет развёрнут целевой ресурс DorisCluster.

kubectl -n ${namespace} apply -f ${beConfigMapFile}.yaml

Здесь ${namespace} — пространство имён, в котором будет развёрнут ресурс DorisCluster, а ${beConfigMapFile} — имя файла, содержащего приведённую выше конфигурацию.

Шаг 2: Настройка ресурса DorisCluster​

Для ConfigMap с именем be-conf добавьте следующие сведения в развёрнутый ресурс DorisCluster:

spec:
beSpec:
configMapInfo:
configMapName: be-conf
resolveKey: be.conf
Совет

Чтобы смонтировать файл в тот же каталог, что и конфигурацию запуска, поместите его конфигурацию в тот же ConfigMap, который содержит конфигурацию запуска. Ключ в ConfigMap задаёт имя файла, а значение — содержимое конфигурации.

Монтирование нескольких ConfigMap​

Помимо монтирования файлов конфигурации через ConfigMap, Doris Operator позволяет монтировать несколько ConfigMap в разные каталоги контейнера.

Монтирование нескольких ConfigMap для FE

В следующем примере показано, как смонтировать ConfigMap test-fe1 и test-fe2 в каталоги /etc/fe/config1/ и /etc/fe/config2 контейнера FE соответственно:

spec:
feSpec:
configMaps:
- configMapName: test-fe1
mountPath: /etc/fe/config1
- configMapName: test-fe2
mountPath: /etc/fe/config2

В приведённой выше конфигурации yourstorageclass—имя[StorageClass](https://kubernetes.io/docs/concepts/storage/storage−classes/),которыйвыхотитеиспользовать,а{your_storageclass} — имя [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/), который вы хотите использовать, а {storageSize} — требуемый размер хранилища. Формат ${storageSize} соответствует выражению количества в K8s, например: 100Gi. Замените эти значения по необходимости.

Монтирование нескольких ConfigMap для BE

В следующем примере показано, как смонтировать ConfigMap test-be1 и test-be2 в каталоги /etc/be/config1/ и /etc/be/config2 контейнера BE соответственно:

spec:
beSpec:
configMaps:
- configMapName: test-be1
mountPath: /etc/be/config1
- configMapName: test-be2
mountPath: /etc/be/config2

В приведённой выше конфигурации yourstorageclass—имя[StorageClass](https://kubernetes.io/docs/concepts/storage/storage−classes/),которыйвыхотитеиспользовать,а{your_storageclass} — имя [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/), который вы хотите использовать, а {storageSize} — требуемый размер хранилища. Формат ${storageSize} соответствует выражению количества в K8s, например: 100Gi. Замените эти значения по необходимости.

Настройка постоянного хранения​

В кластере Doris компонентам FE и BE необходимо постоянно хранить данные. Kubernetes предоставляет механизм Persistent Volume для сохранения данных в физическом хранилище. В среде Kubernetes Doris Operator использует StorageClass для автоматического создания PersistentVolumeClaim, который привязывается к подходящему PersistentVolume.

Настройка постоянного хранения для FE​

При развёртывании кластера Doris в Kubernetes рекомендуется настроить постоянное хранение для точки монтирования /opt/apache-doris/fe/doris-meta, поскольку этот путь по умолчанию используется для хранения метаданных FE. По умолчанию Doris выводит всю информацию журналов в стандартный вывод (консоль). Если в кластере нет средств сбора журналов, рекомендуется настроить постоянное хранение для точки монтирования /opt/apache-doris/fe/log, чтобы сохранять журналы.

Постоянное хранение метаданных FE​

При использовании файла конфигурации по умолчанию добавьте следующее содержимое в развёрнутый ресурс DorisCluster:

spec:
feSpec:
persistentVolumes:
- mountPath: /opt/apache-doris/fe/doris-meta
name: meta
persistentVolumeClaimSpec:
# when use specific storageclass, the storageClassName should reConfig, example as annotation.
storageClassName: ${your_storageclass}
accessModes:
- ReadWriteOnce
resources:
# notice: if the storage size less 5G, fe will not start normal.
requests:
storage: ${storageSize}

В приведённой выше конфигурации yourstorageclass—имявыбранного[StorageClass](https://kubernetes.io/docs/concepts/storage/storage−classes/),а{your_storageclass} — имя выбранного [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/), а {storageSize} — заданный размер хранилища. Формат соответствует выражению количества в Kubernetes, например: 100Gi.

Постоянное хранение журналов FE​

При использовании файла конфигурации по умолчанию добавьте следующее содержимое в ресурс DorisCluster, который будет развёрнут:

spec:
feSpec:
persistentVolumes:
- mountPath: /opt/apache-doris/fe/log
name: log
persistentVolumeClaimSpec:
# when use specific storageclass, the storageClassName should reConfig, example as annotation.
storageClassName: ${your_storageclass}
accessModes:
- ReadWriteOnce
resources:
# notice: if the storage size less 5G, fe will not start normal.
requests:
storage: ${storageSize}

В приведённой выше конфигурации yourstorageclass—имя[StorageClass](https://kubernetes.io/docs/concepts/storage/storage−classes/),которыйвыхотитеиспользовать,а{your_storageclass} — имя [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/), который вы хотите использовать, а {storageSize} — требуемый размер хранилища. Формат ${storageSize} соответствует выражению количества в Kubernetes, например: 100Gi.

Совет

Если для meta_dir или LOG_DIR заданы другие значения в пользовательском файле конфигурации, измените mountPath соответствующим образом.

Настройка постоянного хранения для BE​

При развёртывании кластера Doris в Kubernetes рекомендуется настроить постоянное хранение для точки монтирования /opt/apache-doris/be/storage, поскольку этот путь по умолчанию используется для хранения данных узлов BE. При развёртывании в Kubernetes Doris по умолчанию выводит всю информацию журналов в стандартный вывод (консоль). Если в кластере нет средств сбора журналов, рекомендуется настроить постоянное хранение для точки монтирования /opt/apache-doris/be/log.

Постоянное хранение данных BE​

  • Путь постоянного хранения по умолчанию

    Если BE использует конфигурацию по умолчанию, добавьте следующее содержимое в развёрнутый ресурс DorisCluster:

    beSpec:
    persistentVolumes:
    - mountPath: /opt/apache-doris/be/storage
    name: be-storage
    persistentVolumeClaimSpec:
    storageClassName: ${your_storageclass}
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: ${storageSize}

    В приведённой выше конфигурации yourstorageclass—имя[StorageClass](https://kubernetes.io/docs/concepts/storage/storage−classes/),которыйвыхотитеиспользовать,а{your_storageclass} — имя [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/), который вы хотите использовать, а {storageSize} — требуемый размер хранилища. Формат соответствует выражению количества в Kubernetes, например: 100Gi.

  • Постоянное хранение с несколькими путями

    Если в пользовательской конфигурации через storage_root_path указано несколько каталогов хранения (например, storage_root_path=/home/disk1/doris.HDD;/home/disk2/doris.SSD), добавьте следующую конфигурацию в развёрнутый ресурс DorisCluster:

    beSpec:
    persistentVolumes:
    - mountPath: /home/disk1/doris
    name: be-storage1
    persistentVolumeClaimSpec:
    storageClassName: ${your_storageclass}
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: ${storageSize}
    - mountPath: /home/disk2/doris
    name: be-storage2
    persistentVolumeClaimSpec:
    storageClassName: ${your_storageclass}
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: ${storageSize}

Постоянное хранение журналов BE​

При использовании файла конфигурации по умолчанию добавьте следующее содержимое в ресурс DorisCluster, который будет развёрнут:

beSpec:
persistentVolumes:
- mountPath: /opt/apache-doris/be/log
name: belog
persistentVolumeClaimSpec:
storageClassName: ${your_storageclass}
accessModes:
- ReadWriteOnce
resources:
requests:
storage: ${storageSize}

В приведённой выше конфигурации yourstorageclass—имя[StorageClass](https://kubernetes.io/docs/concepts/storage/storage−classes/),которыйвыхотитеиспользовать,а{your_storageclass} — имя [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/), который вы хотите использовать, а {storageSize} — требуемый размер хранилища. Формат соответствует выражению количества в Kubernetes, например: 100Gi.

Настройка доступа​

Kubernetes использует Service для предоставления vip и балансировки нагрузки. Service поддерживает три режима предоставления доступа: ClusterIP, NodePort и LoadBalancer.

ClusterIP​

По умолчанию Doris в Kubernetes использует режим доступа ClusterIP. Этот режим предоставляет внутренний адрес в кластере Kubernetes, который используется для доступа к сервису внутри Kubernetes.

Шаг 1: Настройка ClusterIP в качестве типа Service​

Doris по умолчанию включает режим доступа ClusterIP в Kubernetes. Этот режим можно использовать без дополнительных изменений.

Шаг 2: Получение адреса доступа к сервису​

После развёртывания кластера выполните следующую команду, чтобы просмотреть сервисы, предоставляемые Doris Operator:

kubectl -n doris get svc

Результат будет следующим:

NAME                              TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                               AGE
doriscluster-sample-be-internal ClusterIP None <none> 9050/TCP 9m
doriscluster-sample-be-service ClusterIP 10.1.68.128 <none> 9060/TCP,8040/TCP,9050/TCP,8060/TCP 9m
doriscluster-sample-fe-internal ClusterIP None <none> 9030/TCP 14m
doriscluster-sample-fe-service ClusterIP 10.1.118.16 <none> 8030/TCP,9020/TCP,9030/TCP,9010/TCP 14m

В приведённом выше результате у FE и BE есть по два типа Service с суффиксами internal и service соответственно:

Service с суффиксом internal используются только для внутреннего взаимодействия в Doris, например для сигналов heartbeat и обмена данными, и не предоставляют внешний доступ.

Service с суффиксом service используются для доступа к сервисам кластера.

Шаг 3: Доступ к Doris из контейнера​

Используйте следующую команду, чтобы создать Pod с клиентом MySQL в текущем кластере Kubernetes:

kubectl run mysql-client --image=mysql:5.7 -it --rm --restart=Never --namespace=doris -- /bin/bash

Внутри контейнера можно подключиться к кластеру Doris, обратившись к имени Service с суффиксом service:

mysql -uroot -P9030 -hdoriscluster-sample-fe-service

NodePort​

Для доступа к Doris извне кластера Kubernetes можно выбрать режим NodePort. Режим NodePort предоставляет два способа настройки: статическое сопоставление портов хоста и динамическое выделение портов хоста.

  • Динамическое выделение портов хоста: если сопоставление портов не задано явно, при создании pod Kubernetes автоматически выделяет неиспользуемый порт на хосте (диапазон по умолчанию: 30000-32767).

  • Статическое выделение портов хоста: если сопоставление портов задано явно, Kubernetes выделяет указанный фиксированный порт, если он не занят на хосте и конфликтов нет.

При статическом выделении необходимо заранее спланировать сопоставление портов. Doris предоставляет следующие порты для внешнего взаимодействия:

Название портаПорт по умолчаниюОписание порта
Порт запросов9030Используется для доступа к кластеру Doris по протоколу MySQL
Порт HTTP8030Порт HTTP-сервера на FE, используемый для просмотра информации о FE
Порт веб-сервера8040Порт HTTP-сервера на BE, используемый для просмотра информации о BE

Шаг 1: Настройка NodePort для FE и BE​

NodePort для FE

  • Конфигурация динамического выделения:

    spec:
    feSpec:
    service:
    type: NodePort
  • Пример конфигурации статического выделения:

    spec:
    feSpec:
    service:
    type: NodePort
    servicePorts:
    - nodePort: 31001
    targetPort: 8030
    - nodePort: 31002
    targetPort: 9030

NodePort для BE

  • Конфигурация динамического выделения:

    spec:
    beSpec:
    service:
    type: NodePort
  • Пример конфигурации статического выделения:

    beSpec:
    service:
    type: NodePort
    servicePorts:
    - nodePort: 31006
    targetPort: 8040

Шаг 2: Получение Service​

После развёртывания кластера выполните следующую команду для просмотра Service:

kubectl get service

Результат будет следующим:

NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                       AGE
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 169d
doriscluster-sample-fe-internal ClusterIP None <none> 9030/TCP 2d
doriscluster-sample-fe-service NodePort 10.152.183.58 <none> 8030:31041/TCP,9020:30783/TCP,9030:31545/TCP,9010:31610/TCP 2d
doriscluster-sample-be-internal ClusterIP None <none> 9050/TCP 2d
doriscluster-sample-be-service NodePort 10.152.183.244 <none> 9060:30940/TCP,8040:32713/TCP,9050:30621/TCP,8060:30926/TCP 2d

Шаг 3: Доступ к сервису через NodePort​

Рассмотрим подключение MySQL в качестве примера. По умолчанию Doris использует порт запросов 9030. В приведённом выше примере порт 9030 сопоставлен с локальным портом 31545. Для доступа к кластеру Doris необходимо получить IP-адрес узла кластера. Выполните следующую команду для его просмотра:

kubectl get nodes -owide

Результат будет следующим:

NAME   STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE          KERNEL-VERSION          CONTAINER-RUNTIME
r60 Ready control-plane 14d v1.28.2 192.168.88.60 <none> CentOS Stream 8 4.18.0-294.el8.x86_64 containerd://1.6.22
r61 Ready <none> 14d v1.28.2 192.168.88.61 <none> CentOS Stream 8 4.18.0-294.el8.x86_64 containerd://1.6.22
r62 Ready <none> 14d v1.28.2 192.168.88.62 <none> CentOS Stream 8 4.18.0-294.el8.x86_64 containerd://1.6.22
r63 Ready <none> 14d v1.28.2 192.168.88.63 <none> CentOS Stream 8 4.18.0-294.el8.x86_64 containerd://1.6.22

В режиме NodePort можно обращаться к сервисам внутри кластера Kubernetes через IP-адрес любого узла и сопоставленный порт хоста. В этом примере доступны IP-адреса узлов 192.168.88.61, 192.168.88.62 и 192.168.88.63. Следующий пример показывает, как подключиться к Doris через узел 192.168.88.62 и порт хоста 31545, сопоставленный с query port:

mysql -h 192.168.88.62 -P 31545 -uroot

LoadBalancer​

LoadBalancer — балансировщик нагрузки, предоставляемый поставщиком облачных услуг. Эта конфигурация применима только к средам Kubernetes, предоставляемым облачными платформами.

Шаг 1: Настройка режима LoadBalancer​

Настройка LoadBalancer для FE

spec:
feSpec:
service:
type: LoadBalancer

Настройка LoadBalancer для BE

spec:
beSpec:
service:
type: LoadBalancer

Шаг 2: Получение Service​

После развёртывания кластера выполните следующую команду для просмотра Service, предоставляющего доступ к Doris:

kubectl get service

Результат будет следующим:

NAME                              TYPE           CLUSTER-IP       EXTERNAL-IP                                                                     PORT(S)                                                       AGE
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 169d
doriscluster-sample-fe-internal ClusterIP None <none> 9030/TCP 2d
doriscluster-sample-fe-service LoadBalancer 10.152.183.58 ac4828493dgrftb884g67wg4tb68gyut-1137856348.us-east-1.elb.amazonaws.com 8030:31041/TCP,9020:30783/TCP,9030:31545/TCP,9010:31610/TCP 2d
doriscluster-sample-be-internal ClusterIP None <none> 9050/TCP 2d
doriscluster-sample-be-service LoadBalancer 10.152.183.244 ac4828493dgrftb884g67wg4tb68gyut-1137823345.us-east-1.elb.amazonaws.com 9060:30940/TCP,8040:32713/TCP,9050:30621/TCP,8060:30926/TCP 2d

Шаг 3: Доступ в режиме LoadBalancer​

Рассмотрим подключение MySQL в качестве примера:

mysql -h ac4828493dgrftb884g67wg4tb68gyut-1137856348.us-east-1.elb.amazonaws.com -P 31545 -uroot

Настройка имени пользователя и пароля администратора​

Для управления узлами Doris необходимо подключиться к работающему узлу FE по протоколу MySQL с именем пользователя и паролем. В Doris реализован механизм управления правами, подобный RBAC. Для управления узлами пользователь должен иметь право Node_priv. По умолчанию Doris Operator развёртывает кластер, заданный ресурсом DorisCluster, и управляет им с помощью пользователя root, у которого есть все права и не задан пароль. После установки пароля для пользователя root необходимо явно указать в ресурсе DorisCluster имя пользователя и пароль учётной записи с правом Node_Priv, чтобы Doris Operator мог автоматически управлять кластером.

Ресурс DorisCluster предоставляет два способа настройки имени пользователя и пароля для управления узлами кластера: через переменные окружения и через Secret. Есть 3 сценария настройки имени пользователя и пароля администратора кластера:

  • Задать начальный пароль пользователя root при развёртывании кластера.

  • При развёртывании с пользователем root без пароля автоматически создать пользователя с правами администратора, отличного от root.

  • Установить пароль для пользователя root после развёртывания кластера с root без пароля.

Настройка пароля пользователя root при развёртывании кластера​

Doris поддерживает настройку пароля пользователя root в зашифрованном виде в fe.conf. Задайте пароль пользователя root при первом развёртывании Doris, чтобы Doris Operator мог автоматически управлять узлами кластера. Выполните следующие шаги:

Шаг 1: Получение зашифрованного пароля root​

Doris поддерживает установку пароля пользователя root в зашифрованном виде в файле конфигурации FE. Пароль шифруется с помощью двухэтапного SHA-1. Ниже приведены примеры кода:

Реализация на Java:

import org.apache.commons.codec.digest.DigestUtils;

public static void main( String[] args ) {
//the original password
String a = "123456";
String b = DigestUtils.sha1Hex(DigestUtils.sha1(a.getBytes())).toUpperCase();
//output the 2 stage encrypted password.
System.out.println("*"+b);
}

Реализация на Golang:

import (
"crypto/sha1"
"encoding/hex"
"fmt"
"strings"
)

func main() {
//original password
plan := "123456"
//the first stage encryption.
h := sha1.New()
h.Write([]byte(plan))
eb := h.Sum(nil)

//the two stage encryption.
h.Reset()
h.Write(eb)
teb := h.Sum(nil)
dst := hex.EncodeToString(teb)
tes := strings.ToUpper(fmt.Sprintf("%s", dst))
//output the 2 stage encrypted password.
fmt.Println("*"+tes)
}

Поместите зашифрованный пароль в fe.conf в соответствии с требованиями файла конфигурации. Следуя разделу о настройке параметров кластера, передайте файл конфигурации в кластер Kubernetes в виде ConfigMap.

Шаг 2: Подготовка ресурса DorisCluster​

После того как начальный пароль root задан в файле конфигурации, он вступает в силу сразу при запуске первого узла Doris FE. При присоединении последующих узлов к кластеру Doris Operator использует имя пользователя root и его пароль для добавления узлов. Поэтому необходимо указать имя пользователя и пароль в развёртываемом ресурсе DorisCluster, чтобы Doris Operator мог управлять узлами кластера.

  • Через переменные окружения

    Укажите имя пользователя root и пароль в полях ".spec.adminUser.name" и ".spec.adminUser.password" ресурса DorisCluster. Doris Operator автоматически преобразует их в переменные окружения контейнера, а вспомогательные сервисы внутри контейнера используют эти переменные для добавления узлов в кластер. Формат конфигурации:

    spec:
    adminUser:
    name: root
    password: ${password}

    Здесь ${password} — незашифрованный пароль root.

  • Через Secret

    Doris Operator поддерживает указание имени пользователя и пароля для управления с помощью Secret для базовой аутентификации. Doris Operator автоматически монтирует Secret как файл в определённое место в контейнере. Вспомогательные сервисы контейнера извлекают имя пользователя и пароль из файла и используют их для автоматического добавления узлов в кластер. В stringData объекта basic-authentication-secret содержится только 2 поля: username и password. Чтобы настроить имя пользователя и пароль для управления через Secret, выполните следующие действия:

    a. Настройте используемый Secret

    Настройте Secret для базовой аутентификации в следующем формате:

    stringData:
    username: root
    password: ${password}

    Здесь ${password} — незашифрованный пароль, заданный для root. Разверните обновлённый Secret в кластере Kubernetes с помощью следующей команды.

    kubectl -n ${namespace} apply -f ${secretFileName}.yaml

    Здесь ${namespace} — пространство имён, в котором будет развёрнут ресурс DorisCluster, а ${secretFileName} — имя файла Secret для развёртывания.

    b. Настройте ресурс DorisCluster

    Укажите используемый Secret в ресурсе DorisCluster, который будет развёрнут. Конфигурация:

    spec:
    authSecret: ${secretName}

    Здесь ${secretName} — имя Secret, содержащего имя пользователя root и его пароль.

При первом развёртывании, если вы не задаёте начальный пароль root, укажите пользователя, отличного от root, и пароль для входа через переменные окружения или Secret. Вспомогательный сервис в контейнере Doris автоматически создаст этого пользователя в Doris, установит пароль и предоставит право Node_priv. Затем Doris Operator будет использовать автоматически созданное имя пользователя и пароль для управления узлами кластера.

  • Через переменные окружения

    Настройте ресурс DorisCluster для развёртывания в следующем формате:

    spec:
    adminUser:
    name: ${DB_ADMIN_USER}
    password: ${DB_ADMIN_PASSWD}

    Здесь ${DB_ADMIN_USER} — имя нового пользователя с правами администратора, а ${DB_ADMIN_PASSWD} — пароль нового пользователя.

  • Через Secret

    a. Настройте используемый Secret

    Настройте Secret для базовой аутентификации в следующем формате:

    stringData:
    username: ${DB_ADMIN_USER}
    password: ${DB_ADMIN_PASSWD}

    Здесь ${DB_ADMIN_USER} — имя нового пользователя, а ${DB_ADMIN_PASSWD} — пароль, заданный для нового пользователя.

    Используйте следующую команду для развёртывания Secret в кластере Kubernetes:

    kubectl -n ${namespace} apply -f ${secretFileName}.yaml

    Здесь ${namespace} — пространство имён, в котором развёрнут ресурс DorisCluster, а ${secretFileName} — имя файла Secret для развёртывания.

    b. Обновите ресурс DorisCluster

    Укажите используемый Secret в ресурсе DorisCluster следующим образом:

    spec:
    authSecret: ${secretName}

    Здесь ${secretName} — имя развёрнутого Secret для базовой аутентификации.

Совет
  • После развёртывания задайте пароль root. Doris Operator переключится на управление узлами кластера с помощью нового пользователя и пароля. Не удаляйте созданного пользователя.

Установка пароля пользователя root после развёртывания кластера​

Если после развёртывания кластера Doris пароль пользователя root не задан, необходимо настроить пользователя с правом Node_priv, чтобы Doris Operator мог автоматически управлять узлами кластера. Рекомендуется не использовать пользователя root. Создайте нового пользователя и предоставьте ему право Node_priv, следуя разделу о создании пользователей и предоставлении прав. После создания пользователя настройте имя нового администратора и пароль через переменные окружения или Secret и укажите их в ресурсе DorisCluster.

Шаг 1: Создание пользователя с правом Node_priv​

После подключения к базе данных по протоколу MySQL выполните следующую команду, чтобы создать пользователя только с правом Node_priv и задать пароль.

CREATE USER '${DB_ADMIN_USER}' IDENTIFIED BY '${DB_ADMIN_PASSWD}';

Здесь DBADMINUSER—имясоздаваемогопользователя,а{DB_ADMIN_USER} — имя создаваемого пользователя, а {DB_ADMIN_PASSWD} — пароль, который нужно задать.

Шаг 2: Предоставление права Node_priv новому пользователю​

После подключения к базе данных по протоколу MySQL выполните следующую команду, чтобы предоставить новому пользователю право Node_priv.

GRANT NODE_PRIV ON *.*.* TO ${DB_ADMIN_USER};

Здесь ${DB_ADMIN_USER} — имя созданного пользователя.

Подробнее о создании пользователей, установке паролей и предоставлении прав см. в официальной документации CREATE-USER.

Шаг 3: Настройка ресурса DorisCluster​

  • Через переменные окружения

    Укажите созданного пользователя и пароль в ресурсе DorisCluster следующим образом:

    spec:
    adminUser:
    name: ${DB_ADMIN_USER}
    password: ${DB_ADMIN_PASSWD}

    Здесь DBADMINUSER—имясозданногопользователя,а{DB_ADMIN_USER} — имя созданного пользователя, а {DB_ADMIN_PASSWD} — пароль, заданный для нового пользователя.

  • Через Secret

    a. Настройте Secret

    Создайте Secret для базовой аутентификации в следующем формате:

    stringData:
    username: ${DB_ADMIN_USER}
    password: ${DB_ADMIN_PASSWD}

    Здесь DBADMINUSER—имясозданногопользователя,а{DB_ADMIN_USER} — имя созданного пользователя, а {DB_ADMIN_PASSWD} — пароль, заданный для нового пользователя.

    Используйте следующую команду для развёртывания Secret в кластере Kubernetes:

    kubectl -n ${namespace} apply -f ${secretFileName}.yaml

    Здесь ${namespace} — пространство имён, в котором развёрнут ресурс DorisCluster, а ${secretFileName} — имя файла Secret для развёртывания.

    b. Обновите ресурс DorisCluster, использующий Secret

    Укажите используемый Secret в ресурсе DorisCluster следующим образом:

    spec:
    authSecret: ${secretName}

    Здесь ${secretName} — имя развёрнутого Secret для базовой аутентификации.

Совет
  • После развёртывания установка пароля root и настройка имени нового администратора и пароля вызовут один последовательный перезапуск существующих сервисов.

Автоматический перезапуск сервиса для применения изменений конфигурации запуска​

Doris задаёт параметры запуска через файлы конфигурации. Большинство параметров можно изменить через соответствующий веб-интерфейс, и изменения вступят в силу в реальном времени. Для применения некоторых параметров, которые нельзя изменить через веб-интерфейс, требуется перезапуск сервиса. Начиная с версии 25.1.0, Doris Operator поддерживает автоматический перезапуск для применения изменений параметров запуска сервисов. Включите эту возможность в ресурсе DorisCluster следующим образом:

spec:
enableRestartWhenConfigChange: true

Если ресурс DorisCluster содержит приведённую выше конфигурацию, Doris Operator действует следующим образом:

  1. Отслеживает изменения конфигурации запуска, от которой зависит кластер, развёрнутый с помощью ресурса DorisCluster (конфигурация монтируется через ConfigMap; подробнее см. в разделе «Пользовательская конфигурация запуска»).
  2. После изменения конфигурации запуска автоматически перезапускает соответствующий сервис, чтобы конфигурация вступила в силу.

Пример использования​

Отслеживание ConfigMap и перезапуск поддерживаются для узлов FE и BE. Ниже приведён пример для FE.

  1. Спецификация развёртывания DorisCluster выглядит следующим образом:
    spec:
    enableRestartWhenConfigChange: true
    feSpec:
    image: apache/doris:fe-2.1.8
    replicas: 1
    configMapInfo:
    configMapName: fe-configmap
  2. Обновите конфигурацию запуска сервиса FE, указанную в fe-configmap. После обновления значения с ключом fe.conf в fe-configmap (конфигурации запуска сервиса FE) Doris Operator автоматически выполнит последовательный перезапуск сервиса FE, чтобы конфигурация вступила в силу.

Использование аутентификации Kerberos​

Начиная с версии 25.2.0, Doris Operator поддерживает аутентификацию Kerberos для Doris (версий 2.1.9 и 3.0.4 и выше) в Kubernetes. Для аутентификации Kerberos в Doris требуются krb5.conf и файл keytab. Doris Operator использует ресурс ConfigMap для монтирования файла krb5.conf и ресурс Secret для монтирования файла keytab. Чтобы использовать аутентификацию Kerberos, выполните следующие действия:

  1. Создайте ConfigMap, содержащий файл krb5.conf:
    kubectl create -n ${namespace} create configmap ${name} --from-file=krb5.conf
    namespace—пространствоимён,вкоторомразвёрнут‘DorisCluster‘,а{namespace} — пространство имён, в котором развёрнут `DorisCluster`, а {name} — желаемое имя ConfigMap.
  2. Создайте Secret, содержащий keytab:
    kubectl create -n ${namespace} secret generic ${name} --from-file= ${xxx.keytab}
    namespace—пространствоимён,вкоторомразвёрнут‘DorisCluster‘,а{namespace} — пространство имён, в котором развёрнут `DorisCluster`, а {name} — желаемое имя Secret. Чтобы смонтировать несколько файлов keytab, следуйте документации kubectl create Secret и поместите несколько файлов keytab в один Secret.
  3. Настройте ресурс DorisCluster и укажите ConfigMap, содержащий krb5.conf, и Secret, содержащий файл keytab.
    spec:
    kerberosInfo:
    krb5ConfigMap: ${krb5ConfigMapName}
    keytabSecretName: ${keytabSecretName}
    keytabPath: ${keytabPath}
    krb5ConfigMapName—имяConfigMap,содержащегоиспользуемыйфайл‘krb5.conf‘.{krb5ConfigMapName} — имя ConfigMap, содержащего используемый файл `krb5.conf`. {keytabSecretName} — имя Secret, содержащего файл keytab. ${keytabPath} — путь монтирования Secret в контейнере. Это каталог, в котором находится файл keytab и который указывается в hadoop.kerberos.keytab при создании Catalog. О создании Catalog см. в документации Hive Catalog.

Настройка общего хранилища​

Начиная с версии 25.4.0, Doris Operator поддерживает монтирование общего хранилища ReadWriteMany во все Pod нескольких компонентов. Перед использованием заранее создайте ресурсы PersistentVolume и PersistentVolumeClaim для общего хранилища. Перед развёртыванием кластера Doris настройте ресурс DorisCluster следующим образом:

spec:
sharedPersistentVolumeClaims:
- mountPath: ${mountPath}
persistentVolumeClaimName: ${sharedPVCName}
supportComponents:
- fe
- be
  • ${mountPath} задаёт абсолютный путь монтирования в контейнере.
  • ${sharedPVCName} — имя монтируемого PersistentVolumeClaim.
  • supportComponents задаёт имена компонентов, которым необходимо смонтировать это общее хранилище. В приведённом выше примере монтирование общего хранилища задано для FE и BE. Если массив supportComponents пуст, общее хранилище монтируется во все развёрнутые компоненты.
Совет

mountPath поддерживает использование ${DORIS_HOME} в качестве префикса пути. Когда mountPath использует ${DORIS_HOME} в качестве префикса, в контейнере FE ${DORIS_HOME} обозначает /opt/apache-doris/fe, а в контейнере BE ${DORIS_HOME} обозначает /opt/apache-doris/be.

Настройка тайм-аутов проверок​

DorisCluster предоставляет два параметра тайм-аута проверок для каждого сервиса: тайм-аут проверки запуска (startup probe) и тайм-аут проверки работоспособности (liveness probe). Если время запуска сервиса превышает заданный тайм-аут проверки запуска, считается, что сервис не смог запуститься, и он перезапускается. Если сервис не отвечает в течение тайм-аута проверки работоспособности, Pod автоматически перезапускается.

Настройка тайм-аута проверки запуска​

  • Настройка тайм-аута проверки запуска сервиса FE
    spec:
    feSpec:
    startTimeout: 3600
    Приведённая выше конфигурация задаёт тайм-аут запуска FE равным 3600 секундам.
  • Настройка тайм-аута проверки запуска сервиса BE
    spec:
    beSpec:
    startTimeout: 3600
    Приведённая выше конфигурация задаёт тайм-аут запуска BE равным 3600 секундам.

Настройка тайм-аута проверки работоспособности​

  • Настройка тайм-аута проверки работоспособности сервиса FE
    spec:
    feSpec:
    liveTimeout: 60
    Приведённая выше конфигурация задаёт тайм-аут проверки работоспособности FE равным 60 секундам.
  • Настройка тайм-аута проверки работоспособности сервиса BE
    spec:
    beSpec:
    liveTimeout: 60
    Приведённая выше конфигурация задаёт тайм-аут проверки работоспособности BE равным 60 секундам.
На этой странице