在HashiCorp Nomad上运行OpenTelemetry演示应用
大家好……我太兴奋了,因为我终于得以实现我技术愿望清单上的一个项目。上周,我开始将OpenTelemetry演示应用的Helm Charts转换成HashiCorpNomad作业规范。今天我将讲解如何在Nomad上运行OpenTelemetry演示应用,使用我最喜欢的Hashi-in-a-box工具HashiQube。
我们开始吧!
部署
假设条件
在继续之前,我假设您对以下内容有基本了解:
- Nomad。如果不了解,请参阅我的入门文章。Daniela Baron的这篇博文也很棒。
- 可观察性(o11y)和**OpenTelemetry**(OTel)。如果不了解,请参阅可观察性概述。
先决条件
要运行本教程中的示例,您需要以下内容:
教程存储库
以下是我们将在今天的教程中使用的存储库:
- 我修改过的HashiQube存储库(是servian/hashiqube的分支)。如果感兴趣,您可以在这里查看我所做的修改。
- 我的Nomad Conversions存储库
HashiQube设置
在开始之前,请友情提醒,默认情况下,HashiQube在Docker上运行Nomad,Vault和Consul。此外,我们将在Nomad上部署21个作业规范。这意味着我们需要足够的CPU和内存资源,请确保为Docker桌面分配了足够的资源。以我的电脑为例,我使用的是具有8个内核和32 GB内存的M1 MacBook Pro。我的Docker桌面资源设置如下:
- **CPU核心数量:**3
- **内存:**9.5GB
- **交换空间:**3GB
如果需要视觉参考,下面是我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。
**注意:**如果遇到问题,请确保查看注意事项部分。
一切准备就绪(这需要几分钟时间),在启动序列的最后,您将看到以下信息,表示可以开始了:
现在,您可以使用以下URL访问应用程序:
- Vault:http://localhost:8200
- Nomad:http://localhost:4646
- Consul:http://localhost:8500
- Traefik:http://traefik.localhost
如果需要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查看进展情况:
所有服务都启动需要一些时间(有时长达10分钟),尤其是因为Nomad需要下载镜像并初始化服务,所以请耐心等待!由于某些服务依赖于其他服务的运行,因此在上面的屏幕截图中,您可能会看到一些服务处于“等待中”状态或一些服务在一段时间内启动和关闭。不要惊慌!一切都会没问题的!
一旦所有作业都运行正常,您会看到像这样所有东西都是绿色的:
您还可以在Consul中http://localhost:8500查看服务的健康状态:
默认情况下,不健康的服务会显示在顶部,并在旁边显示红色的“x”。由于在上面的屏幕截图中看不到任何令人不快的红色“x”,我们知道我们的服务的情况良好!
5. 访问OTel演示应用
OTel演示应用使用Envoy来公开一些前端服务:网店、Jaeger、Grafana、负载生成器和特性标志。这些都由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界面:http://otel-demo.localhost/jaeger/ui/
在上面的屏幕截图中,我们可以看到来自checkoutservice的示例跟踪。
Grafana:http://otel-demo.localhost/grafana/
演示应用附带了两个Grafana仪表板,展示了使用OpenTelemetry发出的指标。
特性标志界面:http://otel-demo.localhost/feature/
负载生成器界面:http://otel-demo.localhost/loadgen/
注意事项
虽然我认为我已经在运行Nomad中的OTel演示应用方面解决了很多问题,但在部署服务时我遇到了一些问题。
有时服务无法连接到收集器
尽管所有服务似乎都能正常启动,但在某些情况下,有些服务似乎无法连接到OTel收集器。我还没有弄清楚为什么会发生这种情况,所以目前,我只是重新启动otel-collector.nomad。如果Web应用界面看起来有点奇怪(比如缺少产品或货币),我也会重新启动frontend.nomad。通常,指示服务未将遥测发送到收集器的好方法是查看Jaeger中显示的服务数量。您应该看到包括jaeger-query
服务在内的14个服务。
主机机器的内存不足
是的……即使我的机器配置很高,有时候我也会主机机器上的内存不足。这可能与我在Chrome和Safari中打开了许多选项卡有关。再加上,面对现实吧:HashiQube + Nomad中的21个作业可能会占用相当多的内存。我已经对HashiQube和Docker的内存设置进行了一些调整,以尽量减少内存问题,但如果内存不足,建议关闭浏览器和其他程序,并重新打开它们以释放一些内存。如果您也遇到这个问题,请告诉我!
一个正在进行中的工作
请记住,这个项目还在进行中。如果您对改进有任何建议,或者希望在Nomad作业规范上进一步合作,请联系我!
总结
好了,朋友们!现在您拥有了一个将OpenTelemetry演示应用(一个运行OpenTelemetry的多微服务应用)部署到HashiCorp Nomad的示例。主要亮点包括:
- 我们使用HashiQube通过Nomad在Docker中创建了一个本地HashiCorp环境,以便我们可以使用Traefik作为负载均衡器在Nomad中运行OTel演示应用。
- 我们看到了OTel演示应用的实际效果,通过访问通过frontendproxy公开的以下服务:网店、Grafana、Jaeger、特性标志界面和负载生成器界面。
在结束之前,我要向HashiCorp的Luiz Aoqui表示衷心感谢,他帮助我调整了Nomad作业规范,还要感谢Riaan Nolan,他继续为HashiQube做出了很多贡献。(此外,Luiz和Riaan都是我在On-Call Me Maybe Podcast上的客人!)
最后,我将用一张Phoebe(一只大鼠)从粉红色篮子里窥视出来的照片作为结束。她看起来很可爱,不是吗?🥰
和平、爱和代码。🦄 🌈 💫
对OTel演示应用在Nomad上有疑问吗?请随时通过Mastodon或LinkedIn与我联系。
OpenTelemetry社区一直在寻求贡献!加入我们!如果你在使用Mastodon,请务必关注OpenTelemetry on Mastodon。