SeaTunnel Kubernetes 混合集群模式部署指南:Master 与 Worker 同进程的高可用集群搭建
2026/9/20 3:20:10 网站建设 项目流程

SeaTunnel Kubernetes 混合集群模式部署指南:Master 与 Worker 同进程的高可用集群搭建

【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnel

本篇技术指南以 SeaTunnel Engine 的混合集群模式(Hybrid Cluster Mode)为主题,完整讲解如何在 Kubernetes 中通过 StatefulSet、Headless Service 与 ConfigMap 搭建一个"Master 与 Worker 运行于同一进程"的多节点集群,涵盖 Hazelcast 成员发现、RBAC 授权、健康检查与优雅停止、REST API 验证等全流程。读完本文,你将能够独立在 Kubernetes 上部署一个 3 副本的 SeaTunnel 混合集群,并理解其调度、执行与资源配比的核心原理。

混合集群模式是什么

在 SeaTunnel Engine 中,集群由两类逻辑角色构成:

  • Master(调度节点):负责任务调度、作业状态管理、集群元数据维护与 REST API 服务;
  • Worker(执行节点):负责实际运行 SeaTunnel 任务(Job),占用 Slot 资源执行 Pipeline。

混合集群模式(Hybrid Cluster Mode)下,Master 与 Worker 运行在同一个 JVM 进程中。集群中的所有节点地位对等——每个节点都可以参与 Master 选举(成为调度者),同时也都承担任务执行职责。

从启动脚本的实现可以印证这一点:seatunnel-cluster.sh 中定义了三种节点角色,其中master_and_worker是默认角色(NODE_ROLE="master_and_worker"),对应读取config/hazelcast.yamlconfig/jvm_optionsconfig/seatunnel.yaml启动org.apache.seatunnel.core.starter.seatunnel.SeaTunnelServer主类;而masterworker角色则分别读取hazelcast-master.yamlhazelcast-worker.yaml,对应分离集群模式。

适用场景:混合模式部署简单、节点数少,适合小规模集群或测试环境。由于调度与执行资源不隔离,任务负载较高时可能影响 Master 的选举、调度与 REST API 稳定性;生产环境更推荐使用分离集群模式,将调度与执行资源隔离。

部署原则

在 Kubernetes 上部署混合集群,需要遵循以下四条核心原则:

  1. 使用 StatefulSet 部署混合集群节点:每个节点拥有稳定的网络标识(Pod 名称seatunnel-0seatunnel-1…),配合顺序启动、顺序滚动更新等特性,适合有状态分布式系统;
  2. 使用 Headless Service 提供 Hazelcast Kubernetes discovery:Hazelcast 成员通过clusterIP: None的 Headless Service 发现彼此并组建成集群;
  3. 所有节点使用同一份hazelcast.yamlhazelcast-client.yamlseatunnel.yaml:混合模式下所有节点角色相同,配置天然一致,只需通过 ConfigMap 统一挂载;
  4. 资源配置需同时考虑 Master 与 Worker 负载:因为每个进程同时承担调度与执行,JVM 内存、CPU 配额应比纯 Master 或纯 Worker 节点更高,且要预留 Master 职责(元数据、调度、REST)所需的余量。

创建 ConfigMap:拆分配置职责

生产环境建议按配置职责拆分 ConfigMap,避免单个 YAML 过长,也便于后续独立更新与审计。本文示例创建三个 ConfigMap:Hazelcast 服务端配置、Hazelcast 客户端配置、SeaTunnel Engine 配置。

⚠️注意:生产环境应将敏感信息(如 HDFS 凭证、HTTP Basic Auth 密码)放入 Secret,以下示例只展示非敏感配置。

Hazelcast 配置

hazelcast.yaml是 SeaTunnel 集群的成员发现与网络基础。示例配置通过Hazelcast Kubernetes API 发现机制让节点自动互相发现:

apiVersion: v1 kind: ConfigMap metadata: name: seatunnel-hazelcast-config data: hazelcast.yaml: | hazelcast: cluster-name: seatunnel-cluster network: rest-api: enabled: true endpoint-groups: CLUSTER_WRITE: enabled: true DATA: enabled: true port: auto-increment: false port: 5801 join: kubernetes: enabled: true namespace: default service-name: seatunnel-cluster service-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: 2 hazelcast.max.no.heartbeat.seconds: 180 hazelcast.heartbeat.phiaccrual.failuredetector.threshold: 10 hazelcast.heartbeat.phiaccrual.failuredetector.sample.size: 200 hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis: 100

关键字段说明:

配置项说明
cluster-name集群名称,所有节点必须一致,否则无法加入同一集群;同时需与 Hazelcast 客户端配置一致
network.rest-api开启 Hazelcast REST API 与CLUSTER_WRITEDATA端点组,SeaTunnel Engine 依赖其进行集群管理与数据读写
port.auto-increment: false+port: 5801固定使用 5801 端口,避免端口自动递增导致与 Kubernetes Service 端口映射错位
join.kubernetes开启 Kubernetes 成员发现,通过service-name指定的 Headless Service 解析成员地址,namespace指定运行命名空间
hazelcast.operation.generic.thread.count通用操作线程数,SeaTunnel 默认配置为 50,可结合 CPU 核数调整
hazelcast.heartbeat.*心跳与故障检测参数:采用phi-accrual故障检测器,心跳间隔 2 秒,最大无心跳容忍 180 秒

仓库自带的本地默认配置 config/hazelcast.yaml 采用tcp-ip发现(member-list: localhost),而 Kubernetes 部署必须将join段替换为kubernetes发现,二者仅在成员发现策略上不同,properties心跳与线程参数保持一致。

备选:使用 DNS 发现

如果希望避免 Hazelcast 直接访问 Kubernetes API(例如出于安全合规或 RBAC 简化考虑),可以将join.kubernetes替换为基于 DNS 的发现:

join: kubernetes: enabled: true service-dns: seatunnel-cluster.default.svc.cluster.local service-dns-timeout: 10

说明:使用 DNS 发现时,下文"为 API 发现创建 RBAC"章节不是成员发现所必需的。如果跳过 RBAC 清单,也需要从 StatefulSet 中移除serviceAccountName: seatunnel,或单独创建这个 ServiceAccount。

Hazelcast Client 配置

hazelcast-client.yaml供 SeaTunnel 引擎内部客户端连接集群使用(例如seatunnel.sh提交任务时连接集群)。关键点是cluster-members指向Headless Service 的 DNS 名称

apiVersion: v1 kind: ConfigMap metadata: name: seatunnel-client-config data: hazelcast-client.yaml: | hazelcast-client: cluster-name: seatunnel-cluster properties: hazelcast.logging.type: log4j2 connection-strategy: connection-retry: cluster-connect-timeout-millis: 7000 network: cluster-members: # 如果 SeaTunnel 部署在其他命名空间,需要将 default 替换为实际命名空间。 - seatunnel-cluster.default.svc.cluster.local:5801

仓库默认配置 config/hazelcast-client.yaml 中cluster-connect-timeout-millis为 3000ms,Kubernetes 场景由于 Pod 启动、服务发现需要时间,建议调大到 7000ms 以增强连接韧性。若跨命名空间部署,务必替换 DNS 中的default

SeaTunnel Engine 配置

seatunnel.yaml是引擎级配置,包含副本数、Slot、调度策略、Checkpoint 与 HTTP 服务。对照源码 ServerConfigOptions.java 可以确认各参数的默认值与语义:

apiVersion: v1 kind: ConfigMap metadata: name: seatunnel-engine-config data: seatunnel.yaml: | seatunnel: engine: backup-count: 1 history-job-expire-minutes: 1440 print-execution-info-interval: 300 classloader-cache-mode: true slot-service: dynamic-slot: false slot-num: 8 job-schedule-strategy: WAIT checkpoint: interval: 180000 timeout: 30000 storage: type: hdfs max-retained: 3 plugin-config: namespace: /seatunnel/checkpoint/ storage.type: hdfs fs.defaultFS: hdfs://namenode:8020 http: enable-http: true port: 8080

各项配置与源码默认值对照:

配置项示例值源码默认值说明
backup-count11Hazelcast 分区数据备份副本数,backup-count个节点宕机不影响集群元数据可用性
history-job-expire-minutes14401440历史作业状态保留时间(分钟),到期后自动清理
print-execution-info-interval30060打印执行信息的间隔(秒)
classloader-cache-modetruetrue类加载器缓存模式:缓存开启时,jar 相同的作业共享同一个 classloader,显著减少类加载开销
slot-service.dynamic-slotfalsetrue是否启用动态 Slot。false时使用固定 Slot 数(即slot-num
slot-service.slot-num8CPU 核数 × 2固定 Slot 数量,仅当dynamic-slot: false时生效
job-schedule-strategyWAITREJECT任务队列满时的策略:REJECT拒绝新任务,WAIT让任务排队等待
checkpoint.interval180000300000两次 checkpoint 之间的间隔(毫秒)
checkpoint.timeout3000030000单次 checkpoint 超时时间(毫秒)
checkpoint.storage.typehdfslocalfilecheckpoint 存储类型,生产集群建议使用 HDFS 等共享存储
checkpoint.storage.max-retained320最多保留的 checkpoint 数量
http.enable-httptruefalse是否开启引擎 HTTP(REST)服务
http.port80808080HTTP 服务端口

提示checkpoint.storage.plugin-config中的fs.defaultFS需指向实际可用的 HDFS NameNode 地址(示例为hdfs://namenode:8020);若无 HDFS,也可像仓库默认配置 config/seatunnel.yaml 那样使用localfilefile:///本地文件系统(仅适合单机测试,多节点集群必须使用共享存储)。此外仓库默认配置还包含telemetry.metrictelemetry.logs等可观测性项,可在 ServerConfigOptions.java 中查阅。

为 API 发现创建 RBAC

hazelcast.yaml中使用的namespaceservice-nameservice-port属于Hazelcast Kubernetes API 发现,需要 Pod 具备读取 Pod/Service/Endpoints 的权限。在启用 RBAC 的集群中,请先创建 ServiceAccount、Role 和 RoleBinding,再启动 StatefulSet

apiVersion: v1 kind: ServiceAccount metadata: name: seatunnel --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: seatunnel-hazelcast-discovery rules: - apiGroups: [""] resources: ["pods", "services", "endpoints"] verbs: ["get", "list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: seatunnel-hazelcast-discovery subjects: - kind: ServiceAccount name: seatunnel roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: seatunnel-hazelcast-discovery

RBAC 最小权限说明:Role 仅授予getlistwatch三个只读动词,资源限定为podsservicesendpoints,足够 Hazelcast 成员发现使用。若改用service-dns发现,可以跳过本节(同时需从 StatefulSet 移除serviceAccountName或自行创建该 ServiceAccount)。

创建 Service

混合集群需要两个 Service:

  1. Headless Service(seatunnel-clusterclusterIP: None,供 Hazelcast 成员发现与解析 Pod IP;publishNotReadyAddresses: true确保未就绪的 Pod 也能被 DNS 解析到,从而支持集群在节点全部启动前就开始组网;
  2. 普通 ClusterIP Service(seatunnel:暴露 REST API(8080)与 Hazelcast 端口(5801),供客户端与外部访问。
apiVersion: v1 kind: Service metadata: name: seatunnel-cluster labels: app: seatunnel-cluster spec: clusterIP: None publishNotReadyAddresses: true ports: - name: hazelcast port: 5801 targetPort: 5801 selector: app: seatunnel component: hybrid --- apiVersion: v1 kind: Service metadata: name: seatunnel labels: app: seatunnel spec: type: ClusterIP ports: - name: rest-api port: 8080 targetPort: 8080 - name: hazelcast port: 5801 targetPort: 5801 selector: app: seatunnel component: hybrid

注意:两个 Service 的selector必须与 StatefulSet Pod 标签一致(app: seatunnelcomponent: hybrid),否则成员发现与流量转发都会失效。

创建 StatefulSet

StatefulSet 是混合集群的部署载体。核心要素:

  • serviceName: seatunnel-cluster绑定 Headless Service,获得稳定网络标识;
  • 命令直接使用/opt/seatunnel/bin/seatunnel-cluster.sh(默认即master_and_worker角色);
  • 通过SEATUNNEL_HOMEHAZELCAST_CLUSTER_NAME环境变量注入主目录与集群名;
  • 三个 ConfigMap 分别以subPath方式挂载到/opt/seatunnel/config/下对应文件,保证容器内读取到的就是 ConfigMap 中的三份配置
  • 资源配额需同时覆盖 Master 与 Worker 负载(示例 requests 1 核 / 2Gi,limits 2 核 / 4Gi);
  • terminationGracePeriodSeconds: 120为优雅下线预留时间。
apiVersion: apps/v1 kind: StatefulSet metadata: name: seatunnel labels: app: seatunnel component: hybrid spec: serviceName: seatunnel-cluster replicas: 3 selector: matchLabels: app: seatunnel component: hybrid template: metadata: labels: app: seatunnel component: hybrid spec: serviceAccountName: seatunnel containers: - name: app image: seatunnel:3.0.0 imagePullPolicy: IfNotPresent command: - /opt/seatunnel/bin/seatunnel-cluster.sh env: - name: SEATUNNEL_HOME value: /opt/seatunnel - name: HAZELCAST_CLUSTER_NAME value: seatunnel-cluster ports: - containerPort: 8080 name: rest-api - containerPort: 5801 name: hazelcast resources: requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 4Gi volumeMounts: - name: hazelcast-config mountPath: /opt/seatunnel/config/hazelcast.yaml subPath: hazelcast.yaml - name: client-config mountPath: /opt/seatunnel/config/hazelcast-client.yaml subPath: hazelcast-client.yaml - name: engine-config mountPath: /opt/seatunnel/config/seatunnel.yaml subPath: seatunnel.yaml terminationGracePeriodSeconds: 120 volumes: - name: hazelcast-config configMap: name: seatunnel-hazelcast-config - name: client-config configMap: name: seatunnel-client-config - name: engine-config configMap: name: seatunnel-engine-config

从启动脚本 seatunnel-cluster.sh 可以看到,进程启动时会校验HAZELCAST_CONFIG指向的hazelcast.yaml存在(-Dhazelcast.config参数),因此 ConfigMap 挂载失败或路径错误会导致容器直接启动失败,这是排障时首先检查的点。

健康检查和优雅停止

集群模式下,建议为每个 SeaTunnel 容器添加startupProbe、就绪/存活探针和preStop钩子,避免启动期误杀,并减少滚动更新或节点驱逐对集群的影响。示例探针全部使用 TCP 探测 Hazelcast 端口 5801:

startupProbe: tcpSocket: port: 5801 periodSeconds: 10 failureThreshold: 30 readinessProbe: tcpSocket: port: 5801 initialDelaySeconds: 30 periodSeconds: 30 timeoutSeconds: 5 failureThreshold: 3 livenessProbe: tcpSocket: port: 5801 initialDelaySeconds: 30 periodSeconds: 30 timeoutSeconds: 5 failureThreshold: 3 lifecycle: preStop: exec: command: - /bin/sh - -c - | /opt/seatunnel/bin/stop-seatunnel-cluster.sh while kill -0 $(ps -ef | grep SeaTunnelServer | grep -v grep | awk '{print $2}') 2>/dev/null; do sleep 1 done

各探针的设计意图:

  • startupProbefailureThreshold: 30×periodSeconds: 10,给节点最长 300 秒的启动时间,避免 JVM 与 Hazelcast 组网期间的误杀;
  • readinessProbe / livenessProbe:就绪后以 30 秒周期探测,failureThreshold: 3容忍 90 秒内的瞬时抖动;
  • preStop 钩子:先执行 stop-seatunnel-cluster.sh 优雅关闭 SeaTunnelServer,然后轮询等待进程真正退出,确保节点在下线前完成 checkpoint 与状态迁移,减少对集群和运行中作业的冲击。

应用全部资源

将上述清单分别保存为独立文件后,按顺序应用。注意:仅在使用 API 发现,或 StatefulSet 保留serviceAccountName: seatunnel时应用seatunnel-rbac.yaml

kubectl apply -f seatunnel-hazelcast-config.yaml kubectl apply -f seatunnel-client-config.yaml kubectl apply -f seatunnel-engine-config.yaml kubectl apply -f seatunnel-rbac.yaml kubectl apply -f seatunnel-services.yaml kubectl apply -f seatunnel-hybrid.yaml

推荐顺序:先应用三个 ConfigMap(确保配置就绪),其次 RBAC(API 发现模式下必须),再创建 Service,最后启动 StatefulSet。应用后可通过kubectl get pods -w观察 3 个 Pod 依次进入 Ready 状态。

访问 REST API

集群就绪后,通过端口转发访问 REST API 并验证集群健康状态。SeaTunnel Engine 的 REST 端点定义在 RestConstant.java 中,其中REST_URL_SYSTEM_MONITORING_INFORMATION = "/system-monitoring-information"

kubectl port-forward svc/seatunnel 8080:8080 curl http://127.0.0.1:8080/system-monitoring-information

返回的监控信息包含集群各节点的 CPU、内存、进程状态等数据,可据此确认所有节点是否已成功组成一个集群(3 个节点应同时出现在结果中)。该端点也被引擎自带的 Web UI(seatunnel-engine-ui 中getMonitors()调用)用作数据源。

除监控外,引擎还提供/overview/running-jobs/job-info/submit-job/stop-job等 REST 端点(见 RestConstant.java),可用于作业管理与状态查询。

使用建议与限制

混合集群模式的本质是用一份资源同时支撑调度与执行,因此:

  • 节点数量建议控制在较小规模(如 3~5 个),避免所有节点同时参与调度与执行造成 Master 压力过大;
  • 资源配额(CPU/内存)应同时考虑 Master 负载(元数据、调度、REST)与 Worker 负载(任务执行、checkpoint),并预留 Buffer;
  • 当任务负载较高时,执行负载可能影响 Master 选举、调度和 REST API 稳定性;
  • 需要更稳定、可弹性扩缩的生产部署时,请迁移到分离集群模式,将调度与执行资源隔离,Master 与 Worker 各自独立扩容、独立调优。

参考资料

  • 本部署指南的英文原版:docs/en/getting-started/kubernetes/hybrid-cluster-mode.md
  • 分离集群模式部署:docs/zh/getting-started/kubernetes/separated-cluster-mode.md
  • Kubernetes 日常运维指南:docs/zh/getting-started/kubernetes/operations.md
  • 引擎配置选项源码:ServerConfigOptions.java
  • 集群启动与停止脚本:seatunnel-cluster.sh、stop-seatunnel-cluster.sh
  • Helm 部署模板参考:deploy/kubernetes/seatunnel

【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnel

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询