在HashiCorp Nomad上运行OpenTelemetry演示应用
博客文章在发布后不会更新。这篇文章已经发布一年多了,其内容可能已过时,部分链接可能无效。在依赖任何信息之前,请务必核实。
各位……我太激动了,因为我终于完成了一件我技术清单上的事情。上周,我开始将 OpenTelemetry 演示应用程序 的 Helm Charts 移植到 HashiCorp Nomad 作业规格。今天我将讨论如何使用我最喜欢的 Hashi-in-a-box 工具 HashiQube 在 Nomad 上运行 OpenTelemetry 演示应用程序。
我们开始吧!

Deployment
假设
在我们继续之前,我假设您对以下内容有基本了解
- Nomad。如果没有,请阅读我的 Nomad 入门文章。 Daniela Baron 的这篇博文也很棒。
- 可观测性 (o11y) 和 OpenTelemetry (OTel)。如果没有,请参阅 可观测性入门。
先决条件
为了运行本教程中的示例,您将需要以下
教程存储库
以下是我们将在今天的教程中使用的存储库
- 我修改过的 HashiQube 存储库(servian/hashiqube 的分支)。如果您好奇,可以查看 我为 hashiqube 所做的修改。
- 我的 Nomad 转换 存储库
HashiQube 设置
在开始之前,温馨提示一下,HashiQube 默认在 Docker 上运行 Nomad、Vault 和 Consul。此外,我们将向 Nomad 部署 21 个作业规格。这意味着我们需要相当多的 CPU 和 RAM,因此请确保您的 Docker Desktop 分配了足够的资源。作为参考,我使用的是配备 8 核和 32 GB RAM 的 M1 MacBook Pro。我的 Docker Desktop 资源设置如下:
- CPU 3
- 内存:9.5GB
- 交换:3GB
如果您需要视觉参考,这是我的 Docker Preferences Resources 设置的截图

有关更多信息,请参阅 Docker 文档,了解如何更改 Mac、Windows 和 Linux 的资源设置。
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。
注意: 如果遇到问题,请务必查看 注意事项 部分。
一旦一切运行正常(这需要几分钟时间),您将在启动序列的末尾看到此内容,表明一切正常

您现在可以使用以下 URL 访问应用程序
- Vault: https://:8200
- Nomad: https://:4646
- Consul: https://:8500
- Traefik: http://traefik.localhost
别忘了下载并安装 Nomad CLI 和 Vault 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,查看进展情况

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

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

默认情况下,不健康的服务的会显示在顶部,旁边有一个红色的“x”。由于在上面的屏幕截图中看不到任何讨厌的红色“x”,所以我们知道我们的服务运行良好!
5- 访问 OTel 演示应用程序
OTel 演示应用程序使用 Envoy 来公开一系列前端服务:网店、Jaeger、Grafana、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/

去看看琳琅满目的望远镜和配件,买几件吧。😉🔭
Jaeger UI: http://otel-demo.localhost/jaeger/ui/

在上面的屏幕截图中,我们可以看到一个来自 checkoutservice 的示例追踪。
Grafana: http://otel-demo.localhost/grafana/


演示应用程序自带两个 Grafana 仪表板,展示了使用 OpenTelemetry 发出的指标。
功能标志 UI: http://otel-demo.localhost/feature/

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

注意事项
虽然我认为我已经设法解决了在 Nomad 中运行 OTel 演示应用程序的大部分问题,但我在部署服务时遇到了一些障碍。
服务有时无法连接到 Collector
尽管所有服务似乎都已成功启动,但在某些情况下,一些服务似乎无法连接到 OTel Collector。我还没有完全弄清楚原因,所以目前我只是重新启动 otel-collector.nomad。如果 Webapp UI 中的某些内容看起来有点奇怪(例如缺少产品或货币),我也会重新启动 frontend.nomad。通常,在 Jaeger 中显示的服务的数量是服务未向 Collector 发送遥测数据的良好指标。您应该看到 14 个服务,包括 `jaeger-query` 服务。

宿主机内存不足
是的……尽管我的机器很强大,但我的宿主机有时也会出现内存不足的情况。Chrome 和 Safari 中有无数个标签页可能没有帮助。此外,让我们面对现实:HashiQube + Nomad 中的 21 个作业可能会占用大量内存。我在 HashiQube 和 Docker 的内存设置上做了一些调整,以尽量减少内存问题,但万一内存怪兽缠上了您,我建议关闭浏览器和其他应用程序,然后重新打开它们以释放一些内存。如果发生这种情况,请告诉我!
正在进行的工作
请注意,这个项目仍在进行中。如果您有任何改进建议,或者想进一步合作开发 Nomad 作业规格,请 联系我!
最后的想法
好了,各位!现在您已经看到了一个在 HashiCorp Nomad 上部署 OpenTelemetry 演示应用程序(一个运行 OpenTelemetry 的多微服务应用程序)的示例。主要亮点:
- 我们使用 HashiQube 在 Docker 中通过 Nomad 启动了一个本地 HashiCorp 环境,以便我们可以使用 Traefik 作为我们的负载均衡器在 Nomad 中运行 OTel 演示应用程序。
- 我们通过访问通过 frontendproxy 公开的以下服务,看到了 OTel 演示应用程序的运行情况:网店、Grafana、Jaeger、功能标志 UI,以及 负载生成器 UI。
在我结束之前,我想特别感谢 HashiCorp 的 Luiz Aoqui,他帮助我调整了 Nomad 作业规格,以及 Riaan Nolan,感谢他为 HashiQube 所做的持续工作。(顺便说一下,Luiz 和 Riaan 都曾做客我的 On-Call Me Maybe Podcast!)
现在,我将用一张老鼠 Phoebe 从粉色篮子里探出头的照片送给你们。她是不是看起来很可爱?🥰

和平、爱与代码。🦄 🌈 💫
对 OTel 演示应用程序在 Nomad 上的部署有疑问?欢迎通过 Mastodon 或 LinkedIn 联系。
OpenTelemetry 社区一直欢迎贡献!加入我们!如果您在 Mastodon 上,请务必关注 Mastodon 上的 OpenTelemetry