0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何建立Kubernetes平台的?

GKwL_infoqchina 来源:InfoQ 2019-12-12 14:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

可能国内读者不太熟悉 Pinterest,但它在美国,可是坐拥 3 亿用户的美版“小红书”,媲美社媒巨头!如果你熟悉“小红书”,那么你就很容易理解 Pinterest 的定位了。在如此庞大体量的 Pinterest,是如何建立 Kubernetes 平台的? 1 为什么选择 Kubernetes?

在过去的几年里,有 3 亿多 Pinner 在 Pinterest 上保存了超过 2000 亿次 Pin,覆盖了超过 40 亿个 Board。为了服务于这个庞大的用户群和内容池,我们开发了数以千计的服务,从少数几个 CPU 的微服务到占用整个虚拟机群的巨大整体服务。还有来自各种不同框架的批处理作业,它们可以是 CPU、内存或 I/O 密集型。

译注:要理解这段话,译者有必要在这里简单介绍一下 Pinterest 及其基本元素。Pinterest 是一个图片社交平台,堪称图片版的 Twitter,用户可以发表自己的 Pin,也可以转发自己喜欢的图片。Pinterest 采用的是瀑布流的形式展现图片内容,无需用户翻页,新的图片不断自动加载在页面底端,让用户不断的发现新的图片。Pinterest 里面有一些基本元素。如 Pin。Pin 即你在 Pinterest 上发表的帖子,发布 Pin 的人统称被称为 Pinner。一个 Pin 通常是由一张图片,一个到外部网页的链接和几句简短的描述组成,并且发布的时候需要将其归类到它所属的 Board 里。

为了支持这些不同的工作负载,Pinterest 的基础架构团队面临着多种挑战:

工程师在启动工作负载时并没有统一的体验。无状态服务、有状态服务和批处理作业由完全不同的技术栈部署和管理。如此一来,给工程师们带来了陡峭的学习曲线,同时也给基础架构团队带来巨大的维护和客户支持负担。

管理自己的虚拟机群的工程师给 infra 团队带来了巨大的维护负担。操作系统或 AMI 升级等简单的操作可能需要耗时数周到数月的时间才能完成。生产工作负载在这些过程中也会遇到干扰,而这些过程本应对生产工作负载是透明的。

很难在独立的管理系统之上构建基础架构治理工具。对我们来说,更难确定哪些机器的归属,以及它们是否可以安全回收。

容器编排系统提供了统一工作负载管理的方法。它们还为更快的开发速度和更容易的基础架构治理铺平了道路,因为所有运行的资源都由集中式系统管理。

图 1:基础架构优先级(服务可靠性、开发人员生产力和基础架构效率)

Pinterest 的云管理平台团队早在 2017 年就开始了在 Kubernetes 的旅程。到 2017 年上半年,我们将大部分生产工作负载进行了容器化(包括核心 API 和 Web 服务器集群)。然后,通过构建产品集群并在其上运行实际工作负载,来对不同的容器编排系统进行广泛的评估。到 2017 年底,我们决定沿着 Kubernetes 的道路走下去,因为它具有灵活性,而且还有广泛的社区支持。

到目前为止,我们已经基于 Kops 构建了自己的集群引导工具,并将现有的基础架构组件集成到 Kubernetes 集群中,如网络、安全性、指标、日志记录、身份管理和流量等。我们还引入了 Pinterest 特定的自定义资源来模拟我们的独特工作负载,同时对开发人员隐藏运行时的复杂性。我们现在工作的重点是集群稳定性、可扩展性和客户支持。

2 Kubernetes:Pinterest 选择的路

运行 Kubernetes 来支持 Pinterest 这样规模的工作负载,同时又要让它成为我们工程师喜爱的平台,真的是一个很大的挑战。

作为一个大型组织,我们在基础架构工具上投入了大量资金,例如处理证书和密钥分发的安全工具、支持服务注册和发现的流量组件,以及提供日志和指标的可见性组件。这些组件都是基于艰难的经验教训上构建的,因此我们希望将它们整合到 Kubernetes 内,而不是“重新发明轮子”。这一做法也使得迁移变得更加容易,因为我们的内部应用已经获得了所需的支持。

另一方面,Kubernetes 本机工作负载模型(如部署、作业和守护进程集)并不足以为我们自己的工作负载进行建模。可用性问题是采用 Kubernetes 的巨大障碍。例如,我们曾经听到服务开发人员抱怨丢失或错误配置的原因“扰乱”了他们的终端。我们还看到批处理作业用户使用模板工具生成数百个同一作业规范的副本,最终导致了调试噩梦。

对工作负载的运行时支持也在不断发展,因此在同一个 Kubernetes 集群上支持不同版本将会变得异常困难。想象一下,如果我们需要面对许多版本的运行时,客户支持的复杂性,以及为它们进行升级或修补 bug 该有多大的困难。

3 Pinterest 自定义资源和控制器

为了让我们的工程师更容易地采用 Kubernetes,并使基础架构开发更快速、更顺畅,我们设计了自己的自定义资源(Custom Resource Definitions,CRD)

CRD 提供了以下功能:

将各种本机 Kubernetes 资源捆绑在一起,使它们作为单一工作负载进行工作。例如,PinterestService 资源将部署、服务、入口和应用配置管理组合在一起,因此服务开发人员无需担心为他们的服务设置 DNS。

为应用程序注入必要的运行时支持。用户只需关注自己业务逻辑的容器规范即可,而 CRD 控制器将必要的边车容器(sidecar)、初始容器、环境变量和卷(volume)注入到它们的容器节点(pod)规格中。这为应用工程师带来了开箱即用的体验。

CRD 控制器还可以对本机资源进行生命周期管理,并处理可见性和可调试性。这包括但不限于协调所需的规格和实际规格、CRD 状态更新和事件记录。如果没有 CRD 的话,应用工程师必须管理更多的资源,而且这个过程已经被证明很容易出错。下面是 PinterestService 和由控制器转换的本机资源的示例:

图 2:CRD 到本机资源。左边是用户编写的 Pinterest CR,右边是控制器生成的本机资源定义。

如图所示,为了支持用户的容器,我们需要插入一个初始容器和几个边车容器,以保证安全性、可见性和网络流量。此外,我们在批处理作业中引入了应用配置管理模板和 PVC 模板支持,以及许多环境变量来跟踪身份、资源利用率和垃圾收集。

难以想象工程师会愿意在没有 CRD 支持的情况下手工编写这些配置文件,更不用说维护和调试配置了。

4 应用程序部署工作流

图 3:Pinterest CRD 概述

图 3 展示了如何将 Pinterest 自定义资源部署到 Kubernetes 集群:

开发人员通过命令行界面(CLI)和用户界面(UI)与我们的 Kubernetes 集群进行交互。

CLI/UI 工具从 Artifactory 检索工作流配置 YAML 文件和其他构件属性(如版本 ID),并将它们发送到作业提交服务。这样可以确保只向 Kubernetes 集群提交已审查和已登录的工作负载。

作业提交服务是各种计算平台(包括 Kubernetes)的“网关”。用户身份验证、配额强制和部分 Pinterest CRD 配置验证都在这里进行。

一旦 CRD 通过了作业提交服务验证,它就会被发送到 Kubernetes API。

我们的 CRD 控制器监视所有自定义资源上的事件。它将 CR 转换为 Kubernetes 本机资源,将必要的边车容器添加到用户定义的容器节点中,设置适当的环境变量,并执行其他必要的内务处理工作,以确保用户的应用程序容器具有足够的基础架构支持。

然后,CRD 控制器将生成的本机资源写回 Kubernetes API 中,以便调度器(scheduler)可以提取这些资源并开始运行。

注意:这是新的基于 Kubernetes 的计算平台的早期采用者使用的预发布部署工作流。我们正对这一体验进行改进,使其与我们新的 CI/CD 平台完全继承,以避免暴露过多 Kubernetes 具体的细节。我们期待在即将发布的博文《为 Pinterest 构建 CI/CD 平台》中分享我们的动机、进展和后续影响。

5 自定义资源类型

基于 Pinterest 的具体需求,我们设计了以下适合不同工作流的 CRD:

PinterestService是长期运行的无状态服务。许多核心系统都基于一组此类服务。

PinterestJobSet为运行到完成的批处理作业建模。Pinterest 中一个非常常见的模式是,多个作业并行运行相同的容器,每个作业都只占用工作负载的一小部分,而不依赖于彼此。

PinterestCronJob被据用轻量级周期性工作负载的团队广泛采用。PinterestCronJob 是围绕本机 cron 作业的包装器,支持 Pinterest 特有的安全性、流量、日志和指标等。

PinterestDaemon仅限于与基础架构相关的守护进程。随着我们在集群上添加更多的支持,PinterestDaemon 的家族仍在增长。

PinterestTrainingJob封装了 TensorFlow 和 PyTorch 作业,提供了与所有其他 CRD 相同级别的运行时支持。由于 Pinterest 大量使用 TensorFlow 和其他机器学习框架,因此围绕他们构建专门的 CRD 是有意义的。

我们还有正在构建的PinterestStatefulSet,将很快被用于存储和其他有状态系统。

6 运行时支持

当应用程序容器节点在 Kubernetes 上启动时,它会自动获得一个证书标识自己。此证书用于通过 mTLS 访问机密存储或与其他服务进行通信。同时,配置管理初始容器和守护进程将确保在应用程序容器启动之前就下载好所有必需的依赖项。当应用程序容器准备就绪时,流量边车容器和守护进程将会向容器节点注册到 Zookeeper,以便让客户端可以发现它。甚至在容器节点启动之前,网络守护进程就已经为容器节点设置好了网络。

以上就是服务工作负载的典型运行时支持的示例。其他工作负载类型可能需要稍微不同的支持,但他们都是以容器节点级边车容器、节点级守护进程集或虚拟机级守护进程的形式出现的。我们确保所有这些应用程序都是由基础架构团队部署,以便它们在所有应用程序之间保持一致,从而极大减少我们的维护和客户支持的负担。

7 测试与质量保证

我们在本机 Kubernetes 测试基础上构建了一个端到端的测试管道。这些测试部署到所有的集群。这个管道在到达生产集群之前就已经经历了多次回归。

除了测试基础架构之外,还有监视和报警系统,这些系统持续监控系统组件的健康状态、资源利用率和其他关键指标,在需要人工干预时通知我们。

8 备选方案

我们考虑了一些自定义资源的备选方案,比如变异许可控制器和模板系统。但是,所有的备选方案都存在重大问题,因此我们选择了 CRD 的路径。

变异许可控制器以用于注入边车容器、环境变量和其他运行时支持。然而,它很难讲资源捆绑在一起以及管理它们的生命周期,而 CRD 则需要协调、状态更新和生命周期管理功能。

模板系统(如 Helm charts)也被广泛用于启动具有类似配置的应用程序。但是,我们的工作负载过于多样化,无法通过模板进行管理。我们还需要支持持续部署,这在使用模板时很容易出错。

9 未来的工作

目前,我们在所有的 Kubernetes 集群上运行混合工作负载。为了支持不同大小和类型的工作负载,我们正在开展一下方面的工作:

集群联邦(Cluster Federation)将大型应用程序分布在不同的集群上,以实现可扩展性和稳定性。

集群稳定性、可扩展性和可见性,确保应用程序到达其服务级别协议。

资源和配额管理,以确保应用程序不会相互干扰,集群规模得到控制。

新的 CI/CD 平台,支持 Kubernetes 上的应用程序部署。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    114

    文章

    17638

    浏览量

    190260
  • 应用程序
    +关注

    关注

    38

    文章

    3342

    浏览量

    59926
  • kubernetes
    +关注

    关注

    0

    文章

    256

    浏览量

    9412

原文标题:Pinterest 的 Kubernetes 实践

文章出处:【微信号:infoqchina,微信公众号:InfoQ】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    香港服务器支持Docker和Kubernetes吗?

    在云原生技术成为主流的今天,Docker和Kubernetes(K8s)已成为现代化应用开发和部署的事实标准。对于选择香港服务器的开发者与企业而言,一个核心问题是:香港服务器能否完美支持Docker
    的头像 发表于 10-21 15:47 372次阅读

    借助京东AI言犀提升Kubernetes集群巡检的效率和准确性

    介绍 目前k8s-cluster-inspector组件可以自动化完成Kubernetes集群巡检,并在巡检结果中给出当前集群存在的问题,问题分级,问题类型,问题解决方法。 示例巡检数据结构如下
    的头像 发表于 09-15 16:56 436次阅读
    借助京东AI言犀提升<b class='flag-5'>Kubernetes</b>集群巡检的效率和准确性

    Kubernetes安全加固的核心技术

    在生产环境中,Kubernetes集群的安全性直接关系到企业数据安全和业务稳定性。本文将从实战角度,带你掌握K8s安全加固的核心技术。
    的头像 发表于 08-18 11:18 499次阅读

    高效管理Kubernetes集群的实用技巧

    作为一名经验丰富的运维工程师,我深知在日常的Kubernetes集群管理中,熟练掌握kubectl命令是提升工作效率的关键。今天,我将分享15个经过实战检验的kubectl实用技巧,帮助你像艺术家一样优雅地管理K8s集群。
    的头像 发表于 08-13 15:57 601次阅读

    生产环境中Kubernetes容器安全的最佳实践

    随着容器化技术的快速发展,Kubernetes已成为企业级容器编排的首选平台。然而,在享受Kubernetes带来的便利性和可扩展性的同时,安全问题也日益凸显。本文将从运维工程师的角度,深入探讨生产环境中
    的头像 发表于 07-14 11:09 491次阅读

    树莓派部署 Kubernetes:通过 UDM Pro 实现 BGP 负载均衡!

    最近,我将家庭实验室的架构核心切换为一组树莓派。尽管在树莓派上运行的Kubernetes发行版众多,但在资源受限的设备上运行Kubernetes时,控制平面的开销是一个常见挑战
    的头像 发表于 06-25 18:00 736次阅读
    树莓派部署 <b class='flag-5'>Kubernetes</b>:通过 UDM Pro 实现 BGP 负载均衡!

    Kubernetes Helm入门指南

    Helm 是 Kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 Kubernetes 应用的管理工作。Helm 的出现是为了解决在 Kubernetes
    的头像 发表于 04-30 13:42 2898次阅读
    <b class='flag-5'>Kubernetes</b> Helm入门指南

    如何在基于Arm Neoverse平台的CPU上构建分布式Kubernetes集群

    在本文中,我们将以 X(原 Twitter)为例,演示如何在基于 Arm Neoverse 平台的 CPU 上构建分布式 Kubernetes 集群,以根据推文实时监控情绪变化。如此一来,你可以充分利用 Arm Neoverse 平台
    的头像 发表于 03-25 15:58 647次阅读
    如何在基于Arm Neoverse<b class='flag-5'>平台</b>的CPU上构建分布式<b class='flag-5'>Kubernetes</b>集群

    Kubernetes中部署MySQL集群

    一般情况下 Kubernetes 可以通过 ReplicaSet 以一个 Pod 模板创建多个 pod 副本,但是它们都是无状态的,任何时候它们都可以被一个全新的 pod 替换。
    的头像 发表于 03-18 16:22 618次阅读
    <b class='flag-5'>Kubernetes</b>中部署MySQL集群

    Kubernetes包管理工具Helm的安装和使用

    Helm 可以帮助我们管理 Kubernetes 应用程序 - Helm Charts 可以定义、安装和升级复杂的 Kubernetes 应用程序,Charts 包很容易创建、版本管理、分享和分布。
    的头像 发表于 03-13 16:06 1919次阅读

    Kubernetes Pod常用管理命令详解

    Kubernetes Pod常用管理命令详解
    的头像 发表于 02-17 14:06 989次阅读
    <b class='flag-5'>Kubernetes</b> Pod常用管理命令详解

    Kubernetes:构建高效的容器化应用平台

    Kubernetes 作为容器编排的事实标准,在容器化应用部署中发挥着关键作用。 搭建 Kubernetes 集群是应用的基础。可以使用kubeadm工具快速搭建。在主节点执行kubeadm
    的头像 发表于 01-23 15:22 576次阅读

    使用 Flexus 云服务器 X 实例部署 Kubernetes 图形化管理平台

    Kubernetes 作为当今最流行的容器编排平台,随着云计算、微服务架构和 DevOps 文化的普及,Kubernetes 在自动化部署、扩展和管理容器化应用程序方面扮演着越来越重要的角色。未来
    的头像 发表于 01-21 16:14 554次阅读
    使用 Flexus 云服务器 X 实例部署 <b class='flag-5'>Kubernetes</b> 图形化管理<b class='flag-5'>平台</b>

    Kubernetes的CNI网络插件之flannel

    Kubernetes设计了网络模型,但却将它的实现讲给了网络插件,CNI网络插件最重要的功能就是实现Pod资源能够跨主机通信。
    的头像 发表于 01-02 09:43 1189次阅读

    艾体宝与Kubernetes原生数据平台AppsCode达成合作

    虹科姐妹公司艾体宝宣布与Kubernetes 原生数据平台 AppsCode达成正式合作,致力于将其核心产品KubeDB引入中国市场,为企业提供专业、高效的云原生数据库管理解决方案。
    的头像 发表于 12-16 15:07 894次阅读