本周四,OpenAI 旗下 AI 聊天机器人平台 ChatGPT、视频生成工具 Sora 及其面向开发人员的 API 自太平洋时间下午 3 点左右起发生严重中断。
OpenAI 最近宕机频繁。上个月,ChatGPT 突发故障,导致服务中断近半小时,超过 19,000 人受到影响。OpenAI CEO Sam Altman 随后在社交媒体 X 上公开致歉。他表示,企业在可靠性方面比以往有了很大的进步,但仍有许多工作要做。最后他还加了一句:“根据 Similarweb 的数据,它现在是全球第八大网站”。
另外,随着研究实验的复杂性不断增加,快速定位问题一直是个大挑战。尤其是当实验失败时,研究人员往往需要花费大量时间去翻阅日志(在 DataDog 中)。为了提高问题排查效率,OpenAI 的基础设施团队不断的开发监控相关的App,满足各种不同的查询要求,比如输入简单的查询,比如“为什么这个 pod 失败了”,研究人员就能快速得到详细的故障原因分析,例如“该 pod 所在的主机因维护事件被移除”。
而本周的这次故障,直接原因是他们又新部署了一套监控系统,导致 Kubernetes 控制面临的负担加重。随后,由于控制面的故障(依赖于 DNS 和 K8S),无法直接回滚此次发布,进一步放大了故障影响,导致长时间不可用。
这些遥测服务的覆盖范围极广,因此新服务的配置无意中使得各个集群中的每个节点均须实行资源密集的 Kubernetes API 操作,其成本还会随集群规模而同步扩大。由于数千个节点同时实行这些操作,导致 Kubernetes API 服务器不堪重负,进而令大部分规模集群中的 Kubernetes 控制平面陷入瘫痪。这个问题在大家体量最大的集群中表现最为明显,但由于 DNS 缓存在该服务的大规模部署之前掩盖了问题,致使大家的测试未能及时发现。
Kubernetes 数据平面在很大程度上可以独立于控制平面运行,但 DNS 依赖于控制平面——具体来讲,各服务无法在缺少 Kubernetes 控制平面的情况下相互通信。
简言之,引发事故的根本原因就是新的遥测服务配置意外在大规模集群中产生了大量 Kubernetes API 负载,导致控制平面不堪重负并破坏了基于 DNS 的服务发现能力。
测试与部署
此番变更在登台集群内进行了测试,但没有观察到任何问题。只有规模超过一定水平的集群才会受到影响,而大家各个节点上的 DNS 缓存则延后了故障被观察到的时间,因此部署工作仍在如常推进。
部署之前,大家最关注的可靠性问题就是新遥测服务的资源消耗。在部署之前,大家评估了所有集群(CPU/ 内存)方面的资源利用率指标,以确保部署不会中断正在运行的服务。尽管资源请求会按集群进行调整,但大家没有采取任何预防措施来评估 Kubernetes API 服务器负载。另外,部署流程虽然会监控服务运行状况,但未充分配备集群运行状况监控协议。
Kubernetes 数据平台(负责处理用户请求)在设计上能够独立于控制平面运行,但 DNS 解析仍须借助 Kubernetes API 服务器——事实上,DNS 解析在大家的许多服务中均属于关键依赖项。
DNS 缓存能够提供过时但可正常运行的 DNS 记录,也正是这项功能缓解了性能影响。然而,随着缓存记录在接下来的 20 分钟内过期,服务实时 DNS 解析的服务开始出现故障。这个时间窗口至关重要,因为其延后了问题被发现的时间,导致大家在未了解问题全貌之前继续推进部署。当 DNS 缓存为空之后,DNS 服务器上的负载开始成倍增加,这进一步增加了控制平面的负载,也增加了即时缓解工作的实施难度。
补救措施
监控部署并恢复引发问题的变更一般非常简单,大家有专门的工具以检测并回滚错误部署。在此次事件中,大家的检测工具成功发挥作用,在客户受到实际影响前的几分钟就检测到了问题。但要想解决问题,大家需要删除引发问题的服务,而这要求大家访问 Kubernetes 控制平面——但随着 Kubernetes API 服务器负载的增加,访问操作根本无法进行。
大家在几分钟内就确定了问题,并马上启动了多个工作流,以探索快速恢复集群的不同方法:
<ol>
缩小集群规模:降低总 Kubernetes API 负载。
阻止对 Kubernetes 管理员 API 的网络访问:阻止新的高资源成本请求,让 API 服务器有时间恢复正常。
扩展 Kubernetes API 服务器:增加可用资源以消化待处理请求,借此为修复操作留出空间。
</ol>
通过同时推进这三项工作,大家最终夺回了控制权,得以删除存在问题的服务。