云原生系列四:Yelp 如何在 Kubernetes 上运行 Kafka

简介: ​案例分享 | Yelp 如何在 Kubernetes 上运行 Kafka(第 1 部分 - 架构)这几天小叶秋在网上冲浪的时候,发现一些与云原生相关的文章,特地拿来与大家分享~~本文译自 Kafka on PaaSTA: Running Kafka on Kubernetes at Yelp (Part 1 - Architecture)[1]。作者:Lennart Rudolph在 Yelp,Kafka 每天接收数百亿条消息来推进数据驱动并为关键业务管道和服务提供支持。我们最近通过在 PaaSTA (Yelp 自己的平台即服务)上运行集群,对 Kafka 部署架构进行一些改进。

案例分享 | Yelp 如何在 Kubernetes 上运行 Kafka(第 1 部分 - 架构)

image.gif编辑

这几天小叶秋在网上冲浪的时候,发现一些与云原生相关的文章,特地拿来与大家分享~~

本文译自 Kafka on PaaSTA: Running Kafka on Kubernetes at Yelp (Part 1 - Architecture)[1]。作者:Lennart Rudolph

在 Yelp,Kafka 每天接收数百亿条消息来推进数据驱动并为关键业务管道和服务提供支持。我们最近通过在 PaaSTA (Yelp 自己的平台即服务)上运行集群,对 Kafka 部署架构进行一些改进。基于 K8s 的部署利用了 Kafka 的自定义 Kubernetes operator 以及用于生命周期管理的 Cruise Control 。

image.gif编辑

架构改进及动机

过去,我们所有的 Kafka 集群都在 AWS 的专用 EC2 实例上运行。Kafka 直接部署在这些主机上,配置管理高度依赖 Puppet 仓库。这种部署模式有些繁琐,创建一个新集群平均需要两个多小时。因此我们着手开发一种新的部署模型,以下是改进目标:

    • 减少对 Puppet 缓慢运行的依赖。
    • 在内部推广 PaaSTA ,并利用其 CLI 工具来提高生产力。
    • 提高生命周期管理系统的可维护性。
    • 简化执行操作系统主机升级和 Kafka 版本升级的过程。
    • 简化新 Kafka 集群的创建(与我们部署服务的方式一致)。
    • 加快代理退役,简化主机故障的恢复过程。拥有重新连接 EBS 卷的能力,避免不必要地网络资源消耗,节省资金。

    Yelp 之前开发了在 Kubernetes 上运行有状态应用程序的实践(例如,Cassandra on PaaSTA and Flink on PaaSTA),因此 PaaSTA 是这个用例的自然选择。

    新的部署架构利用 PaaSTA 池(或主机组)作为底层基础设施。Kafka 代理 pod 调度在 Kubernetes 节点上,并且代理 pod 具有可分离的 EBS 卷。新架构的两个关键组件是 Kafka operator 和 Cruise Control,后面会更详细地介绍这两者。我们在 PaaSTA 上部署了我们内部的 Kafka Kubernetes Operator 实例和各种 Sidecar 服务,并且每个 Kafka 集群的 PaaSTA 上也部署了一个 Cruise Control 实例。

    新旧架构的两个关键区别是 Kafka 现在运行在 Docker 容器中,我们的配置管理方法不再依赖 Puppet。配置管理现在与基于 PaaSTA 的配置管理解决方案一致,在该解决方案中,只要 YAML 文件更改提交到服务配置存储库, Jenkins 就会传播这些变化。由于这次架构大修,我们才能够利用现有的 PaaSTA CLI 工具来查看集群的状态、读取日志并重新启动集群。另一个好处是,能够通过提供必要的配置(见下文)来部署新的 Kafka 集群,这种方法使我们配置新 Kafka 集群的时间减半。

    image.gif编辑

    example-test-prod:
      deploy_group: prod.everything
      pool: kafka
      brokers: 15
      cpus: 5.7  # CPU unit reservation breakdown: (5.7 (kafka) + 0.1 (hacheck) + 0.1 (sensu)) + 0.1 (kiam) = 6.0 (as an example, consider that our pool is comprised of m5.2xlarge instances)
      mem: 26Gi
      data: 910Gi
      storage_class: gp2
      cluster_type: example
      cluster_name: test-prod
      use_cruise_control: true
      cruise_control_port: 12345
      service_name: kafka-2-4-1
      zookeeper:
        cluster_name: test-prod
        chroot: kafka-example-test-prod
        cluster_type: kafka_example_test
      config:
        unclean.leader.election.enable: "false"
        reserved.broker.max.id: "2113929216"
        request.timeout.ms: "300001"
        replica.fetch.max.bytes: "10485760"
        offsets.topic.segment.bytes: "104857600"
        offsets.retention.minutes: "10080"
        offsets.load.buffer.size: "15728640"
        num.replica.fetchers: "3"
        num.network.threads: "5"
        num.io.threads: "5"
        min.insync.replicas: "2"
        message.max.bytes: "1000000"
        log.segment.bytes: "268435456"
        log.roll.jitter.hours: "1"
        log.roll.hours: "22"
        log.retention.hours: "24"
        log.message.timestamp.type: "LogAppendTime"
        log.message.format.version: "2.4-IV1"
        log.cleaner.enable: "true"
        log.cleaner.threads: "3"
        log.cleaner.dedupe.buffer.size: "536870912"
        inter.broker.protocol.version: "2.4-IV1"
        group.max.session.timeout.ms: "300000"
        delete.topic.enable: "true"
        default.replication.factor: "3"
        connections.max.idle.ms: "3600000"
        confluent.support.metrics.enable: "false"
        auto.create.topics.enable: "false"
        transactional.id.expiration.ms: "86400000"

    image.gif

    运行 Kafka 2.4.1 版本的有 15 个代理的集群的示例配置文件

    新架构详解

    新架构的一个主要组件是 Kafka Kubernetes operator,它负责管理 Kafka 集群的状态。虽然我们仍然依赖外部 ZooKeeper 集群来维护集群元数据,但消息数据仍然保存在 Kafka 代理的磁盘中。由于 Kafka 用户依赖持久存储来检索数据,在 Kubernetes 中,Kafka 被认为是一个有状态的应用程序。Kubernetes 公开了用于管理有状态应用程序的工作负载 API 对象 。

    (例如 StatefulSets ),但 Kubernetes 默认没有 Kafka-specific 结构。因此,需要标准 Kubernetes API 之外的其他功能来维护我们的实例。用 Kubernetes 的说法,operator 是一个自定义控制器,它允许我们公开这种特定的应用功能。

    image.gif编辑Operator 负责确定 Kubernetes 需要对集群执行操作的时间。它有一个协调循环,观察自定义集群资源的状态,并通过与 Kubernetes API 交互以及调用另一个关键架构组件 Cruise Control 公开的 API 来协调差异。

    Cruise Control 是 LinkedIn 开发的开源 Kafka 集群管理系统。目标是减少与维护大型 Kafka 集群的开销。每个 Kafka 集群都有自己专用的 Cruise Control 实例,每个集群的 Operator 与其 Cruise Control 实例交互以执行生命周期管理操作,如检查集群的健康状况、重新平衡主题分区和添加/删除代理。

    Cruise Control 使用的范式在许多方面与 operator 使用的范式相似。Cruise Control 监控 Kafka 集群的状态,生成一个内部模型,扫描异常目标,并尝试解决异常问题。它公开了用于各种管理任务和上述生命周期管理操作的 API 。这些 API 可替代我们之前的临时生命周期管理实现,我们使用 EC2 支持的代理来执行条件性再平衡操作或与 SNS 和 SQS 等 AWS 资源进行互动,将这些整合到一项服务中帮助简化生命周期管理栈。

    image.gif编辑

    将这些组件放在一起就形成了一个集群架构,我们通过内部配置管理系统定义了一个 CRD,并将其与自定义 Kafka Docker 镜像结合起来。Kafka Kubernetes operator 在与 Kubernetes API 的交互中使用配置、CRD 和 Docker 镜像 ,在 Kubernetes 主服务器上生成 KafkaCluster 自定义资源,因此可以在 Kubernetes 节点上调度 Kafka pod,operator 通过 Kubernetes API 和 Cruise Control 服务公开的 API 来监督和维护集群的健康状况。我们可以通过 Cruise Control UI 或 PaaSTA CLI 工具观察集群并与之交互。

    最后,通过一个示例场景来说明整个操作流程。考虑通过删除代理来缩小集群规模的情况。一个开发者更新集群的配置并减少代理的数量,从而更新 Kafka 集群的 CRD。作为协调循环的一部分,operator 认识到期望的集群状态与 StatefulSet 中表示的实际状态不同,所以它要求 Cruise Control 删除代理,Cruise Control API 返回有关删除任务的信息,operator 使用这个任务的元数据注释退役 pod。当 Cruise Control 执行将分区从代理移开的过程,operator 会通过向 Cruise Control 发出请求来例行检查停用的状态。一旦任务被标记为已完成,operator 将移除 pod ,集群规范的内部状态就被调和了。

    image.gif编辑

    架构设计好后,我们会做什么?

    在设计了这个架构之后,我们构建了一个将 Kafka 集群从 EC2 无缝迁移到 PaaSTA 的流程。截止目前,我们已经将许多集群迁移到 PaaSTA,并使用新架构部署了新集群。我们还在继续调整硬件选择,以适应集群的不同属性。

    引用链接

    [1]

    原文链接: https://engineeringblog.yelp.com/2021/12/kafka-on-paasta-part-one.html

    本期分享到此结束,关注博主不迷路,叶秋学长带你上高速~~

    相关文章
    |
    10月前
    |
    消息中间件 存储 Cloud Native
    云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”
    2024 年 12 月 24 日,由中国信息通信研究院(以下简称“中国信通院”)主办的“2025 中国信通院深度观察报告会:算力互联网分论坛”,在北京隆重召开。本次论坛以“算力互联网 新质生产力”为主题,全面展示中国信通院在算力互联网产业领域的研究、实践与业界共识,与产业先行者共同探索算力互联网产业未来发展的方向。会议公布了“2024 年度云原生与应用现代化标杆案例”评选结果,“云消息队列 Kafka 版 V3 系列”荣获“云原生技术创新标杆案例”。
    308 93
    |
    7月前
    |
    消息中间件 Cloud Native 大数据
    云原生 Kafka 问卷调研启动,你的声音很重要!参与赢精美礼品!
    Apache Kafka 作为高吞吐的分布式消息系统,支持实时数据采集、传输、存储及处理,广泛应用于日志收集、监控数据聚合、流式数据处理、在线和离线分析等场景,是大数据生态的核心组件。然而,随着云计算的快速发展,传统 Kafka 架构在云环境中的局限性日益凸显。
    170 18
    |
    7月前
    |
    消息中间件 Cloud Native 大数据
    ApsaraMQ x Confluent 云原生 Kafka 线上沙龙
    云消息队列 Kafka 版是基于 Apache Kafka 构建的全托管服务,依托于阿里云强大的基础设施,对 Apache Kafka 进行了深度重构,通过存算分离架构、高弹性扩展、云服务深度集成等优化,致力于打造更经济、更稳定、更弹性的云原生 Kafka 产品,助力企业在数字化与智能化转型中,实现业务的稳定增长与创新突破。同时,阿里云作为全球消息流领域领导者 Confluent 在中国大陆地区唯一的合作商,推出云消息队列 Confluent 版,为企业提供集成消息流式处理与大数据系统的一站式解决方案。
    |
    9月前
    |
    Cloud Native Serverless 数据中心
    阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
    ACK One注册集群已正式支持ACS(容器计算服务)算力,为企业的容器化工作负载提供更多选择和更强大的计算能力。
    |
    9月前
    |
    Cloud Native Serverless 数据中心
    阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
    阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
    300 10
    |
    11月前
    |
    存储 Kubernetes 开发者
    容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
    Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
    439 5
    容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
    |
    12月前
    |
    Kubernetes Cloud Native 微服务
    云原生入门与实践:Kubernetes的简易部署
    云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
    |
    12月前
    |
    Kubernetes Cloud Native 云计算
    云原生入门:Kubernetes 和容器化基础
    在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
    |
    存储 Cloud Native 数据处理
    从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
    本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
    282 0
    从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
    |
    3月前
    |
    运维 监控 Cloud Native
    从本土到全球,云原生架构护航灵犀互娱游戏出海
    本文内容整理自「 2025 中企出海大会·游戏与互娱出海分论坛」,灵犀互娱基础架构负责人朱晓靖的演讲内容,从技术层面分享云原生架构护航灵犀互娱游戏出海经验。
    417 16

    热门文章

    最新文章

    推荐镜像

    更多