在之前的文章OpenTelemetry 初学者指南中,我们介绍了开始使用OpenTelemetry所需了解的内容。

今天,我们将在 Kubernetes 上部署一个 OpenTelemetry 收集器。然后,我们将使用 OpenTelemetry 提供的 OTEL 检测 (Go) 应用程序 将跟踪发送到 Collector。从那里,我们会将跟踪数据带到 Jaeger collector。最后,将使用 Jaeger UI 将轨迹可视化。

此图显示了 application、OpenTelemetry collectorJaeger 之间的流程。

这个 OpenTelemetry存储库提供了有关如何在 Kubernetes 上部署 OpenTelemetry 的完整演示,我们可以以此为起点。

如果您还记得OpenTelemetry 初学者指南我们的 OTEL 设置如下所示:

OpenTelemetry 解决方案

首先,我们需要一个 Kubernetes 集群。在我们的例子中,我们将使用Kind的本地实例。应用程序将通过 NodePort(在端口 30080 上)访问这个 Kubernetes 集群。

conn, err :u003d grpc.DialContext(ctx, "localhost:30080", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock())

要将 NodePortKind 一起使用,我们需要先启用它。

_ 额外端口映射 __ 可用于端口转发到 kind 节点。这是一个跨平台选项,可以让流量进入您的集群。_

vim kind-config.yaml

种类:集群

api版本:kind.x-k8s.io/v1alpha4

节点:

- 角色:控制平面

将主机上的30080端口转发到本节点上的30080

额外端口映射:

  • 容器端口:30080

主机端口:30080

- 角色:工人

创建集群:kind create cluster --config kind-config.yaml

创建集群“种类”...

✓ 确保节点图像(kindest/node:v1.24.0)🖼

✓ 准备节点📦 📦

✓ 编写配置📜

✓ 启动控制平面🕹️

✓ 安装 CNI 🔌

✓ 安装 StorageClass 💾

✓ 加入工作节点🚜

将 kubectl 上下文设置为“kind-kind”

您现在可以使用您的集群了:kubectl cluster-info --context kind-kind 感谢您使用 kind! 😊

一旦我们的 Kubernetes 集群启动,我们就可以开始部署 Jaeger

什么是积家?

Jaeger是开源的分布式跟踪系统,用于跟踪分布式服务之间的事务。它用于监控和排除复杂的微服务环境。通过这样做,我们可以查看跟踪并分析应用程序的行为。

为什么我们需要它?

使用跟踪系统(如 Jaeger)在微服务环境中尤其重要,因为它们被认为比单个单体应用程序更难调试。

Jaeger解决的问题?

  • 分布式追踪监控

  • 性能和延迟优化

  • 根本原因分析

  • 服务依赖分析

部署 Jaeger

要在 Kubernetes 集群上部署 Jaeger,我们可以使用Jaeger 算子。

操作符是一种软件,可以减轻运行另一个软件的操作复杂性。

部署 Jaeger Operator

您首先在 Kubernetes 上安装 Jaeger Operator。然后,此操作员将监视新的 Jaeger 自定义资源 (CR)。

在 Kubernetes 上安装 Jaeger Operator 有多种方式:

  • 使用 Helm

  • 使用部署文件

在开始之前,请注意先决条件部分。

从 1.31 版开始,Jaeger Operator 使用 webhook 来验证 Jaeger 自定义资源 (CR)。这需要安装版本的 cert-manager。

安装证书管理器

cert-manager是用于 Kubernetes 和 OpenShift 工作负载的强大且可扩展的 X.509 证书控制器。它将从各种发行者那里获取证书,包括流行的公共发行者和私人发行者,并确保证书有效且是最新的,并将在到期前的配置时间尝试更新证书。

cert-manager的安装很简单,运行:

kubectl apply -fhttps://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.yaml

默认情况下,cert-manager 将安装到 cert-manager 命名空间中。

您可以按照此处的说明验证安装

安装 cert-manager 后,让我们继续部署 Jaeger

使用 Helm 安装 Jaeger Operator

跳转到Artifact Hub并搜索 jaeger-operator

添加 Jaeger Tracing Helm 存储库:

helm repo add jaegertracing zwz100078 https://jaegertracing.github.io/helm-charts zwz100079 zwz100077

使用发布名称my-release安装图表(在默认命名空间中)

helm install my-release jaegertracing/jaeger-operator

您还可以安装特定版本的 helm chart:

helm install my-release jaegertracing/jaeger-operator --version 2.25.0

验证它是否安装在 Kubernetes 上:

helm list -A

您还可以使用部署文件部署 Jaeger 运算符。

kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.36.0/jaeger-operator.yaml

此时,应该有一个 jaeger-operator 部署可用。

kubectl get deployment my-jaeger-operator

姓名 准备就绪 最新可用年龄

我的 jaeger 操作员 1/1 1 1 2m58s

操作员现在已准备好创建 Jaeger 实例。

部署 Jaeger All-in-One

我们刚刚安装的 operator 本身并没有做任何事情,它只是意味着我们可以创建我们希望 jaeger 操作员管理的 jaeger 资源/实例。

创建 Jaeger 实例的最简单方法是部署 All-in-one strategy,它会安装all-in-one映像,其中包括 agentscollector、* query* 和 Jaeger UI 在使用内存存储的单个 pod 中。

创建一个 yaml 文件,如下所示。 Jaeger 实例的名称将为simplest

vim simplest.yaml

api版本:jaegertracing.io/v1

种类:积家

元数据:

名称:最简单

kubectl apply -f simplest.yaml

稍后,将提供一个新的 Jaeger 内存一体式实例,适用于快速演示和开发目的。

当 Jaeger 实例启动并运行时,我们可以检查 podsservices

kubectl get pods

名称 就绪 状态 重新开始 年龄

最简单的 656d7cf5c8-lff7b 1/1 运行 0 3m55s

kubectl get services

要获取 pod 名称,请查询属于最简单 Jaeger 实例的 pod:

从 pod 查询日志:

kubectl logs -l app.kubernetes.io/instance=simplest

{"level":"info","ts":1660155049.86027,"caller":"channelz/logging.go:50","msg":"[core]Channel Connectivity 更改为 READY","system": "grpc","grpc_log":true}

{"level":"info","ts":1660155049.8612773,"caller":"grpc/builder.go:120","msg":"代理收集器连接状态变化","dialTarget":":14250", “状态”:“就绪”}

{"level":"info","ts":1660155049.8617437,"caller":"app/server.go:241","msg":"正在启动 HTTP 服务器","port":16686,"addr":" :16686"}

{"level":"info","ts":1660155049.8621716,"caller":"app/server.go:260","msg":"正在启动 GRPC 服务器","port":16685,"addr":" :16685"}

让我们打开 Jaeger UI

使用端口转发访问Jaeger UI

kubectl port-forward svc/simplest-query 16686:16686

从 127.0.0.1:16686 -> 16686 转发

从 [::1]:16686 -> 16686 转发

积家用户界面

部署 OpenTelemetry 收集器

为了部署 OpenTelemetry 收集器,我们将使用这个otel-collector.yaml文件作为起点。 yaml 文件由 ConfigMapServiceDeployment 组成。

vim otel-collector.yaml

确保更改 jaeger 收集器(导出器)的名称以匹配我们在上面部署的名称。在我们的例子中,这将是:

出口商:

杰格:

端点:“simplest-collector.default.svc.cluster.local:14250”

另外,请注意receivers。这部分在 Collector 端创建接收器,并开放端口4317用于接收跟踪,从而使应用程序能够向 OpenTelemetry Collector 发送数据。

...

otel 收集器配置:|

接收器:

除:

协议:

grpc:

端点:“0.0.0.0:4317”

...

应用文件:kubectl apply -f otel-collector.yaml

configmap/otel-collector-conf 创建

服务/otel-collector 创建

deployment.apps/otel-collector 创建

验证 OpenTelemetry 收集器是否已启动并正在运行。

kubectl get deployment

kubectl logs deployment/otel-collector

“一切准备就绪。开始运行和处理数据。”

运行应用程序

是时候向我们的 OpenTelemetry 收集器发送一些跟踪数据了。

记住,应用程序通过30080端口上的NodePort访问Kubernetes集群。Kubernetes服务会将用于访问OTLP接收器的_4317_端口绑定到Kubernetes节点上的_30080_端口。

这样我们就可以通过静态地址_<node-ip>:30080_访问Collector了。如果您正在运行本地集群,这将是_localhost:30080_.Source

这个存储库包含一个用 Go 编写的 (SDK) 检测应用程序,它模拟一个应用程序。

go run main.go

2022/08/10 20:31:37 等待连接...

2022/08/10 20:31:37 真的很努力 (1 / 10)

2022/08/10 20:31:38 真的很努力 (2 / 10)

2022/08/10 20:31:39 真的很努力 (3 / 10)

2022/08/10 20:31:40 真的很努力 (4 / 10)

2022/08/10 20:31:41 真的很努力 (5 / 10)

2022/08/10 20:31:42 真的很努力 (6 / 10)

2022/08/10 20:31:43 真的很努力 (7 / 10)

2022/08/10 20:31:44 真的很努力 (8 / 10)

2022/08/10 20:31:45 真的很努力 (9 / 10)

2022/08/10 20:31:46 真的很努力 (10 / 10)

2022/08/10 20:31:47 完成!

查看数据

让我们看看我们的示例应用程序生成的遥测数据

同样,我们可以使用端口转发来访问 Jaeger UI。

kubectl 端口转发 svc/simplest-query 16686:16686

打开网络浏览器并转到http://127.0.0.1:16686/

在 Service 下选择 test-service 以查看生成的跟踪。

! swz 100105 swz 100106 swz 100104

! swz 100108 swz 100109 swz 100107

服务名称main.go文件中指定。

res, err :u003d resource.New(ctx, resource.WithAttributes( // 用于在后端显示跟踪的服务名称 semconv.ServiceNameKey.String("test-service"), ),

应用程序将通过 NodePort(在端口 30080 上)访问这个 Kubernetes 集群。 URL 在此处指定:

conn, err :u003d grpc.DialContext(ctx, "localhost:30080", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock()) if err !u003d nil { return nil, fmt.Errorf ("未能创建与收集器的 gRPC 连接:%w", err) }

完毕

在本文中,我们在 Kubernetes 上部署了一个 OpenTelemetry 收集器。然后,我们使用用 Go 编写的 Otel SDK 检测 application 将跟踪数据发送到此收集器。从那里,跟踪被发送到 Jaeger 收集器并在 Jaeger UI 中可视化。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐