生产级实战:在 K3S 上构建 3 节点分布式 Apache SeaTunnel Zeta 高可用集群
2026/9/6 8:27:12 网站建设 项目流程

生产级实战:在 K3S 上构建 3 节点分布式 Apache SeaTunnel Zeta 高可用集群

在上一篇博客中,我们成功跑通了基于local模式的 Oracle 到 Oracle 实时 CDC 同步。然而在生产环境中,单机运行local模式不仅无法应对高并发的海量数据流,还面临单点故障(SPOF)的风险。

为了实现 7x24 小时高可用(HA)、全自动负载均衡与分布式弹性伸缩,我们需要将 SeaTunnel 的Zeta 引擎迁移至容器化集群。本文将基于边缘级轻量化 Kubernetes 集群K3S,手把手带你完成3 节点分布式高可用 Zeta 集群的搭建、组网避坑与任务提交实战


一、 3 节点 Zeta 集群在 K3S 中的架构设计

在 Kubernetes / K3S 环境下,Zeta 引擎节点之间需要通过 P2P 互相通信、发现彼此并维持集群状态。为了保证集群的绝对稳定,我们的架构设计如下:

  1. StatefulSet(状态集):设置副本数replicas = 3。由于 Zeta 节点之间通过内置的 Hazelcast 进行内部成员发现,使用 StatefulSet 可以为 Pod 提供固定的网络拓扑标识(seatunnel-0,seatunnel-1,seatunnel-2)。
  2. Headless Service(无头服务):声明clusterIP: None。用于节点间的 DNS 内部发现,通过稳定的内部短域名(如seatunnel-0.seatunnel-service)实现跨节点组网。
  3. 驱动封装:由于官方公共镜像不含商业版权驱动,我们必须将上一章准备好的ojdbc8.jarorai18n.jar封装到自定义镜像中,确保 3 个节点都能正常解析 Oracle 数据。

二、 第一步:制作包含 Oracle 驱动的自定义镜像

在你的 K3S Master 节点或构建机器上,将ojdbc8.jarorai18n.jar放在同一目录下,编写Dockerfile

FROM apache/seatunnel:2.3.8 # 将 Oracle 核心驱动和国际化语言包拷贝至 SeaTunnel 的 lib 目录 COPY ojdbc8.jar /opt/seatunnel/lib/ COPY orai18n.jar /opt/seatunnel/lib/

执行打包命令。如果你使用的是 K3S 自带的 Containerd 运行时,可以直接导入,或者推送到你的私有镜像仓库:

# 编译镜像dockerbuild-tmy-registry.local/seatunnel:2.3.8-oracle.# 推送至私有仓库(确保 K3S 节点都能拉取)dockerpush my-registry.local/seatunnel:2.3.8-oracle

三、 第二步:配置 3 节点静态 TCP-IP 发现(Zeta Config)

Zeta 引擎默认使用组播(Multicast)进行集群发现,但这在 K3S(如 Flannel 默认网络插件)中通常是被禁用的。因此,我们必须切换为TCP-IP 发现机制,并显式指定 3 个 Pod 的内部短域名。

核心避坑点:请勿在成员列表中填写全限定域名(如xxx.default.svc.cluster.local),在某些 CNI 网络抖动时,长域名解析失败会导致集群分裂(脑裂)。最稳妥、切实可行的方法是直接使用Pod名.服务名的短域名格式

创建或修改本地的seatunnel.yaml配置文件:

seatunnel:engine:backup-count:1queue-type:blockingqueueprint-execution-info-interval:10job-history-limit:100checkpoint:interval:15000max-concurrent:1timeout:60000

创建或修改本地的hazelcast.yaml配置文件:

hazelcast:cluster-name:seatunnel-k3s-clusternetwork:join:multicast:enabled:falsetcp-ip:enabled:truemember-list:-seatunnel-0.seatunnel-service-seatunnel-1.seatunnel-service-seatunnel-2.seatunnel-serviceport:auto-increment:falseport:5801# 🔥 核心:开启网卡匹配,让它自动绑定到 K3S 内部的 10.42.x.x Pod IP 段,抛弃 localhostinterfaces:enabled:trueinterfaces:-10.42.*.*

四、 第三步:编写并部署 K3S 资源清单(YAML)

在 K3S 控制端创建一个整合的资源清单文件seatunnel-k3s-3nodes.yaml。该文件包含了配置挂载(ConfigMap)、网络路由(Service)以及 3 副本状态集(StatefulSet):

apiVersion:v1kind:ConfigMapmetadata:name:seatunnel-confignamespace:defaultdata:# 1. 你的原生业务配置保持不变seatunnel.yaml:|seatunnel: engine: backup-count: 1 queue-type: blockingqueue print-execution-info-interval: 10 job-history-limit: 100 checkpoint: interval: 15000 max-concurrent: 1 timeout: 60000# 🔥 2. 在这里直接增加 hazelcast.yaml 配置,强行覆盖镜像内的写死配置hazelcast.yaml:|hazelcast: cluster-name: seatunnel-k3s-cluster network: join: multicast: enabled: false tcp-ip: enabled: true member-list: - seatunnel-0.seatunnel-service - seatunnel-1.seatunnel-service - seatunnel-2.seatunnel-service port: auto-increment: false port: 5801 # 🔥 核心:开启网卡匹配,让它自动绑定到 K3S 内部的 10.42.x.x Pod IP 段,抛弃 localhost interfaces: enabled: true interfaces: - 10.42.*.*---apiVersion:v1kind:Servicemetadata:name:seatunnel-servicenamespace:defaultspec:clusterIP:Noneselector:app:seatunnelports:-name:hazelcastport:5801targetPort:5801---apiVersion:apps/v1kind:StatefulSetmetadata:name:seatunnelnamespace:defaultspec:serviceName:"seatunnel-service"replicas:3selector:matchLabels:app:seatunneltemplate:metadata:labels:app:seatunnelspec:containers:-name:seatunnel-engineimage:docker.io/seatunnelimagePullPolicy:Alwaysports:-containerPort:5801name:hazelcast# 👍 命令回归最简单、最原生、最清爽的状态command:["/opt/seatunnel/bin/seatunnel-cluster.sh"]resources:requests:cpu:"1"memory:2Gilimits:cpu:"2"memory:4Gi# 🔥 将 ConfigMap 中的两个文件,分别以标准方式挂载复写进去volumeMounts:-name:config-volumemountPath:/opt/seatunnel/config/seatunnel.yamlsubPath:seatunnel.yaml-name:config-volumemountPath:/opt/seatunnel/config/hazelcast.yamlsubPath:hazelcast.yamlvolumes:-name:config-volumeconfigMap:name:seatunnel-config

1. 执行部署

在 K3S Master 节点执行一键应用命令:

kubectl apply-fseatunnel-k3s-3nodes.yaml

2. 验证 3 节点集群组网状态

部署完成后,检查 3 个 Pod 是否全部正常启动:

kubectl get pods-lapp:seatunnel

确保seatunnel-0seatunnel-1seatunnel-2的状态全部为Running。随后,打印任意一个节点的日志来验证分布式组网是否成功:

kubectl logs seatunnel-0

组网成功的标志:在日志中如果看到类似下面的输出,显示集群内的Members数量为3,并且精准包含了 3 个 Pod 的内部通信端口,说明 3 节点分布式高可用集群已经成功建立!

Members { Member:5801 - e291c944-1234-5678-b123-abcdef123456 this Member:5801 - f823da55-8765-4321-a321-abcdef654321 Member:5801 - c456ab77-9012-3456-d789-abcdef789012 }

SeaTunnel 运维利器:一键巡检 Zeta 分布式集群状态

在 Kubernetes/K3S 上容器化部署 Apache SeaTunnel (Zeta) 后,集群健康状态、组网情况及 CDC 实时任务需要快速监控。本文将解析一条用于一键巡检 SeaTunnel 分布式集群状态的命令。

🚀 核心巡检命令

在 K3S 的 Master 节点或控制端运行:

sudokubectlexec-itseatunnel-0-ndefault --\/opt/seatunnel/bin/seatunnel-cluster.sh\-mseatunnel-0.seatunnel-service:5801\-s\-cnseatunnel-k3s-cluster

🔍 命令参数解析

  • sudo kubectl exec -it seatunnel-0 -n default --:获取权限并进入指定的 Pod 交互终端。
  • /opt/seatunnel/bin/seatunnel-cluster.sh -m seatunnel-0.seatunnel-service:5801:调用 SeaTunnel 集群管理工具,通过短域名指定 Master 节点通信端口。
  • -s:展示当前集群运行状态的核心参数。
  • -cn seatunnel-k3s-cluster:指定集群名称,需与hazelcast.yaml配置严格一致。

📊 预期输出与应用场景

执行成功后将展示集群存活成员(Members)、运行中的作业(Running Jobs)以及算力槽状态(Slots Status)。建议在集群部署完毕、提交 CDC 实时任务后或容灾演练后执行此命令进行健康体检。

五、 第四步:向 K3S 分布式集群提交 CDC 同步任务

当集群化部署完成后,我们不再使用-e local参数。我们将任务直接通过网络提交到 K3S 集群中,由 Zeta 引擎自动进行分布式调度和容灾。

使用kubectl exec进入seatunnel-0容器,执行任务提交。注意:这里的--master参数需要指向我们无头服务中的任意节点:

kubectlexec-itseatunnel-0 -- ./bin/seatunnel.sh\--config./config/oracle_cdc_to_oracle.conf\--masterseatunnel-0.seatunnel-service:5801

💡集群高可用(HA)容灾测试
任务提交后,Zeta 引擎会自动将算力分发到各个节点。此时如果你手动删除(模拟故障坠毁)seatunnel-1节点:
kubectl delete pod seatunnel-1
K3S 会自动拉起一个全新的 Pod,而 Zeta 引擎会利用我们在上一章配置的Checkpoint 快照,自动在健康的seatunnel-0seatunnel-2节点上无缝恢复实时流同步,真正实现7x24小时不停机的高可用故障容灾


六、 生产级 K3S 运维保命清单

  1. 容器 OOM Killed 限制:Oracle CDC 底层解析 LogMiner 时,如果遇到源端并发大事务,会非常消耗堆内存。请务必在 StatefulSet 的limits.memory中至少分配 4Gi 以上空间,并通过环境变量传入 JVM 参数(如-Xmx3g),防止容器被 K3S OOM Killer 强行杀死。
  2. 持久化 Checkpoint 目录:默认情况下,Zeta 的 Checkpoint 元数据保存在本地 Pod 路径中。如果 3 个 Pod 同时重启,实时流的同步进度就会丢失。在真正的生产环境中,建议通过 K3S 的PersistentVolumeClaim (PVC)挂载外部的 NFS、Ceph 或 MinIO 对象存储到/opt/seatunnel/checkpoint/路径下,确保元数据绝对安全。

总结

通过在 K3S 上部署 3 节点的 StatefulSet,我们成功将 Apache SeaTunnel 从“单机本地玩具”升华为了“企业级容器化高可用集群”。结合上一章我们打通的 Oracle CDC 实时同步配置,这套架构已经完全具备了支撑企业核心生产线海量数据流的能力!

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

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

立即咨询