Kubernetes 上的 OpenTelemetry
在之前的文章OpenTelemetry 初学者指南中,我们介绍了开始使用OpenTelemetry所需了解的内容。
今天,我们将在 Kubernetes 上部署一个 OpenTelemetry 收集器。然后,我们将使用 OpenTelemetry 提供的 OTEL 检测 (Go) 应用程序 将跟踪发送到 Collector。从那里,我们会将跟踪数据带到 Jaeger collector。最后,将使用 Jaeger UI 将轨迹可视化。
此图显示了 application、OpenTelemetry collector 和 Jaeger 之间的流程。
这个 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())
要将 NodePort 与 Kind 一起使用,我们需要先启用它。
_ 额外端口映射 __ 可用于端口转发到 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
映像,其中包括 agents、collector、* query* 和 Jaeger UI 在使用内存存储的单个 pod 中。
创建一个 yaml 文件,如下所示。 Jaeger 实例的名称将为simplest
vim simplest.yaml
api版本:jaegertracing.io/v1
种类:积家
元数据:
名称:最简单
kubectl apply -f simplest.yaml
稍后,将提供一个新的 Jaeger 内存一体式实例,适用于快速演示和开发目的。
当 Jaeger 实例启动并运行时,我们可以检查 pods 和 services。
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 文件由 ConfigMap、Service 和 Deployment 组成。
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 中可视化。
更多推荐
所有评论(0)