简体中文
  • 事后分析
  • 云服务
  • 事件

事后分析:未找到 Docker 镜像

2023-12-17 Logto 服务中断事故报告,原因是生产 Docker 镜像丢失。

Simeng
Simeng
Developer

摘要

我们在 2023-12-17 遇到了服务中断,原因是 Logto 生产 Docker 镜像丢失。

  • 事件时间:2023-12-17 03:56:00 UTC
  • 事件时长:18 分钟
  • 服务影响:Logto 云服务和 Logto 核心服务在事故期间不可用。
  • 影响级别:严重
  • 根本原因:Logto 生产 Docker 镜像被误删。未能从 GitHub 容器注册表中获取镜像。

时间线

时间事件
早期 2023-12-17(具体时间未知)Logto 自动化 GitHub 镜像保留工作流被执行。logtologto-cloud 生产镜像被误删。
2023-12-17 03:56:00 UTCLogto 云服务和 Logto 核心服务变得不可用。我们的监控系统检测到事件。
2023-12-17 04:03:00 UTC值班工程师确认了事件。
2023-12-17 04:10:00 UTC启动了最新镜像的 Logto 云服务和 Logto 核心服务的新部署。
2023-12-17 04:15:00 UTCLogto 云服务和 Logto 核心服务变得可用。事件自动解决。

事件分析

发生了什么

Logto 服务的生产镜像被我们的自动化 GitHub 镜像保留工作流删除。云服务未能从 GitHub 容器注册表中获取镜像,导致不可用。

服务日志

为什么会发生

自动化 GitHub 镜像保留工作流错误地删除了生产镜像。该工作流被设计用于删除所有超过三天的未标记旧镜像。

我们使用 prod 标签标记生产镜像,以识别为生产镜像。每当触发生产部署时,将会构建新的带有 prod 标签的镜像并推送到 GitHub 容器注册表。在新镜像成功构建并推送后,从旧镜像中移除 prod 标签。旧镜像将变为未标记,并将被自动化 GitHub 镜像保留工作流删除。

Logto 服务镜像被构建为支持多种架构。镜像使用 buildx 构建,并使用 --platform 标志推送到 GitHub 容器注册表。所有标签都应用于根清单列表。prod 标签也应用于根清单列表。所有列在多架构清单列表下的子镜像保持未标记。

由于没有仔细审核 Docker 镜像的标签和清单列表结构,我们简单地配置了自动化 GitHub 镜像保留工作流来删除所有未标记的镜像。工作流删除了多架构清单列表下所有的子镜像。

影响

此次事故导致 Logto 云服务和 Logto 核心服务大约 18 分钟不可用。最终用户无法登录 Logto 和访问他们的客户端应用程序。Logto 云管理员门户在事故期间也不可用。

解决方案

我们停止了自动化 GitHub 镜像保留工作流,并在 GitHub 容器注册表中部署了带有 prod 标签的新镜像。Logto 云服务和 Logto 核心服务成功获取了新镜像,服务再次可用。

经验教训

  • 绝不应在没有仔细审查和测试的情况下将工作流发布到生产环境。
  • 在执行任何资源删除任务之前应先进行试运行。
  • 始终为生产环境制定应急计划。
  • 谨慎定义新的镜像保留策略。

纠正和预防措施

  • ✅ 立即停止自动化 GitHub 镜像保留工作流。