在HashiCorp Nomad上运行OpenTelemetry演示应用

大家好……我太兴奋了,因为我终于得以实现我技术愿望清单上的一个项目。上周,我开始将OpenTelemetry演示应用Helm Charts转换成HashiCorpNomad作业规范。今天我将讲解如何在Nomad上运行OpenTelemetry演示应用,使用我最喜欢的Hashi-in-a-box工具HashiQube

我们开始吧!

加拿大多伦多的夜景航拍

部署

假设条件

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

先决条件

要运行本教程中的示例,您需要以下内容:

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

教程存储库

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

HashiQube设置

在开始之前,请友情提醒,默认情况下,HashiQube在Docker上运行NomadVaultConsul。此外,我们将在Nomad上部署21个作业规范。这意味着我们需要足够的CPU和内存资源,请确保为Docker桌面分配了足够的资源。以我的电脑为例,我使用的是具有8个内核和32 GB内存的M1 MacBook Pro。我的Docker桌面资源设置如下:

  • **CPU核心数量:**3
  • **内存:**9.5GB
  • **交换空间:**3GB

如果需要视觉参考,下面是我Docker首选项资源设置的屏幕截图:

Docker桌面资源首选项的屏幕截图

有关如何更改Mac、Windows和Linux上的资源设置的详细信息,请查看Docker文档。

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。

**注意:**如果遇到问题,请确保查看注意事项部分。

一切准备就绪(这需要几分钟时间),在启动序列的最后,您将看到以下信息,表示可以开始了:

HashiQube启动序列的屏幕截图,显示Nomad、Nomad文档、Traefik和Traefik文档的URL

现在,您可以使用以下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 {
   cpu    = 55
   memory = 1024
   memory_max = 2048
}

我们为作业分配了55 MHz的处理能力(cpu设置),以及1024MB的内存(memory设置)。在这种情况下,当启用内存超配,并且作业所需的内存超过了分配的1024MB时,Nomad将为作业分配最多2048MB的内存(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的Web界面:http://localhost:4646查看进展情况:

Nomad中的作业视图屏幕截图。有些作业已启动,其他作业仍在启动中。

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

一旦所有作业都运行正常,您会看到像这样所有东西都是绿色的:

Nomad中所有作业已启动的屏幕截图

您还可以在Consul中http://localhost:8500查看服务的健康状态:

Consul服务健康状态的屏幕截图。所有服务都健康。

默认情况下,不健康的服务会显示在顶部,并在旁边显示红色的“x”。由于在上面的屏幕截图中看不到任何令人不快的红色“x”,我们知道我们的服务的情况良好!

5. 访问OTel演示应用

OTel演示应用使用Envoy来公开一些前端服务:网店、JaegerGrafana、负载生成器和特性标志。这些都由frontendproxy服务管理。Traefik通过地址otel-demo.localhost提供frontendproxy服务的访问。

这在如下的代码片段中进行了配置,在frontendproxy.nomadservice部分中:

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界面:http://otel-demo.localhost/jaeger/ui/

Jaeger界面的屏幕截图

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

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

Grafana上一个OpenTelemetry仪表板的屏幕截图Grafana上recommendationservice指标仪表板的屏幕截图

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

特性标志界面:http://otel-demo.localhost/feature/

featureflagservice界面的屏幕截图

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

loadgenerator界面的屏幕截图

注意事项

虽然我认为我已经在运行Nomad中的OTel演示应用方面解决了很多问题,但在部署服务时我遇到了一些问题。

有时服务无法连接到收集器

尽管所有服务似乎都能正常启动,但在某些情况下,有些服务似乎无法连接到OTel收集器。我还没有弄清楚为什么会发生这种情况,所以目前,我只是重新启动otel-collector.nomad。如果Web应用界面看起来有点奇怪(比如缺少产品或货币),我也会重新启动frontend.nomad。通常,指示服务未将遥测发送到收集器的好方法是查看Jaeger中显示的服务数量。您应该看到包括jaeger-query服务在内的14个服务。

Jaeger服务列表下拉菜单的屏幕截图

主机机器的内存不足

是的……即使我的机器配置很高,有时候我也会主机机器上的内存不足。这可能与我在Chrome和Safari中打开了许多选项卡有关。再加上,面对现实吧:HashiQube + Nomad中的21个作业可能会占用相当多的内存。我已经对HashiQube和Docker的内存设置进行了一些调整,以尽量减少内存问题,但如果内存不足,建议关闭浏览器和其他程序,并重新打开它们以释放一些内存。如果您也遇到这个问题,请告诉我!

一个正在进行中的工作

请记住,这个项目还在进行中。如果您对改进有任何建议,或者希望在Nomad作业规范上进一步合作,请联系我

总结

好了,朋友们!现在您拥有了一个将OpenTelemetry演示应用(一个运行OpenTelemetry的多微服务应用)部署到HashiCorp Nomad的示例。主要亮点包括:

在结束之前,我要向HashiCorp的Luiz Aoqui表示衷心感谢,他帮助我调整了Nomad作业规范,还要感谢Riaan Nolan,他继续为HashiQube做出了很多贡献。(此外,LuizRiaan都是我在On-Call Me Maybe Podcast上的客人!)

最后,我将用一张Phoebe(一只大鼠)从粉红色篮子里窥视出来的照片作为结束。她看起来很可爱,不是吗?🥰

一只棕色和白色的大鼠从粉红色柳条篮子里窥视出来

和平、爱和代码。🦄 🌈 💫


对OTel演示应用在Nomad上有疑问吗?请随时通过MastodonLinkedIn与我联系。


OpenTelemetry社区一直在寻求贡献!加入我们!如果你在使用Mastodon,请务必关注OpenTelemetry on Mastodon