Kestra 2.0.6 进阶实战与运维

Kestra 2.0.6 进阶实战与运维:2.0.5 到 2.0.6 升级全流程与数据连续性验证、回滚演练、备份恢复、日志排查、存储后端与插件管理的完整实测记录。

KestraKestraLinux工作流编排Java2026/10/17

Kestra 2.0.6 进阶实战与运维

目标:完成 Kestra 2.0.5 → 2.0.6 升级、数据连续性验证、回滚演练与备份恢复。已在 Ubuntu 22.04 实测通过。

本文档所有命令与回显均来自 Ubuntu 22.04 实机实测(2026-10-17):2.0.5 → 2.0.6 升级与回滚演练在专用实例完成(单二进制 + H2),日志排查来自 systemd 托管实例。可逐条复现。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(12 vCPU / 31GiB)
  • Kestra 版本:起点 2.0.5 → 目标 2.0.6(官方发布件 + checksums 校验,OSS)
  • Java 版本:OpenJDK 25.0.4.1
  • JVM 堆:-Xms256m -Xmx512m
  • 端口:8080(Web/API)
  • 数据目录:/opt/kestra(H2 数据目录 /opt/kestra/data,升级前约 502MB)
  • 配置路径:/opt/kestra/confs/application.yaml
  • 部署形态:单二进制 + H2 专用实例(升级与回滚演练),日志排查来自 systemd 托管实例

二、升级原理与实测环境

2.1 升级机制

Kestra 的元数据(Flow、执行记录、模板等)存放在数据库中,每个版本自带对应的数据库结构迁移脚本。升级就是换二进制重启:新版进程启动时自动完成库表迁移,无需手工跑迁移命令。也因此:

  • 升级前必须备份数据目录(H2 场景)或做数据库备份(PostgreSQL 场景);
  • 一旦新版完成迁移,直接换回旧版二进制会因库表结构不匹配而无法启动——回滚要连同数据一起回退(见第四章实测)。

2.2 实测环境

项目实测值
系统Ubuntu 22.04.5 LTS(12 vCPU / 31GiB)
JavaOpenJDK 25.0.4.1
起点Kestra 2.0.5(安装目录 /opt/kestra,H2 数据目录 /opt/kestra/data,约 502MB)
目标Kestra 2.0.6(官方发布件 + checksums 校验)
JVM 堆-Xms256m -Xmx512m

升级前目录(实测):

cd /opt/kestra && du -sh confs data && ls -la kestra-2.0.5

回显:

4.0K     confs
502M     data
-rw-r--r-- 1 root root 130824176 Oct 16 18:35 kestra-2.0.5

三、升级实测:2.0.5 → 2.0.6

3.1 第一步:确认 2.0.5 基线

启动 2.0.5(后台方式,配置与 2.0.6 相同):

JAVA_OPTS="-Xms256m -Xmx512m" nohup ./kestra-2.0.5 server local \
  --config /opt/kestra/confs/application.yaml > /var/log/kestra-205.log 2>&1 &

等待约 60 秒后验证:

curl -s -o /dev/null -w "205_ping=%{http_code}\n" http://localhost:8080/ping
curl -s -o /dev/null -w "205_configs_auth=%{http_code}\n" -u admin@example.com:q1w2E3r4 http://localhost:8080/api/v1/configs
curl -s -u admin@example.com:q1w2E3r4 http://localhost:8080/api/v1/configs

回显:

205_ping=200

205_configs_auth=200

{"uuid":"2P7v4Zt9kM2t9p6c","version":"2.0.5","edition":"OSS","chartDefaultDuration":"PT24H","flowTemplate":"","isCustomDashboardsEnabled":false,"isAnonymousUsageEnabled":false,"isUiAnonymousUsageEnabled":true,...

3.2 第二步:写入标记 Flow(数据连续性哨兵)

创建一个升级前后都要能访问的 Flow:

cat > /tmp/marker.yaml <<'EOF'
id: upgrade_marker
namespace: prod
description: 升级前后数据连续性验证用 Flow

tasks:
  - id: hello
    type: io.kestra.plugin.core.log.Log
    message: "升级标记 Flow,由 2.0.5 创建"
EOF

curl -s -u admin@example.com:q1w2E3r4 -X POST \
  -H "Content-Type: application/x-yaml" \
  --data-binary @/tmp/marker.yaml \
  http://localhost:8080/api/v1/flows
curl -s -u admin@example.com:q1w2E3r4 \
  -o /dev/null -w "marker_get=%{http_code}\n" \
  http://localhost:8080/api/v1/flows/prod/upgrade_marker

回显:

{"id":"upgrade_marker","namespace":"prod",...

marker_get=200

3.3 第三步:停止 2.0.5

kill $(ps -ef | awk '/[k]estra-2.0.5 server/{print $2}')
sleep 18
ps -ef | grep '[k]estra' | grep -v grep || echo "no kestra process"

回显:

no kestra process

⚠️ 排障实录:停止后立即启动新版会报 H2 文件锁错误(Database may be already in use [90020-240]),实测等待约 18 秒文件锁释放后再启动即可,无需手工清理。

3.4 第四步:备份

cp kestra-2.0.5 kestra-2.0.5.bak
tar czf /opt/kestra/backup-kestra-2.0.5-20261017.tar.gz confs data
du -sh backup-kestra-2.0.5-20261017.tar.gz data kestra-2.0.5 kestra-2.0.5.bak

回显:

496M    backup-kestra-2.0.5-20261017.tar.gz
502M    data
125M    kestra-2.0.5
125M    kestra-2.0.5.bak

(备份包 496MB,压缩比符合 H2 文件特征。)

3.5 第五步:下载并校验 2.0.6

wget -q https://github.com/kestra-io/kestra/releases/download/v2.0.6/kestra-2.0.6
curl -sL https://github.com/kestra-io/kestra/releases/download/v2.0.6/checksums_sha256.txt | tee checksums_sha256.txt
sha256sum -c checksums_sha256.txt
chmod +x kestra-2.0.6

回显(校验行,其余命令无输出):

kestra-2.0.6: c3c46e70ecda67cb8671dfbdcb848710c40a02666a56e794ef27d01da83d7922
kestra-2.0.6: OK

3.6 第六步:启动 2.0.6(自动迁移)

JAVA_OPTS="-Xms256m -Xmx512m" nohup ./kestra-2.0.6 server local \
  --config /opt/kestra/confs/application.yaml > /var/log/kestra-206-migrate.log 2>&1 &

等待约 60 秒。实测升级日志中没有显式的 "migrating" 行(迁移静默完成),但实例信息行证明了新版本与插件加载:

grep -aE "VersionService|InstanceInformation" /var/log/kestra-206-migrate.log | head -3

回显:

10-16 19:23:29.864 INFO  main i.k.c.services.InstanceService$InstanceInformation -- Instance information. Version: 2.0.6, Hostname: 0e4bc4c3ce89, Instance: 3Pb9ubDo834p4aFBI66mY4, ServerType: LOCAL, Plugins: 174, Execution mode: executor, Max memory: 512MB

(Instance 标识在 2.0.5 与 2.0.6 间保持同一 uuid,说明读的是同一套元数据;Plugins: 174 为升级后自动就绪的插件数量。)

3.7 第七步:升级后验证

curl -s -u admin@example.com:q1w2E3r4 http://localhost:8080/api/v1/configs
curl -s -u admin@example.com:q1w2E3r4 http://localhost:8080/api/v1/flows/prod/upgrade_marker

回显(节选):

{"uuid":"3Pb9ubDo834p4aFBI66mY4","version":"2.0.6","edition":"OSS","commitId":"b59444f","chartDefaultDuration":"PT24H",...

{"id":"upgrade_marker","namespace":"prod","revision":1,"description":"升级前后数据连续性验证用 Flow","disabled":false,"deleted":false,"draft":false,"tasks":[...

结论:version: 2.0.6、commitId: b59444f,且 2.0.5 期间创建的 upgrade_marker Flow 原样保留(revision 1 未变),升级实测闭环。全程停机约 1 分钟(停止 8~12 秒 + 新版启动 40~50 秒)。

四、回滚实测:2.0.6 → 2.0.5 → 2.0.6

4.1 原理

如 2.1 所述,2.0.6 已把 H2 数据库结构迁到新版,直接用 2.0.5 启动会失败。实测可行做法:交换数据目录——把 2.0.6 迁移后的数据挪走,还原 2.0.5 的备份目录,用 2.0.5 启动(回滚旧态);验证后再反向交换回 2.0.6。

4.2 实测步骤

kill $(ps -ef | awk '/[k]estra-2.0.6 server/{print $2}')
sleep 15
mv data data-migrated-2.0.6
tar xzf backup-kestra-2.0.5-20261017.tar.gz data

(停止无输出;mv/tar 无输出。)用备份的 2.0.5 二进制启动旧数据:

JAVA_OPTS="-Xms256m -Xmx512m" nohup ./kestra-2.0.5.bak server local \
  --config /opt/kestra/confs/application.yaml > /var/log/kestra-205-rollback.log 2>&1 &

等待约 60 秒后验证:

curl -s -u admin@example.com:q1w2E3r4 http://localhost:8080/api/v1/configs
curl -s -u admin@example.com:q1w2E3r4 \
  -o /dev/null -w "marker_on_205=%{http_code}\n" \
  http://localhost:8080/api/v1/flows/prod/upgrade_marker

回显:

{"uuid":"2P7v4Zt9kM2t9p6c","version":"2.0.5","edition":"OSS",...

marker_on_205=200

2.0.5 启动正常且标记 Flow 可访问,回滚旧态成功。再恢复到 2.0.6:

kill $(ps -ef | awk '/[k]estra-2.0.5.bak server/{print $2}')
sleep 15
rm -rf data
mv data-migrated-2.0.6 data
JAVA_OPTS="-Xms256m -Xmx512m" nohup ./kestra-2.0.6 server local \
  --config /opt/kestra/confs/application.yaml > /var/log/kestra-206-final.log 2>&1 &

等待约 60 秒后验证:

curl -s -u admin@example.com:q1w2E3r4 http://localhost:8080/api/v1/configs
curl -s -u admin@example.com:q1w2E3r4 \
  -o /dev/null -w "marker_on_206=%{http_code}\n" \
  http://localhost:8080/api/v1/flows/prod/upgrade_marker

回显:

{"uuid":"3Pb9ubDo834p4aFBI66mY4","version":"2.0.6","edition":"OSS","commitId":"b59444f",...

marker_on_206=200

4.3 回滚注意事项

  • 回滚窗口内产生的新数据留在被挪走的目录里,反向交换前先确认不再需要(本次演练未产生增量数据);
  • PostgreSQL 场景的"数据交换"对应的是恢复数据库备份,思路相同:旧库对旧版二进制;
  • 生产环境建议回滚前先在测试实例演练一遍(本节即演练实录)。

五、备份与恢复

5.1 H2 场景(单二进制安装)

全量冷备(先停服务):

systemctl stop kestra
tar czf /opt/kestra/backup-kestra-2.0.5-20261017.tar.gz confs data
systemctl start kestra

恢复 = 解包覆盖 + 启动(第四章 4.2 已实测 tar xzf 恢复全过程)。要点:

  • 必须在服务停止后备份(H2 文件被进程独占);
  • confs(配置)与 data(数据库/存储/插件)一起打包;
  • 502MB 数据实测压缩后 496MB,耗时秒级。

5.2 PostgreSQL 场景(Compose)

docker compose exec postgres pg_dump -U kestra kestra > kestra-$(date +%F).sql

产物存储卷另需单独备份(宿主机路径一般为 /var/lib/docker/volumes/kestra-compose_kestra-data/_data)。

六、日志排查

6.1 日志通道

形态通道查看方式
systemd 托管journaldjournalctl -u kestra --no-pager -n 200
手工 nohup重定向文件tail -f /var/log/kestra-local.log
Composestdoutdocker compose logs -f --tail 100 kestra

实时跟踪:

journalctl -u kestra -f

(Ctrl+C 退出跟踪,服务本身不受影响。)

6.2 关键日志关键词速查(实测摘录)

关键词含义实测样例
Machine information启动信息:CPU、JVM 堆上限、Java 版本Machine information: 12 available cpu(s), 512MB max memory, Java version 25.0.4.1+1-1-22.04.4-Ubuntu
Instance information实例标识:版本、插件数、执行模式Version: 2.0.6, ..., Plugins: 174, Execution mode: executor, Max memory: 512MB
TriggerScheduler调度器分片运行Starting trigger scheduling for [3, 15] vNodes
DefaultScheduler / DefaultExecutor / Worker started各角色启动Scheduler started with 12 thread(s) [timezone=GMT]
90020-240H2 文件锁冲突(双实例)Database may be already in use ... [90020-240]
status=217/USERsystemd 找不到运行用户kestra.service: Main process exited, code=exited, status=217/USER
service-liveness存活探测告警探测超时会被标记,重启过慢时可见

6.3 常见排障路径

  1. 服务起不来:journalctl -u kestra -n 200 --no-pager 看首个 ERROR;对照《Kestra 2.0.6 Ubuntu 22.04 安装指南》第八章;
  2. 反复重启:先看是不是 status=217/USER(用户被删)或端口被占;
  3. API 全 401:basic-auth 密码不满足强度规则(大小写+数字),或未带凭证;
  4. 任务停在 RUNNING:插件首次下载中(观察 journalctl -f 的插件下载日志);
  5. 磁盘增长:du -sh /opt/kestra/data/* 逐目录定位(storage 与 database 是大头)。

七、存储后端

7.1 local(实测)

单机安装 storage.type: local,产物与插件落本地目录:

ls -la /opt/kestra/data

回显(节选,单机形态):

drwxr-xr-x 3 root root       4096 Oct 16 18:35 .
drwxr-xr-x 5 root root       4096 Oct 16 19:30 ..
-rw-r--r-- 1 root root  156152832 Oct 16 19:23 database.mv.db
drwxr-xr-x 2 root root       4096 Oct 16 18:35 plugins

镜像形态(Compose)挂载点为 /app/storage(实测,见《Kestra 2.0.6 Docker Compose 部署指南》6.1)。local 模式简单可靠,适合单机;多实例共享产物时换对象存储。

💡 技术拓展:storage 后端对比——local(默认,实测)零依赖、产物存本地;S3/MinIO(对象存储类,type 换为对应插件并配置 endpoint/凭证)适合多实例与大量产物场景;GCS/Azure Blob 同类。本文仅实测 local,对象存储后端配置以官方文档 https://kestra.io/docs/configuration 为准。元数据库(repository/queue)后端对比见《Kestra 2.0.6 配置参数详解》5.1 技术拓展。

八、插件管理

8.1 插件数量确认

2.0.6 启动后插件全部就绪,以启动日志的实例信息行为准:

grep -a "Instance information" /var/log/kestra-206-migrate.log | head -1

回显:

10-16 19:23:29.864 INFO  main i.k.c.services.InstanceService$InstanceInformation -- Instance information. Version: 2.0.6, Hostname: 0e4bc4c3ce89, Instance: 3Pb9ubDo834p4aFBI66mY4, ServerType: LOCAL, Plugins: 174, Execution mode: executor, Max memory: 512MB

插件 jar 落盘在 /opt/kestra/data/plugins,与 Plugins: 174 对应。

8.2 下载来源与离线放置

插件默认从 Maven Central 下载(kestra.plugins.repositories.central.url,见《Kestra 2.0.6 配置参数详解》7.1)。网络受限环境的做法:在能联网的机器上跑一次相关 Flow,把 /opt/kestra/data/plugins 整目录拷贝到目标机同路径,重启即可。

九、常见问题(FAQ)

9.1 升级后旧版起不来

H2 库表已被 2.0.6 迁移,2.0.5 无法识别。按第四章实测:恢复 2.0.5 的数据备份(交换 data 目录)后再用 2.0.5 启动。

9.2 升级停机多久

实测(H2、502MB 数据、12 vCPU):停止 8~12 秒 + 新版启动 40~50 秒,共约 1 分钟。PostgreSQL 大库场景迁移耗时会更长,安排停机窗口前先在测试环境演练。

9.3 升级日志里没有 migration 字样

2.0.6 的库表迁移静默完成,没有显式 migration 日志行。确认升级是否生效以 /api/v1/configs 的 version 与启动日志 Instance information 的 Version 为准(本文 3.6/3.7 实测)。

9.4 H2 文件锁(90020-240)

旧进程未退净就启动新进程必报 Database may be already in use [90020-240]。先 ps -ef | grep java 确认无残留进程,等 10~30 秒再启动;systemd 托管 + Restart=always 可避免手工操作时序问题。

9.5 systemd 服务循环重启 status=217/USER

运行用户被删除导致。重建用户(useradd -r -s /usr/sbin/nologin kestra)+ chown -R kestra:kestra /opt/kestra + 重启,实测恢复正常(完整回显见《Kestra 2.0.6 Ubuntu 22.04 安装指南》8.4)。

十、参考链接