解决Netflix的Titus容器平台上的孤儿Pod问题

Netflix Titus 容器管理平台的“孤儿 Pod”问题及解决方案

Netflix 的工程团队近期公开了对“孤儿 Pod”问题的调查、识别和解决过程。这一问题对使用 Netflix Titus 容器管理平台的工程师造成了困扰,尤其是在处理 Kubernetes(k8s)节点消失时。通过这一过程,Netflix 不仅深入分析了节点消失的原因,还为操作员提供了工具来更好地理解节点消失的原因。

Titus 平台概述

Netflix Titus 是 Netflix 开发的容器管理平台,于 2018 年开源。它专为在云环境中大规模运行容器而设计,尤其适合 Netflix 高流量、动态变化的流媒体服务需求。

孤儿 Pod 问题

孤儿 Pod 是指由于底层 Kubernetes 节点对象消失而导致的 Pod 丢失问题。尽管孤儿 Pod 在系统中占少数,但对批处理用户来说,这是一个严重的问题,因为这些用户无法获得明确的返回代码来决定是否重试任务。当节点消失时,Kubernetes 会触发垃圾回收(GC)过程,删除与该节点关联的 Pod。为了提升用户体验,Titus 使用自定义控制器来维护 Pod 和 Node 对象的历史记录,确保透明度。然而,节点消失的原因仍然不明,促使团队进一步调查。

节点消失的原因

节点消失可能有多种原因,尤其是在云环境中。云供应商通常使用 Kubernetes 云控制器来检测底层服务器的丢失并删除 Kubernetes 节点对象。但这并不能解释节点为何消失。为此,Netflix 工程团队引入了注解来捕获节点终止的原因,提供信息以理解节点消失的原因。

{
     "apiVersion": "v1",
     "kind": "Pod",
     "metadata": {
          "annotations": {
               "pod.titus.netflix.com/pod-termination-reason": "Something really bad happened!",
...

关键改进:pod-termination-reason 注解

通过将 pod-termination-reason 注解引入垃圾回收控制器,并将其包含在可能意外终止 Pod 或节点的过程中,Titus 确保了全面的解决方案。与修补状态不同,使用注解可以保留 Pod 的历史完整性。现在,各种终止原因(如抢占作业、硬件故障、用户干预或内核恐慌)都会被捕获,并生成人类可读的消息。

处理内核恐慌

内核恐慌带来了独特的挑战,因为在 Linux 内核恐慌时,可用的选项非常有限。受到 Google Spanner 的“last gasp”概念的启发,Titus 使用 netconsole 模块实现了一种解决方案。通过配置 Linux 内核在内核恐慌时发送 UDP 数据包,平台能够在灾难性故障期间捕获重要信息。

与 Kubernetes 的集成

最后一步是连接到 Kubernetes 并实现一个控制器来:

  1. 监听 netconsole 的 UDP 数据包。
  2. 识别内核恐慌并将其与 Kubernetes 节点对象关联。
  3. 注释并删除与恐慌节点关联的 Pod。
  4. 注释并删除恐慌节点。

这一过程确保在检测到内核恐慌时立即采取行动,无需等待垃圾回收过程。注解作为文档,为操作员提供了清晰的节点和 Pod 状态信息。

效果与影响

通过引入这些措施,Titus 不仅解决了孤儿 Pod 的即时问题,还为操作员提供了关键的观察工具。Titus 用户现在可以获取作业失败的详细信息,即使是在内核恐慌的情况下。虽然由于这种关键事件标记作业失败并不理想,但改进的观察能力和主动解决内核恐慌的能力带来了更高的满意度。得益于这些改进,Titus 显著提升了其能力,为工程师和批处理用户提供了更顺畅的体验。

阅读 52
0 条评论