事后分析:未找到 Docker 镜像
2023-12-17 Logto 服务中断事故报告,原因是生产 Docker 镜像丢失。
摘要
我们在 2023-12-17 遇到了服务中断,原因是 Logto 生产 Docker 镜像丢失。
- 事件时间:2023-12-17 03:56:00 UTC
- 事件时长:18 分钟
- 服务影响:Logto 云服务和 Logto 核心服务在事故期间不可用。
- 影响级别:严重
- 根本原因:Logto 生产 Docker 镜像被误删。未能从 GitHub 容器注册表中获取镜像。
时间线
时间 | 事件 |
---|---|
早期 2023-12-17(具体时间未知) | Logto 自动化 GitHub 镜像保留工作流被执行。logto 和 logto-cloud 生产镜像被误删。 |
2023-12-17 03:56:00 UTC | Logto 云服务和 Logto 核心服务变得不可用。我们的监控系统检测到事件。 |
2023-12-17 04:03:00 UTC | 值班工程师确认了事件。 |
2023-12-17 04:10:00 UTC | 启动了最新镜像的 Logto 云服务和 Logto 核心服务的新部署。 |
2023-12-17 04:15:00 UTC | Logto 云服务和 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 镜像保留工作流。