Cloudflare:如何使用HashiCorp Nomad

时间:2021-07-15 | 标签: | 作者:Q8 | 来源:Cloudflare网络

小提示:您能找到这篇{Cloudflare:如何使用HashiCorp Nomad}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的Cloudflare:如何使用HashiCorp Nomad内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您!

在此博客文章中,我们将向您介绍在全球200多个边缘城市中运行的服务的可靠性模型。然后,我们将探讨如何部署新的动态任务调度系统HashiCorp Nomad,帮助我们改善每个数据中心的服务可用性,涵盖了我们如何部署Nomad以及克服的挑战。最后,我们将向您展示我们目前如何使用Nomad以及将来如何计划使用Nomad。



每个数据中心中运行的服务的可靠性模型

对于此博客文章,我们将区分每个数据中心中运行的两种不同类别的服务:



  • 面向客户的服务:客户使用的所有产品堆栈,例如缓存,WAF,DDoS保护,速率限制,负载平衡等。

  • 管理服务:操作数据中心所需的软件,该软件不在客户流量的直接请求路径中。

面向客户的服务

我们面向客户的服务的可靠性模型是在每个数据中心的所有计算机上运行它们。这非常有效,因为它允许通过添加更多计算机来动态扩展每个数据中心的容量。

多亏了我们在每台机器上运行的动态负载平衡系统Unimog,使扩展变得特别容易。它的作用是根据当前资源的使用情况不断地重新平衡流量,并检查服务的运行状况。这有助于为单个计算机故障提供弹性,并确保所有计算机上的资源使用率几乎相同。

例如,这是我们一个数据中心一天中的CPU使用情况,其中每个时间序列代表一台机器,不同的颜色代表不同代的硬件。Unimog使所有计算机处理流量并保持大致相同的CPU利用率。

管理服务

我们的一些大型数据中心拥有大量计算机,但有时我们需要在每个位置仅可靠地运行一个或几个管理服务实例。

当前有两种方法可以做到这一点,每种方法各有利弊:

  1. 将服务部署到数据中心中的所有计算机:

    • 专业版:确保服务的可靠性

    • 缺点:它不必要地使用了本可以用于服务客户流量且不具有成本效益的资源

  2. 将服务部署到每个数据中心中的少数几台机器上:

    • 优点:更少浪费资源,更具成本效益

    • 缺点:当少数机器意外故障时,它冒着服务不可用的风险

第三种更可行的选择是使用动态任务调度,以便在确保可靠性的同时仅使用适当数量的资源。

需要更动态的任务调度

对于我们希望在每个数据中心中运行的管理服务,必须在两个次优的可靠性模型选项之间进行选择,这并不理想。

确实,其中一些服务即使不在请求路径中,也需要继续运行数据中心。如果运行这些服务的计算机不可用,在某些情况下,我们必须在恢复它们时临时禁用数据中心。这样做会自动将用户重新路由到下一个可用的数据中心,并且不会造成中断。实际上,整个Cloudflare网络网站网页开发都设计为在禁用数据中心并自动恢复的状态下运行。但是最好将最终用户路由到他们附近的数据中心,以便我们希望最大程度地减少任何数据中心级别的停机时间。

这使我们意识到,我们需要一个系统来确保每个数据中心中正在运行一定数量的服务实例,而不管最终由哪个物理机运行该服务。

面向客户的服务在每个数据中心的所有计算机上运行,并且不需要加入该新系统。另一方面,当前在固定子集的机器上运行的服务具有次优的可靠性保证,不需要在所有机器上运行的服务都是上线的理想选择。

我们的选择:HashiCorp Nomad

根据我们的一系列要求,我们对候选解决方案进行了一些研究。

虽然Kubernetes是抖音涨粉渠道另一个选择,但出于以下原因,我们决定使用HashiCorp的Nomad:

  • 满足我们的最初要求,该要求是可靠地运行每个数据中心中资源隔离的二进制实例。

  • 几乎没有依赖关系,并且可以直接与Consul集成。Consul是我们已经在每个数据中心中部署的另一套HashiCorp软件。它提供了分布式键值存储和服务发现功能。

  • 轻量级(单个Go二进制文件),易于部署和配置新集群,这在部署与我们数据中心一样多的集群时是一个加号。

  • 具有模块化的任务驱动程序(负责执行任务和提供资源隔离的部分)体系结构,不仅支持容器,而且还支持二进制文件和任何自定义任务驱动程序。

  • 是开源的,用Go编写。我们在团队中拥有Go语言方面的经验,Nomad在GitHub上拥有一个响应迅速的维护者社区。

部署架构

游牧民族分为两个不同的部分:

  1. Nomad Server:组成负责调度的群集的实例,每个数据中心五个实例以提供足够的容错能力

  2. Nomad Client:执行实际任务的实例,在每个数据中心的所有计算机上运行

为了保证Nomad Server群集的可靠性,我们在属于不同故障域的计算机上部署了实例:

  • 在不同的相互连接的物理数据中心中形成一个位置

  • 在不同的机架中,连接到不同的交换机

  • 在不同的多节点机箱中(我们大多数的边缘硬件以多节点机箱的形式出现,一个机箱包含四个单独的服务器)

我们还向配置管理工具中添加了逻辑,以确保无论每天发生的服务器扩展和停用情况如何,我们始终保持一致数量的Nomad Server实例。

逻辑很简单,随着服务器的扩展和停用,Nomad 黄小厨公关危机Server角色将重新分配到新的计算机列表中。然后,我们的配置管理工具可确保Nomad Server在新计算机上运行,然后再关闭旧计算机。

此外,由于服务器的扩展和退役会一次影响一部分机架,而Nomad Server角色分配逻辑可提供机架多样性保证,因此群集始终保持仲裁状态,因此可以保持健康。

作业文件

Nomad作业文件被模板化并检入git存储库。然后,我们的配置管理工具可确保在每个数据中心中安排作业。从那里开始,Nomad接管并确保作业始终在每个数据中心中运行。

通过向每个Nomad Client公开机架元数据,我们可以确保特定服务的每个实例在不同的机架中运行并绑定到不同的故障域。这样,我们可以确保一个服务器机架的故障不会影响服务运行状况,因为该服务也在另一个机架中运行,不受故障影响。

我们通过以下作业文件约束来实现这一目标:

constraint {
  attribute = "${meta.rack}"
  operator  = "distinct_property"}

服务发现

我们利用Nomad与Consul的集成来将Nomad作业动态添加到Consul服务目录中。这使我们可以通过查询Consul来发现每个数据中心中当前正在运行特定服务的位置。此外,启用Consul DNS接口后,我们还可以使用基于DNS的查找来定位Nomad上运行的服务。



可观察性

为了能够正常运行与我们数据中心一样多的Nomad群集,对Nomad群集和在这些群集上运行的服务的良好可观察性至关重要。

我们使用Prometheus来抓取在每个数据中心中运行的Nomad Server和Client实例,并使用Alertmanager来提醒关键指标。使用Prometheus指标,我们构建了Grafana仪表板以提供每个集群的可见性。

我们通过查询领事服务目录并使用以下Prometheus配置定期抓取其指标来设置Prometheus实例以发现在Nomad上运行的服务:

- consul_sd_configs:
  - server: localhost:8500
  job_name: management_service_via_consul
  relabel_configs:
  - action: keep
    regex: management-service
    source_labels:
    - __meta_consul_service

然后,我们使用这些指标来创建Grafana仪表板并为在Nomad上运行的服务设置警报。

为了限制对Nomad API端点的访问,我们启用了双向TLS身份验证,并正在为与Nomad进行交互的每个实体生成客户端证书。这样,只有具有有效客户端证书的实体才能与Nomad API端点进行交互,以便安排作业或执行任何CLI操作。

挑战性

部署新组件总是伴随着一系列挑战。这是我们在此过程中必须克服的一些障碍的列表。

Initramfs rootfs和ivot_root

当开始使用exec驱动程序运行在chroot环境中隔离的二进制文件时,我们注意到不支持在initramfs上运行的无状态根分区,因为该任务无法启动,并且在日志中显示了此错误消息:

Feb 12 19:49:03 machine nomad-client[258433]: 2020-02-12T19:49:03.332Z [ERROR] client.alloc_runner.task_runner: running driver failed: alloc_id=fa202-63b-33f-924-42cbd5 task=server error="failed to launch command with executor: rpc error: code = Unknown desc = container_linux.go:346: starting container process caused "process_linux.go:449: container init caused "rootfs_linux.go:109: jailing process inside rootfs caused \"pivot_root invalid argument\""""

我们提交了一个GitHub问题,并提交了一个变通解决方案拉取请求,该请求被迅速审查并合并到上游。

同时,为了获得最大的隔离安全性,我们pivot_root通过修改启动过程来启用设置,并且其他团队成员开发并提出了内核邮件列表的补丁程序,以使其在将来变得更容易。

资源使用情况遏制

一个非常重要的方面是确保在Nomad上运行的任务的资源使用不会破坏同一台计算机上共存的其他服务。

磁盘空间是每台计算机上的共享资源,必须为Nomad设置配额。我们通过将Nomad数据目录隔离到每台计算机上的专用固定大小的安装点来实现此目的。但是,Nomad目前不支持限制磁盘带宽和IOPS。

Nomad作业文件的资源部分可以限制内存和CPU的使用(内存以MB为单位,cpu以MHz为单位):

resources {
  memory = 2000
  cpu = 500}

这在后台使用了cgroups,我们的测试表明,虽然可以像预期那样强制执行内存限制,但是只要主机上有可用的CPU,CPU限制就是软限制并且不强制执行。

工作量(不可预测)

如上所述,所有计算机当前都运行相同的面向客户的工作负载。动态调度各个作业与游牧到单机器上运行挑战假设。

虽然我们的动态负载平衡系统Unimog会根据资源使用情况来平衡请求,以确保所有计算机上的请求都几乎相同,但是具有大量资源使用情况的批处理类型作业可能会带来挑战。

随着我们提供更多服务,我们将对此予以关注:

  • 尝试通过上述限制限制游牧民族工作的资源利用率

  • 确保Unimog适应此批处理类型的工作量,并且不会出现正反馈循环

我们在Nomad上运行的是什么

现在,Nomad已部署在每个数据中心,我们能够通过逐步启用这些服务来提高对运营必不可少的管理服务的可靠性。我们迈出了第一步,加入了重启和维护管理服务。

重新启动和维护管理服务

在每个数据中心,我们都运行一项服务,该服务可促进在线无人值守的滚动重启和机器维护。该服务曾经在每个数据中心的一台知名机器上运行。这使其容易受到单机故障的影响,并且在停机时阻止了计算机在重新启动后自动启用。因此,有人将onboarded游牧,以提高其可靠性,良好的第一服务。

现在,我们保证此服务始终在每个数据中心中运行,而不管单个计算机是否发生故障。他们现在不再查询依赖于知名地址的其他机器来定位此服务,而是查询Consul DNS并动态确定服务在何处与之交互。

Cloudflare:如何使用HashiCorp Nomad

上一篇:海外版知乎Quora是如何成功出海日本的?请看这篇
下一篇:语音搜索如何做ASO?


版权声明:以上主题为“Cloudflare:如何使用HashiCorp Nomad"的内容可能是本站网友自行发布,或者来至于网络。如有侵权欢迎联系我们客服QQ处理,谢谢。
相关内容
推荐内容
扫码咨询
    Cloudflare:如何使用HashiCorp Nomad
    打开微信扫码或长按识别二维码

小提示:您应该对本页介绍的“Cloudflare:如何使用HashiCorp Nomad”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通Cloudflare:如何使用HashiCorp Nomad的相关事宜。

关键词:Cloudflare:如何使用HashiC

关于 | 业务 | 案例 | 免责 | 隐私
客服邮箱:sales@1330.com.cn
电话:400-021-1330 | 客服QQ:865612759
沪ICP备12034177号 | 沪公网安备31010702002418号