写点什么

Netflix 如何处理其容器平台 Titus 上 的孤儿 Pod 问题

作者:Claudio Masolo

  • 2023-12-13
    北京
  • 本文字数:1347 字

    阅读完需:约 4 分钟

Netflix 如何处理其容器平台 Titus上 的孤儿 Pod 问题

Netflix 工程团队介绍了他们如何调查、识别和解决 Titus 的“孤儿”pod 问题,揭示了从内核恐慌到 Kubernetes(k8s)的整个过程,并最终为操作人员提供了可用于理解节点消失原因的工具。


Netflix Titus 是 Netflix 开发的容器管理平台,于 2018 年开源。按照设计,它主要是用于在云中大规模运行容器,并专门针对 Netflix 的动态、高流量大型流媒体服务的独特需求和挑战而量身定制。


虽然孤儿 pod 在系统中占少数,但对批处理用户来说是一个很大的问题,因为他们会面临不确定性,缺少明确的返回代码可以指导他们做重试决策。孤儿 pod 是由于底层 Kubernetes Node 对象消失造成的。当一个节点消失时,将触发一个垃圾收集(GC)进程,删除相关的 pod。为了增强用户体验,Titus 使用了一个自定义控制器来维护 pod 和 Node 对象的历史记录,以保证信息透明度。然而,由于对于丢失原因缺乏令人满意的解释,他们决定对根本原因做进一步调查。


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 或节点的进程中,Titus 实现了一种可以统筹兼顾的方法。与修正状态不同,使用注解可以兼顾历史考量而保留 pod 的完整性。现在,Titus 可以捕获各种终止原因,如抢占作业、硬件故障、用户干预或内核恐慌,并提供人类可读的消息。


考虑到 Linux 内核出现故障时可用的选项有限,处理内核故障是一项独特的挑战。受 Google Spanner“最后喘息”概念(节点在致命故障时发送 UDP 数据包)的启发,Titus 使用 netconsole 模块实现了一个解决方案。配置 netconsole,将 Linux 内核设置为在内核恐慌时发送 UDP 数据包,从而使平台在发生灾难性故障时也能捕获重要的信息。


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


  1. 监听 netconsole UDP 数据包。

  2. 识别内核恐慌,并将它们与 k8s 节点对象关联起来。

  3. 标注并删除与恐慌节点关联的 pod。

  4. 标注并删除恐慌节点。


该进程可以确保在检测到内核恐慌时立即采取行动,而不必等待垃圾收集器进程。注解充当文档,使操作人员能够清楚地了解节点和相关 pod 发生了什么。



Titus 显示 pod 在一个内核恐慌的节点上丢失的过程


他们引入的措施不仅直接解决了孤儿 pod 的问题,还为操作人员提供了重要的观察工具。现在,Titus 用户可以收到有关作业失败原因的详细信息,即使在内核恐慌的情况下也是如此。虽然标记由于这种严重事件而导致的作业失败可能并不是最理想的方法,但令人满意的是,这种方法增强了可观察性以及主动处理和纠正内核恐慌的能力。由于所有这些改进,Titus 显著增强了其功能,确保工程师和批处理用户都能获得更流畅的体验。


原文链接:

https://www.infoq.com/news/2023/12/orphaned-pods-netflix-titus/


2023-12-13 12:524012

评论

发布
暂无评论
发现更多内容

大厂工程师如何给SpringBoot封装响应数据和异常处理?

Java-fenn

Java

Fast.Framework ORM 于中秋节后 正式开源

Java-fenn

Java

Java 多线程:锁

Java-fenn

Java

TAP 基于 Knative 的 云原生运行时

Java-fenn

Java

C++最佳实践 | 6. 性能

Java-fenn

Java

LeetCode-1370. 上升下降字符串(Java)

bug菌

9月日更 Leet Code 9月月更

LeetCode-1002. 查找常用字符(Golang)

bug菌

9月日更 Leet Code 9月月更

Java进阶(十五)Java中设置session的详细解释

No Silver Bullet

Java session Cookie 9月月更

Plasticine: 面向并行模式的可重配架构

俞凡

架构 网络

开箱即用,40 个 SpringBoot 常用注解!

Java-fenn

22个每个程序员都应该知道的 Git 命令

Java-fenn

Java

阿里前端常见面试题(附答案)

loveX001

前端 前端javascript

C++ 20 协程 Coroutine之剖析

Java-fenn

Java

设计模式之工厂方法模式--更加符合开闭原则的工厂模式

Java-fenn

Java

力扣142 - 环形链表||【二重双指针+哈希表】

Fire_Shield

链表 LeetCode 9月月更

详解容灾架构中的数据复制技术

Java-fenn

Java

GreatSQL vs MySQL性能测试来了,速围观~

Java-fenn

Java java;

SpringBoot 源码 | prepareEnvironment 方法解析

Java-fenn

Java

k8s中几个基本概念的理解

Java-fenn

Java

【全网最全】你绝对没见过的,Alibaba内部的18份Java技术体系教程

程序知音

Java JVM 阿里 程序员面试 后端技术

SAP 电商云 Spartacus UI 同 SAP Customer Data Cloud 的集成

汪子熙

typescript SAP Hybris Spartacus 9月月更

九个写 TypeScript 的坏习惯,看看你有没有?

Java-fenn

Java

Netty系列教程(二)Netty架构设计剖析

Java-fenn

Java

弱隔离级别 & 事务并发问题

Java-fenn

Java

小公司里用SpringBoot做MySQL分库分表,踩了一些坑!

Java-fenn

Java

物理层基本概念

StackOverflow

编程 计算机网络 9月月更

字节架构师:来说说 Kafka 的消费者客户端详解,你都搞懂了吗?

Java快了!

Kafk

知道这些坑,你还敢乱把单体架构拆成分布式吗

Java-fenn

Java

全到哭!从面试到架构,阿里大佬用五部分就把高并发编程讲清楚了

Java全栈架构师

Java 程序员 面试 程序人生 高并发

Flutter - Google 开源的移动 UI 框架

陈橘又青

谷歌 flutter 调试工具 9月月更

什么是X态传播?

Java-fenn

Java

Netflix 如何处理其容器平台 Titus上 的孤儿 Pod 问题_云原生_InfoQ精选文章