Kestra 2.0.6 进阶实战与运维
Kestra 2.0.6 进阶实战与运维:2.0.5 到 2.0.6 升级全流程与数据连续性验证、回滚演练、备份恢复、日志排查、存储后端与插件管理的完整实测记录。
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) |
| Java | OpenJDK 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 托管 | journald | journalctl -u kestra --no-pager -n 200 |
| 手工 nohup | 重定向文件 | tail -f /var/log/kestra-local.log |
| Compose | stdout | docker 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-240 | H2 文件锁冲突(双实例) | Database may be already in use ... [90020-240] |
status=217/USER | systemd 找不到运行用户 | kestra.service: Main process exited, code=exited, status=217/USER |
service-liveness | 存活探测告警 | 探测超时会被标记,重启过慢时可见 |
6.3 常见排障路径
- 服务起不来:
journalctl -u kestra -n 200 --no-pager看首个 ERROR;对照《Kestra 2.0.6 Ubuntu 22.04 安装指南》第八章; - 反复重启:先看是不是
status=217/USER(用户被删)或端口被占; - API 全 401:basic-auth 密码不满足强度规则(大小写+数字),或未带凭证;
- 任务停在 RUNNING:插件首次下载中(观察
journalctl -f的插件下载日志); - 磁盘增长:
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)。