《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在支持 OpenShift 4.13 的环境中验证
文章目录
- 技术架构
- 部署 Distributed Tracing 运行环境
- 安装测试应用并进行观测跟踪
- 参考
说明:
- 本文使用的测试应用采用的是 “手动 Instrumentation” 方式在应用代码中通过 OpenTelemetry 的 API 获取的跟踪数据。应用代码 https://github.com/rbaumgar/otelcol-demo-app/blob/main/src/main/java/org/acme/opentelemetry/TracedResource.java
- 非侵入式的 “自动 Instrumentation” 实现方式可参见《OpenShift 4 - 可观测性之 Distributed Tracing - 通过向被观测应用注入OpenTelemetry Agent 实现自动跟踪(附视频)》
技术架构
部署 Distributed Tracing 运行环境
- 使用OpenShift 集群管理员安装 OpenShift distributed tracing platform Operator,安装过程默认选项即可。在 OpenShift distributed tracing platform Operator 中包含 Jaeger 环境。
- 创建 jaeger-demo 项目,并授权 developer 用户为该项目的 admin。
$ oc new-project jaeger-demo
$ oc policy add-role-to-user admin developer -n jaeger-demo
- 用 developer 登录 OpenShift。
$ oc login -u developer
- 基于以下 YAML 在 jaeger-demo 项目中创建 Jaeger 对象。
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: my-jaeger
namespace: jaeger-demo
spec: {}
- 执行命令确认 Jaeger 运行环境,其中 my-jaeger-collector 的服务可以接收来自架构图中 Otel 采集的数据。说明:由于本文只是演示,因此只将 my-jaeger-collector 收集的数据存放在内存中。
$ oc get svc -n jaeger-demo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-jaeger-agent ClusterIP None <none> 5775/UDP,5778/TCP,6831/UDP,6832/UDP 3h33m
my-jaeger-collector ClusterIP 10.217.4.151 <none> 9411/TCP,14250/TCP,14267/TCP,14268/TCP,4317/TCP,4318/TCP 3h33m
my-jaeger-collector-headless ClusterIP None <none> 9411/TCP,14250/TCP,14267/TCP,14268/TCP,4317/TCP,4318/TCP 3h33m
my-jaeger-query ClusterIP 10.217.4.108 <none> 443/TCP,16685/TCP 3h33m
$ oc get pod -n jaeger-demo
NAME READY STATUS RESTARTS AGE
my-jaeger-74c489cb94-mb8vb 2/2 Running 0 52m
- 可以在 OpenShift 控制台中可以看到 4317 端口提供的是 grpc-otel 协议组合的服务。
- 点击上图 my-jaeger 右上方的箭头,可以看到 Jaeger 的控制台。
安装测试应用并进行观测跟踪
- 基于以下 YAML 部署测试应用。
说明:测试应用使用了手动 Instrumentation 方式获取的跟踪数据,应用代码参见 https://github.com/rbaumgar/otelcol-demo-app/blob/main/src/main/java/org/acme/opentelemetry/TracedResource.java
注意:其中在 Deployment 中对 OTELCOL_SERVER 参数使用了以上 my-jaeger-collector 服务的地址。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: otel-demo-app
name: otel-demo-app
spec:
replicas: 1
selector:
matchLabels:
app: otel-demo-app
template:
metadata:
labels:
app: otel-demo-app
spec:
containers:
- image: quay.io/rbaumgar/otelcol-demo-app-jvm
imagePullPolicy: IfNotPresent
name: otel-demo-app
env:
- name: OTELCOL_SERVER
value: 'http://my-jaeger-collector:4317'
---
apiVersion: v1
kind: Service
metadata:
labels:
app: otel-demo-app
name: otel-demo-app
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
name: web
selector:
app: otel-demo-app
type: ClusterIP
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
labels:
app: otel-demo-app
name: otel-demo-app
spec:
path: /
to:
kind: Service
name: otel-demo-app
port:
targetPort: web
- 执行以下命令访问测试应用。
$ export URL=$(oc get route otel-demo-app -o jsonpath='{.spec.host}')
$ curl $URL/hello
hello
$ curl $URL/sayHello/demo1
hello: demo1
$ curl $URL/sayRemote/demo2
hello: demo2 from http://otel-demo-app-jaeger-demo.apps-crc.testing/
- 在 Jaeger 控制台中查看 my-service,然后查看跟踪到的结果。
可以进入 sayRemote 查看跟踪到的服务调用。
参考
https://www.opensourcerers.org/2022/04/18/using-opentelemetry-and-jaeger/
https://github.com/rbaumgar/otelcol-demo-app/blob/main/README.md
https://medium.com/@akashjoffical08/implement-distributed-tracing-with-jaeger-opentelemetry-on-kubernetes-3e35cb77b536
https://docs.openshift.com/container-platform/4.13/distr_tracing/distr_tracing_install/distr-tracing-deploying-jaeger.html
https://www.aneasystone.com/archives/2022/11/opentelemetry-observability.html