在HashiCorp Nomad上运行OpenTelemetry演示应用

博客文章在发布后不会更新。这篇文章已经发布一年多了,其内容可能已过时,部分链接可能无效。在依赖任何信息之前,请务必核实。

各位……我太激动了,因为我终于完成了一件我技术清单上的事情。上周,我开始将 OpenTelemetry 演示应用程序Helm Charts 移植到 HashiCorp Nomad 作业规格。今天我将讨论如何使用我最喜欢的 Hashi-in-a-box 工具 HashiQube 在 Nomad 上运行 OpenTelemetry 演示应用程序。

我们开始吧!

Aerial view of Toronto, Canada at night

Deployment

假设

在我们继续之前,我假设您对以下内容有基本了解

先决条件

为了运行本教程中的示例,您将需要以下

  • Docker(本文撰写时版本为 20.10.21)
  • Vagrant(本文撰写时版本为 2.3.1)

教程存储库

以下是我们将在今天的教程中使用的存储库

HashiQube 设置

在开始之前,温馨提示一下,HashiQube 默认在 Docker 上运行 NomadVaultConsul。此外,我们将向 Nomad 部署 21 个作业规格。这意味着我们需要相当多的 CPU 和 RAM,因此请确保您的 Docker Desktop 分配了足够的资源。作为参考,我使用的是配备 8 核和 32 GB RAM 的 M1 MacBook Pro。我的 Docker Desktop 资源设置如下:

  • CPU 3
  • 内存:9.5GB
  • 交换:3GB

如果您需要视觉参考,这是我的 Docker Preferences Resources 设置的截图

Screen capture of Docker Desktop resources preferences

有关更多信息,请参阅 Docker 文档,了解如何更改 MacWindowsLinux 的资源设置。

1- 更新 /etc/hosts

我们使用 Traefik 负载均衡器来公开我们的服务,这些服务可以通过 localhost 的子域名访问。为了确保我们能够访问 Traefik 公开的服务(以及 Traefik 仪表板本身),您需要在宿主机上的 /etc/hosts 文件中添加以下条目

127.0.0.1   traefik.localhost
127.0.0.1   otel-demo.localhost

2- 使用 HashiQube 部署本地 Hashi 环境

按照详细的 快速入门说明 开始 HashiQube。

注意: 如果遇到问题,请务必查看 注意事项 部分。

一旦一切运行正常(这需要几分钟时间),您将在启动序列的末尾看到此内容,表明一切正常

Screen capture of the tail-end of the HashiQube startup sequence, displaying the URLs for Nomad, Nomad Documentation, Traefik, and Traefik documentation

您现在可以使用以下 URL 访问应用程序

别忘了下载并安装 Nomad CLIVault CLI

如果您需要 SSH 进入 HashiQube,请在宿主机上打开一个新的终端窗口,然后运行以下命令

vagrant ssh

3- 部署 OTel 演示应用程序

我们终于准备好部署 OTel 演示应用程序了!

首先,让我们克隆存储库,然后进入我们的工作目录

git clone https://github.com/avillela/nomad-conversions.git
cd nomad-conversions

接下来,让我们在 Nomad 中启用 内存超额分配。这是一个一次性设置。

nomad operator scheduler set-config -memory-oversubscription true

内存超额分配允许 Nomad 使用比分配给作业更多的内存。例如,考虑 `resources` 块中的此设置

resources {
   cpu    = 55
   memory = 1024
   memory_max = 2048
}

我们为作业分配了 55Mz 的处理能力(`cpu` 设置),以及 1024MB 的 RAM(`memory` 设置)。在这种情况下,当启用了内存超额分配,并且作业需要的内存超过了分配的 1024MB 时,Nomad 将为作业分配最多 2048MB 的 RAM(`memory_max` 设置)。请注意,如果未启用内存超额分配,Nomad 将忽略 `memory_max` 设置。

接下来,让我们部署服务

nomad job run -detach otel-demo-app/jobspec/traefik.nomad
nomad job run -detach otel-demo-app/jobspec/redis.nomad
nomad job run -detach otel-demo-app/jobspec/ffspostgres.nomad
nomad job run -detach otel-demo-app/jobspec/otel-collector.nomad
nomad job run -detach otel-demo-app/jobspec/adservice.nomad
nomad job run -detach otel-demo-app/jobspec/cartservice.nomad
nomad job run -detach otel-demo-app/jobspec/currencyservice.nomad
nomad job run -detach otel-demo-app/jobspec/emailservice.nomad
nomad job run -detach otel-demo-app/jobspec/featureflagservice.nomad
nomad job run -detach otel-demo-app/jobspec/paymentservice.nomad
nomad job run -detach otel-demo-app/jobspec/productcatalogservice.nomad
nomad job run -detach otel-demo-app/jobspec/quoteservice.nomad
nomad job run -detach otel-demo-app/jobspec/shippingservice.nomad
nomad job run -detach otel-demo-app/jobspec/checkoutservice.nomad
nomad job run -detach otel-demo-app/jobspec/recommendationservice.nomad
nomad job run -detach otel-demo-app/jobspec/frontend.nomad
nomad job run -detach otel-demo-app/jobspec/loadgenerator.nomad
nomad job run -detach otel-demo-app/jobspec/frontendproxy.nomad
nomad job run -detach otel-demo-app/jobspec/grafana.nomad
nomad job run -detach otel-demo-app/jobspec/jaeger.nomad
nomad job run -detach otel-demo-app/jobspec/prometheus.nomad

由于我们以 分离模式 运行作业,Nomad 不会等待当前作业成功部署后再启动下一个作业。这意味着您的输出将类似于

Job registration successful
Evaluation ID: d3eaa396-954e-241f-148d-6720c35f34bf
Job registration successful
Evaluation ID: 6bba875d-f415-36b7-bfeb-2ca4b9982acb
Job registration successful
Evaluation ID: 16dc8ef8-5e26-68f4-89b6-3d96b348775b
Job registration successful
Evaluation ID: 34de0532-a3b5-8691-bf18-51c0cc030573
Job registration successful
Evaluation ID: 7310e6a2-9945-710b-1505-c01bd58ccd35
...

提醒一下,`Evaluation ID` 的值在您的机器上会不同。

4- 在 Nomad 中查看!

在部署过程中,您可以前往 Nomad UI,地址为 https://:4646,查看进展情况

Screen capture of jobs view in Nomad. Some jobs have started, and others are still starting up.

所有服务都需要一些时间才能启动(有时长达 10 分钟),尤其是因为 Nomad 需要下载镜像并初始化服务,所以请耐心等待!由于某些服务依赖于其他服务才能运行,您可能会看到一些服务处于中间状态,或者有些服务在一段时间内上下波动,正如上面的屏幕截图所示。不要惊慌!一切都会好起来的!!

一旦所有作业都运行正常,您将看到一切都显示为绿色,如下所示

Screen capture of jobs view in Nomad, with all jobs started

您也可以前往 Consul,地址为 https://:8500,查看服务的健康状况

Screen capture of Consul service health. All services healthy.

默认情况下,不健康的服务的会显示在顶部,旁边有一个红色的“x”。由于在上面的屏幕截图中看不到任何讨厌的红色“x”,所以我们知道我们的服务运行良好!

5- 访问 OTel 演示应用程序

OTel 演示应用程序使用 Envoy 来公开一系列前端服务:网店、JaegerGrafana、Load Generator 和 Feature Flag。这些都由 frontendproxy 服务管理。Traefik 通过 `otel-demo.localhost` 地址公开了 frontendproxy 服务。

这通过 frontendproxy.nomad 中的 `service` 块中的以下代码片段配置:

tags = [        "traefik.http.routers.frontendproxy.rule=Host(`otel-demo.localhost`)",
    "traefik.http.routers.frontendproxy.entrypoints=web",
    "traefik.http.routers.frontendproxy.tls=false",
    "traefik.enable=true",
]

请注意,`Host` 设置为 `otel-demo.localhost`。

通过以下 URL 访问服务。

网店: http://otel-demo.localhost/

Screen capture of the Demo App Web Store UI

去看看琳琅满目的望远镜和配件,买几件吧。😉🔭

Jaeger UI: http://otel-demo.localhost/jaeger/ui/

Screen capture of the Jaeger UI

在上面的屏幕截图中,我们可以看到一个来自 checkoutservice 的示例追踪。

Grafana: http://otel-demo.localhost/grafana/

Screen capture of one of the OpenTelemetry dashboard on GrafanaScreen capture of the recommendationservice metrics dashboard on Grafana

演示应用程序自带两个 Grafana 仪表板,展示了使用 OpenTelemetry 发出的指标。

功能标志 UI: http://otel-demo.localhost/feature/

Screen capture of featureflagservice UI

负载生成器 UI: http://otel-demo.localhost/loadgen/

Screen capture of loadgenerator UI

注意事项

虽然我认为我已经设法解决了在 Nomad 中运行 OTel 演示应用程序的大部分问题,但我在部署服务时遇到了一些障碍。

服务有时无法连接到 Collector

尽管所有服务似乎都已成功启动,但在某些情况下,一些服务似乎无法连接到 OTel Collector。我还没有完全弄清楚原因,所以目前我只是重新启动 otel-collector.nomad。如果 Webapp UI 中的某些内容看起来有点奇怪(例如缺少产品或货币),我也会重新启动 frontend.nomad。通常,在 Jaeger 中显示的服务的数量是服务未向 Collector 发送遥测数据的良好指标。您应该看到 14 个服务,包括 `jaeger-query` 服务。

Screen capture of Jaeger service list drop-down

宿主机内存不足

是的……尽管我的机器很强大,但我的宿主机有时也会出现内存不足的情况。Chrome 和 Safari 中有无数个标签页可能没有帮助。此外,让我们面对现实:HashiQube + Nomad 中的 21 个作业可能会占用大量内存。我在 HashiQube 和 Docker 的内存设置上做了一些调整,以尽量减少内存问题,但万一内存怪兽缠上了您,我建议关闭浏览器和其他应用程序,然后重新打开它们以释放一些内存。如果发生这种情况,请告诉我!

正在进行的工作

请注意,这个项目仍在进行中。如果您有任何改进建议,或者想进一步合作开发 Nomad 作业规格,请 联系我

最后的想法

好了,各位!现在您已经看到了一个在 HashiCorp Nomad 上部署 OpenTelemetry 演示应用程序(一个运行 OpenTelemetry 的多微服务应用程序)的示例。主要亮点:

在我结束之前,我想特别感谢 HashiCorp 的 Luiz Aoqui,他帮助我调整了 Nomad 作业规格,以及 Riaan Nolan,感谢他为 HashiQube 所做的持续工作。(顺便说一下,LuizRiaan 都曾做客我的 On-Call Me Maybe Podcast!)

现在,我将用一张老鼠 Phoebe 从粉色篮子里探出头的照片送给你们。她是不是看起来很可爱?🥰

Light brown and white rat peering out of a pink wicker basket

和平、爱与代码。🦄 🌈 💫


对 OTel 演示应用程序在 Nomad 上的部署有疑问?欢迎通过 MastodonLinkedIn 联系。


OpenTelemetry 社区一直欢迎贡献!加入我们!如果您在 Mastodon 上,请务必关注 Mastodon 上的 OpenTelemetry

上次修改于 2025 年 5 月 22 日:[chore] Accessible links 6 (#6054) (e30bfac8)