
Как запустить Seatunnel в разделенном режиме кластера на K8s
7 августа 2025 г.Apache Seatunnel-это новое поколение высокопроизводительного, распределенного интеграции данных и инструмента синхронизации данных, который был широко признан и применяется в отрасли. Seatunnel поддерживает три режима развертывания: локальный режим, гибридный режим кластера и разделенный режим кластера.
Эта статья направлена на то, чтобы ввести развертывание Seatunnel в разделенном режиме кластера в Kubernetes, предоставляя комплексный процесс развертывания и примеры конфигурации для тех, кто имеет соответствующие потребности.
1. Подготовка
Перед началом развертывания должны быть готовы следующие среды и компоненты:
- Кластерная среда Kubernetes
- Kubectl Commandline Tool
- докер
- Хелм (необязательно)
Для тех, кто знаком с рулем, вы можете напрямую обратиться к официальному учебному пособию по развертыванию управления:
- https://seatunnel.apache.org/docs/2.3.10/start-v2/kubernetes/helm
- https://github.com/apache/seatunnel/tree/dev/deploy/kubernetes/seatunnel
Эта статья в основном вводит развертывание на основе инструментов Kubernetes и Kubectl.
2. Строите Seatunnel Docker Image
Официальные изображения различных версий уже предоставлены и могут быть вытянуты напрямую. Для получения подробной информации, пожалуйста, обратитесь к официальной документации:Установка с DockerПолем
docker pull apache/seatunnel:<version_tag>
Поскольку нам нужно развернуть режим кластера, следующим шагом является настройка коммуникации сети кластеров. Сетевая служба кластера Seatunnel реализована черезХейзелкас, поэтому мы настроим эту часть следующей.
3. Конфигурация связанной с кластером Hazelcast Cluster
Конфигурация службы без головы
Hazelcast Cluster - это сеть, созданная членами кластера, работающего в Hazelcast, которая автоматически объединяется, чтобы сформировать кластер. Это автоматическое соединение достигается с помощью различных механизмов обнаружения, используемых членами кластера, чтобы найти друг друга.
Hazelcast поддерживает следующие механизмы открытия:
- Auto Discovery, вспомогательные среды, такие как:
- AWS
- Лазур
- GCP
- Kubernetes
- TCP
- Многоадресная расстояния
- Эврика
- Зокепер
В развертывании кластера этой статьи мы настраиваем Hazelcast с помощью механизма Auto Discovery Kubernetes. Подробные принципы можно найти в официальном документе:Kubernetes Auto DiscoveryПолем
Механизм Auto Discovery от Hazelcast (режим поиска DNS) требует работы Kubernetes без головы. Сервис без головы разрешает имя домена службы в список IP -адресов всех соответствующих стручков, что позволяет участникам Hazelcast Cluster открывать друг друга.
Во -первых, мы создаем сервис Kubernetes без головы:
# use for hazelcast cluster join
apiVersion: v1
kind: Service
metadata:
name: seatunnel-cluster
spec:
type: ClusterIP
clusterIP: None
selector:
app.kubernetes.io/instance: seatunnel-cluster-app
app.kubernetes.io/version: 2.3.10
ports:
- port: 5801
name: hazelcast
Ключевые части вышеуказанной конфигурации:
metadata.name: seatunnel-cluster
: Имя сервиса, клиенты/узлы Hazelcast обнаруживают членов кластера через это имяspec.clusterIP: None
: Критическая конфигурация объявляет об этом как безголовой сервис без виртуального IPspec.selector
: Селекторные соответствующие метки POD, которые будут выбраны этой службойspec.port
: Порт, выставлен для Hazelcast
Между тем, чтобы получить доступ к кластеру внешне через API REST, мы определяем другую службу для мастер -узла:
# use for access seatunnel from outside system via rest api
apiVersion: v1
kind: Service
metadata:
name: seatunnel-cluster-master
spec:
type: ClusterIP
clusterIP: None
selector:
app.kubernetes.io/instance: seatunnel-cluster-app
app.kubernetes.io/version: 2.3.10
app.kubernetes.io/name: seatunnel-cluster-master
app.kubernetes.io/component: master
ports:
- port: 8080
name: "master-port"
targetPort: 8080
protocol: TCP
После определения вышеуказанных служб Kubernetes, затем настройкаhazelcast-master.yaml
иhazelcast-worker.yaml
Файлы в соответствии с механизмом обнаружения Hazelcast Kubernetes.
Hazelcast Master и работник Yaml Configurations
В разделенном режиме кластера Seatunnel все конфигурации, связанная с сетью, содержатся вhazelcast-master.yaml
иhazelcast-worker.yaml
Полем
hazelcast-master.yaml
пример:
hazelcast:
cluster-name: seatunnel-cluster
network:
rest-api:
enabled: true
endpoint-groups:
CLUSTER_WRITE:
enabled: true
DATA:
enabled: true
join:
kubernetes:
enabled: true
service-dns: seatunnel-cluster.bigdata.svc.cluster.local
service-port: 5801
port:
auto-increment: false
port: 5801
properties:
hazelcast.invocation.max.retry.count: 20
hazelcast.tcp.join.port.try.count: 30
hazelcast.logging.type: log4j2
hazelcast.operation.generic.thread.count: 50
hazelcast.heartbeat.failuredetector.type: phi-accrual
hazelcast.heartbeat.interval.seconds: 30
hazelcast.max.no.heartbeat.seconds: 300
hazelcast.heartbeat.phiaccrual.failuredetector.threshold: 15
hazelcast.heartbeat.phiaccrual.failuredetector.sample.size: 200
hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis: 200
Элементы конфигурации ключей:
- кластер-имени
- Эта конфигурация идентифицирует, принадлежат ли несколько узлов один и тот же кластер; Только узлы с той же кластерной именем присоединятся к тому же кластеру Hazelcast. Различные узлы кластерной имени отклоняют запросы друг от друга.
- Сетевая конфигурация
- REST-API.ENABLEABLE: служба REST HAZELCAST отключена по умолчанию в ST 2.3.10; Это должно быть явно включено здесь.
- Service-DNS (требуется): полное доменное имя сервиса без головы, как правило,
${SERVICE-NAME}.${NAMESPACE}.svc.cluster.local
Полем - Service-Port (необязательно): порт Hazelcast; Если указано и> 0, переопределяет порт по умолчанию (5701).
Используя этот механизм Kubernetes, когда начинается стручка Hazelcast, он разрешает службу DNS, чтобы получить список IP всех элементов членов (через службу без головы), а затем участники пытаются соединения TCP через порт 5801.
Точно так жеhazelcast-worker.yaml
Конфигурация:
hazelcast:
cluster-name: seatunnel-cluster
network:
rest-api:
enabled: true
endpoint-groups:
CLUSTER_WRITE:
enabled: true
DATA:
enabled: true
join:
kubernetes:
enabled: true
service-dns: seatunnel-cluster.bigdata.svc.cluster.local
service-port: 5801
port:
auto-increment: false
port: 5801
properties:
hazelcast.invocation.max.retry.count: 20
hazelcast.tcp.join.port.try.count: 30
hazelcast.logging.type: log4j2
hazelcast.operation.generic.thread.count: 50
hazelcast.heartbeat.failuredetector.type: phi-accrual
hazelcast.heartbeat.interval.seconds: 30
hazelcast.max.no.heartbeat.seconds: 300
hazelcast.heartbeat.phiaccrual.failuredetector.threshold: 15
hazelcast.heartbeat.phiaccrual.failuredetector.sample.size: 200
hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis: 200
member-attributes:
rule:
type: string
value: worker
Через вышесказанное мы завершаем конфигурацию обнаружения участника Hazelcast Cluster на основе Kubernetes. Далее приступите к настройке Seatunnel Engine.
4. Настройка двигателя Seatunnel
Конфигурация, связанная с двигателем Seatunnel, находится вseatunnel.yaml
файл. Ниже приведен образецseatunnel.yaml
Конфигурация для справки:
seatunnel:
engine:
history-job-expire-minutes: 1440
backup-count: 1
queue-type: blockingqueue
print-execution-info-interval: 60
print-job-metrics-info-interval: 60
classloader-cache-mode: true
http:
enable-http: true
port: 8080
enable-dynamic-port: false
port-range: 100
slot-service:
dynamic-slot: true
checkpoint:
interval: 300000
timeout: 60000
storage:
type: hdfs
max-retained: 3
plugin-config:
namespace: /tmp/seatunnel/checkpoint_snapshot
storage.type: hdfs
fs.defaultFS: hdfs://xxx:8020 # Ensure directory has write permission
telemetry:
metric:
enabled: true
Это включает в себя следующую информацию о конфигурации:
history-job-expire-minutes
: Период хранения записей истории задач составляет 24 часа (1440 минут), после чего они будут автоматически очищены.backup-count: 1
: Количество резервных копий для состояния задачи составляет 1.queue-type: blockingqueue
: Используйте блокирующую очередь для управления задачами, чтобы избежать истощения ресурсов.print-execution-info-interval: 60
: Статус выполнения задачи печати каждые 60 секунд.print-job-metrics-info-interval: 60
: Выходные метрики задачи (такие как пропускная способность, задержка) каждые 60 секунд.classloader-cache-mode: true
: Включить кэширование загрузчика класса, чтобы уменьшить повторную нагрузку на нагрузку и улучшить производительность.dynamic-slot: true
: Разрешить динамическую настройку количества слота задачи на основе нагрузки для оптимизации использования ресурсов.checkpoint.interval: 300000
: Триггер -контрольная точка каждые 5 минут.checkpoint.timeout: 60000
: Тайм -аут контрольного точка установлен на 1 минуту.telemetry.metric.enabled: true
: Включить сбор метриков задач выполнения (например, задержка, пропускная способность) для мониторинга.
5. Создайте файлы kubernetes yaml для развертывания приложения
После завершения вышеуказанного рабочего процесса, окончательным шагом является создание файлов Kubernetes YAML для мастера и рабочих узлов, определяющих конфигурации, связанные с развертыванием.
Чтобы отделить файлы конфигурации из приложения, вышеупомянутые файлы конфигурации объединяются в одну конфигурацию, установленную под пути конфигурации контейнера для унифицированного управления и более легких обновлений.
Ниже приведены примеры конфигураций дляseatunnel-cluster-master.yaml
иseatunnel-cluster-worker.yaml
, покрытие монтажа ConfigMap, команды запуска контейнеров и определения ресурсов развертывания.
seatunnel-cluster-master.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: seatunnel-cluster-master
spec:
replicas: 2 # modify replicas according to your scenario
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 50%
selector:
matchLabels:
app.kubernetes.io/instance: seatunnel-cluster-app
app.kubernetes.io/version: 2.3.10
app.kubernetes.io/name: seatunnel-cluster-master
app.kubernetes.io/component: master
template:
metadata:
annotations:
prometheus.io/path: /hazelcast/rest/instance/metrics
prometheus.io/port: "5801"
prometheus.io/scrape: "true"
prometheus.io/role: "seatunnel-master"
labels:
app.kubernetes.io/instance: seatunnel-cluster-app
app.kubernetes.io/version: 2.3.10
app.kubernetes.io/name: seatunnel-cluster-master
app.kubernetes.io/component: master
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nodeAffinity-key
operator: Exists
containers:
- name: seatunnel-master
image: seatunnel:2.3.10
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5801
name: hazelcast
- containerPort: 8080
name: "master-port"
command:
- /opt/seatunnel/bin/seatunnel-cluster.sh
- -r
- master
resources:
requests:
cpu: "1"
memory: 4G
volumeMounts:
- mountPath: "/opt/seatunnel/config/hazelcast-master.yaml"
name: seatunnel-configs
subPath: hazelcast-master.yaml
- mountPath: "/opt/seatunnel/config/hazelcast-worker.yaml"
name: seatunnel-configs
subPath: hazelcast-worker.yaml
- mountPath: "/opt/seatunnel/config/seatunnel.yaml"
name: seatunnel-configs
subPath: seatunnel.yaml
- mountPath: "/opt/seatunnel/config/hazelcast-client.yaml"
name: seatunnel-configs
subPath: hazelcast-client.yaml
- mountPath: "/opt/seatunnel/config/log4j2_client.properties"
name: seatunnel-configs
subPath: log4j2_client.properties
- mountPath: "/opt/seatunnel/config/log4j2.properties"
name: seatunnel-configs
subPath: log4j2.properties
volumes:
- name: seatunnel-configs
configMap:
name: seatunnel-cluster-configs
Стратегия развертывания
- Используйте несколько реплик (
replicas=2
) для обеспечения высокой доступности обслуживания. - Используйте стратегию обновления Rolling для развертывания нуля простоя:
maxUnavailable: 25%
: Убедитесь, что не менее 75% стручков работают во время обновлений.maxSurge: 50%
: Временно разрешайте на 50% больше стручков во время перехода для плавного обновления.
Шелекторы метки
- Используйте рекомендованные kubernetesСтандартная система метки
spec.selector.matchLabels
: Определяет объем стручков, управляемых развертыванием на основе этикетокspec.template.labels
: метки, назначенные новым стручкам для определения их метаданных
Аффинность узла
- Настройка
affinity
Чтобы указать, какие узлы должны быть запланированы POD - Заменять
nodeAffinity-key
с этикетками, соответствующими ваших узлам среды Kubernetes
Монтаж файла конфигурации
- Централизовать файлы конфигурации основной конфигурации в конфигурации для отделения управления из приложений
- Использовать
subPath
Для установки отдельных файлов из configmap
Аseatunnel-cluster-worker.yaml
Конфигурация:
apiVersion: apps/v1
kind: Deployment
metadata:
name: seatunnel-cluster-worker
spec:
replicas: 3 # modify replicas according to your scenario
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 50%
selector:
matchLabels:
app.kubernetes.io/instance: seatunnel-cluster-app
app.kubernetes.io/version: 2.3.10
app.kubernetes.io/name: seatunnel-cluster-worker
app.kubernetes.io/component: worker
template:
metadata:
annotations:
prometheus.io/path: /hazelcast/rest/instance/metrics
prometheus.io/port: "5801"
prometheus.io/scrape: "true"
prometheus.io/role: "seatunnel-worker"
labels:
app.kubernetes.io/instance: seatunnel-cluster-app
app.kubernetes.io/version: 2.3.10
app.kubernetes.io/name: seatunnel-cluster-worker
app.kubernetes.io/component: worker
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nodeAffinity-key
operator: Exists
containers:
- name: seatunnel-worker
image: seatunnel:2.3.10
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5801
name: hazelcast
command:
- /opt/seatunnel/bin/seatunnel-cluster.sh
- -r
- worker
resources:
requests:
cpu: "1"
memory: 10G
volumeMounts:
- mountPath: "/opt/seatunnel/config/hazelcast-master.yaml"
name: seatunnel-configs
subPath: hazelcast-master.yaml
- mountPath: "/opt/seatunnel/config/hazelcast-worker.yaml"
name: seatunnel-configs
subPath: hazelcast-worker.yaml
- mountPath: "/opt/seatunnel/config/seatunnel.yaml"
name: seatunnel-configs
subPath: seatunnel.yaml
- mountPath: "/opt/seatunnel/config/hazelcast-client.yaml"
name: seatunnel-configs
subPath: hazelcast-client.yaml
- mountPath: "/opt/seatunnel/config/log4j2_client.properties"
name: seatunnel-configs
subPath: log4j2_client.properties
- mountPath: "/opt/seatunnel/config/log4j2.properties"
name: seatunnel-configs
sub
subPath: log4j2.properties
volumes:
- name: seatunnel-configs
configMap:
name: seatunnel-cluster-configs
После определения вышеуказанных файлов Master и Worker Yaml вы можете развернуть их в кластере Kubernetes, запустив:
kubectl apply -f seatunnel-cluster-master.yaml
kubectl apply -f seatunnel-cluster-worker.yaml
При нормальных обстоятельствах вы увидите кластер Seatunnel, работающий с 2 главными узлами и 3 рабочими узлами:
$ kubectl get pods | grep seatunnel-cluster
seatunnel-cluster-master-6989898f66-6fjz8 1/1 Running 0 156m
seatunnel-cluster-master-6989898f66-hbtdn 1/1 Running 0 155m
seatunnel-cluster-worker-87fb469f7-5c96x 1/1 Running 0 156m
seatunnel-cluster-worker-87fb469f7-7kt2h 1/1 Running 0 155m
seatunnel-cluster-worker-87fb469f7-drm9r 1/1 Running 0 156m
На этом этапе мы успешно развернули кластер Seatunnel в Kubernetes, используя разделенный режим кластера. Теперь, когда кластер готов, как клиенты отправляют на него рабочие места?
6. Клиент подчиняется заданиям в кластер
Отправить задания, используя инструмент командной строки
Все клиентские конфигурации для Seatunnel расположены вhazelcast-client.yaml
файл.
Сначала загрузите бинарный пакет установки локально на клиент (который содержитbin
иconfig
каталоги) и убедитесь, что путь установки Seatunnel соответствует серверу. Это то, что официальная документация относится как к: установление Seatunnel_home, так же, как сервер, в противном случае ошибки, такие как «не могут найти путь плагина разъема на сервере», может произойти, потому что путь плагина на стороне сервера отличается от пути клиента.
Введите каталог установки и изменитеconfig/hazelcast-client.yaml
Файл, чтобы указывать на адрес службы без головы, созданный ранее:
hazelcast-client:
cluster-name: seatunnel-cluster
properties:
hazelcast.logging.type: log4j2
connection-strategy:
connection-retry:
cluster-connect-timeout-millis: 3000
network:
cluster-members:
- seatunnel-cluster.bigdata.svc.cluster.local:5801
После того, как конфигурация клиента будет выполнена, вы можете отправить задания в кластер. Есть два основных способа настройки вариантов JVM для подачи работы:
- Настроить параметры JVM в
config/jvm_client_options
файл: - Параметры JVM, настроенные здесь, будут применяться ко всем заданиям, представленным через
seatunnel.sh
, независимо от работы в локальном или кластерном режиме. Все представленные задания поделится одной и той же конфигурацией JVM. - Укажите параметры JVM непосредственно в командной строке при отправке заданий:
- При отправке рабочих мест через
seatunnel.sh
, вы можете указать параметры JVM в командной строке, например, sh bin/seatunnel.sh --config $SEATUNNEL_HOME/config/v2.batch.config.template -DJvmOption=-Xms2G -Xmx2G
Полем- Это позволяет определять варианты JVM индивидуально для каждой подачи задания.
Далее, вот пример конфигурации задания, чтобы продемонстрировать отправку задания в кластер:
env {
parallelism = 2
job.mode = "STREAMING"
checkpoint.interval = 2000
}
source {
FakeSource {
parallelism = 2
plugin_output = "fake"
row.num = 16
schema = {
fields {
name = "string"
age = "int"
}
}
}
}
sink {
Console {
}
}
Используйте следующую команду на клиенте, чтобы отправить задание:
sh bin/seatunnel.sh --config config/v2.streaming.example.template -m cluster -n st.example.template -DJvmOption="-Xms2G -Xmx2G"
На главном узле перечислите задание с:
$ sh bin/seatunnel.sh -l
Job ID Job Name Job Status Submit Time Finished Time
------------------ ------------------- ---------- ----------------------- -----------------------
964354250769432580 st.example.template RUNNING 2025-04-15 10:39:30.588
Вы можете увидеть работу по имениst.example.template
в настоящее время находится в состоянии бега. В журналах узлов работников вы должны наблюдать за записями журнала, например:
2025-04-15 10:34:41,998 INFO [.a.s.c.s.c.s.ConsoleSinkWriter] [st-multi-table-sink-writer-1] - subtaskIndex=0 rowIndex=1: SeaTunnelRow#tableId=fake SeaTunnelRow#kind=INSERT : bdaUB, 110348049
2025-04-15 10:34:41,998 INFO [.a.s.c.s.c.s.ConsoleSinkWriter] [st-multi-table-sink-writer-1] - subtaskIndex=1 rowIndex=1: SeaTunnelRow#tableId=fake SeaTunnelRow#kind=INSERT : mOifY, 1974539087
2025-04-15 10:34:41,999 INFO [.a.s.c.s.c.s.ConsoleSinkWriter] [st-multi-table-sink-writer-1] - subtaskIndex=0 rowIndex=2: SeaTunnelRow#tableId=fake SeaTunnelRow#kind=INSERT : jKFrR, 1828047742
2025-04-15 10:34:41,999 INFO [.a.s.c.s.c.s.ConsoleSinkWriter] [st-multi-table-sink-writer-1] - subtaskIndex=1 rowIndex=2: SeaTunnelRow#tableId=fake SeaTunnelRow#kind=INSERT : gDiqR, 1177544796
2025-04-15 10:34:41,999 INFO [.a.s.c.s.c.s.ConsoleSinkWriter] [st-multi-table-sink-writer-1] - subtaskIndex=0 rowIndex=3: SeaTunnelRow#tableId=fake SeaTunnelRow#kind=INSERT : bCVxc, 909343602
...
Это подтверждает, что работа была успешно представлена в кластер Seatunnel и работает нормально.
Отправить задания, используя API REST
Seatunnel также предоставляет API REST для запроса статуса работы, статистики, отправки и остановки работ. Мы настроили службу без головы для главных узлов с открытым портом 8080. Это позволяет отправлять задание через API REST от клиентов.
Вы можете отправить задание, загрузив файл конфигурации через Curl:
curl 'http://seatunnel-cluster-master.bigdata.svc.cluster.local:8080/submit-job/upload' --form 'config_file=@"/opt/seatunnel/config/v2.streaming.example.template"' --form 'jobName=st.example.template'
{"jobId":"964553575034257409","jobName":"st.example.template"}
Если подача успеха, API возвращает идентификатор задания и название задания, как указано выше.
Чтобы перечислить работу по работе, запрос:
curl 'http://seatunnel-cluster-master.bigdata.svc.cluster.local:8080/running-jobs'
[{"jobId":"964553575034257409","jobName":"st.example.template","jobStatus":"RUNNING","envOptions":{"job.mode":"STREAMING","checkpoint.interval":"2000","parallelism":"2"}, ...}]
Ответ показывает статус задания и дополнительные метаданные, подтверждая, что метод подачи задания REST работает правильно.
Более подробную информацию об API остальных можно найти в официальной документации:RESTFUL API V2
7. Резюме
Эта статья была посвящена тому, как развернуть Seatunnel в Kubernetes, используя рекомендуемый разделенный режим кластера. Подводя итог, основные этапы развертывания включают:
- Подготовьте среду Kubernetes: убедитесь, что установлен работает кластер Kubernetes и необходимые инструменты.
- Строите Seatunnel Docker Images: Используйте официальное изображение, если не требуется индивидуальная разработка; В противном случае постройте локально и создайте свой собственный образ.
- Настройка безголовного обслуживания и кластера Hazelcast: Kubercast Kubernetes Auto-Discovery DNS Режим поиска DNS требует службы без головы Kubernetes, поэтому создайте безголую сервис и настройка Hazelcast с помощью DNS Service DNS. Безголовный сервис решается для всех IPS для всех стручков, чтобы позволить обнаружению участника Hazelcast Cluster Discovery.
- Настройте Seatunnel Engine: изменить
seatunnel.yaml
Чтобы установить параметры двигателя. - Создайте Kubernetes развертывание файлов YAML: определите развертывание мастера и работников с помощью селекторов узлов, команд запуска, ресурсов и томов, а затем развернуть в Kubernetes.
- Настройте клиент Seatunnel: установите Seatunnel на клиенту, убедитесь
SEATUNNEL_HOME
соответствует серверу и настраиваетhazelcast-client.yaml
Чтобы подключиться к кластеру. - Отправить и запустить задание: отправьте задания от клиента в кластер Seatunnel для выполнения.
Конфигурации и случаи, представленные здесь, служат ссылками. Там может быть много других параметров конфигурации и деталей, не охваченных. Отзывы и дискуссии приветствуются. Надеюсь, это полезно для всех!
Оригинал