Linux Flatcar Container Linux 的自动更新与 Ignition 配置

11次阅读

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

Linux Flatcar Container Linux 的自动更新与 Ignition 配置

Flatcar 自动更新默认是关的,得手动开

Flatcar 默认禁用自动更新,不是“装好就自己升级”,这点和很多人直觉相反。系统启动后只会检查更新、下载更新包,但不会应用——除非你明确启用自动应用逻辑。

关键配置在 /etc/coreos/update.conf,必须确保它存在且内容为:

GROUP=stable REBOOT_STRATEGY=etcd-lock

其中 REBOOT_STRATEGY 决定重启行为:etcd-lock 是最稳妥的选择(依赖 etcd 协调多节点滚动重启),best-effort 适合单机但可能跳过锁检测导致并发重启。

  • GROUP 必须设为 stablebetaalpha;留空或拼错会静默失效
  • 该文件需在系统首次启动前写入,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 编码必须做:=%3Dn%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/)、或用了相对路径,导致文件根本没落地——而整个过程完全静默。

text=ZqhQzanResources