flatcar自动更新默认关闭,需通过ignition在/etc/coreos/update.conf中配置group=stable和reboot_strategy=etcd-lock并指定filesystem为root,否则静默失效。

Flatcar 自动更新默认是关的,得手动开
Flatcar 默认禁用自动更新,不是“装好就自己升级”,这点和很多人直觉相反。系统启动后只会检查更新、下载更新包,但不会应用——除非你明确启用自动应用逻辑。
关键配置在 /etc/coreos/update.conf,必须确保它存在且内容为:
GROUP=stable REBOOT_STRATEGY=etcd-lock
其中 REBOOT_STRATEGY 决定重启行为:etcd-lock 是最稳妥的选择(依赖 etcd 协调多节点滚动重启),best-effort 适合单机但可能跳过锁检测导致并发重启。
-
GROUP必须设为stable、beta或alpha;留空或拼错会静默失效 - 该文件需在系统首次启动前写入,Ignition 阶段写入最可靠;运行时 touch 修改不生效
- Flatcar 不支持像 systemd-update-utility 那样通过服务开关控制,只认这个配置文件
Ignition 里写 update.conf 要用 files + filesystem 指向 rootfs
Ignition 不会自动把配置落到 /etc/coreos/,它只管“按路径写文件”。而 /etc/coreos/update.conf 必须位于 root 文件系统,不能写进 /usr 或其他挂载点。
正确写法示例(Ignition JSON):
{
"ignition": { "version": "3.4.0" },
"storage": {
"files": [{
"path": "/etc/coreos/update.conf",
"mode": 420,
"contents": { "source": "data:,GROUP%3Dstable%0AREBOOT_STRATEGY%3Detcd-lock" },
"filesystem": "root"
}]
}
}
-
filesystem: "root"缺失会导致文件写入失败,且 Ignition 不报错,只默默跳过 - URL 编码必须做:
=→%3D,\n→%0A;直接写换行或等号会解析失败 - 不要试图用
systemd.units启动一个 service 去写这个文件——Ignition 阶段还没 network、没 etcd,service 无法可靠执行
自动更新失败常见错误:etcd 未就绪或锁争用
开了自动更新也不等于每次都能成功重启。最常卡在 REBOOT_STRATEGY=etcd-lock 这一步:更新服务(update-engine)会尝试在 etcd 里创建租约锁,失败就暂停,不重启。
典型现象:
-
journalctl -u update-engine里反复出现Failed to acquire etcd lock -
coreos-update-agent日志显示waiting for etcd但一直不推进 - 节点长时间停留在 “downloaded” 状态,
update_engine_client -status返回UPDATE_STATUS_IDLE
原因通常是:
- etcd 尚未启动完成(Ignition 配置里 etcd unit 依赖顺序没设对)
- 集群中已有节点持有锁且未释放(比如前次更新中断、节点宕机未清理租约)
- etcd endpoint 地址不对,
update-engine默认连http://127.0.0.1:2379,但有些 Ignition 配置把 etcd 绑到了localhost或其他 IP
Ignition 和自动更新的时序关系:配置必须早于 update-engine 启动
Ignition 配置在 initramfs 阶段执行,而 update-engine 是用户空间第一个服务之一。如果 /etc/coreos/update.conf 在 Ignition 里没写进去,或者写晚了(比如靠 later stage 的 systemd service 补写),update-engine 启动时就读不到配置,直接 fallback 到 disabled 状态。
验证是否生效的最快方法:
- 启动后立刻查:
cat /etc/coreos/update.conf—— 必须存在且内容正确 - 再看:
systemctl is-enabled update-engine应返回enabled(Flatcar 默认就是 enabled,但配置无效时它不会报错) - 最后确认:
update_engine_client -status | grep -i reboot如果看到reboot_strategy: ETCD_LOCK才算真正接上了
最容易被忽略的是:Ignition 配置本身没有语法错误,但因为 filesystem 指定错、路径大小写错(/etc/CoreOS/)、或用了相对路径,导致文件根本没落地——而整个过程完全静默。










