链路追踪
概述
百度智能云 CSM 数据面支持链路追踪,可以将网格数据面内产生的 tracing 数据上报到 Jaeger/Zipkin 服务,上报后可在 Jaeger/Zipkin 界面查看调用链信息,帮助您理解服务间的依赖关系、分析链路情况或快速排障。本文以 Jaeger 为例介绍链路追踪使用流程。
前提条件
- 已添加 Kubernetes 集群到 CSM 实例。
- 部署 Jaeger 并获取服务地址。
- 已配置采样率与服务地址并开启链路追踪功能。
操作步骤
步骤一:为网格实例启用链路追踪
为已有网格实例开启链路追踪
- 登录 CSM 控制台,左侧选择网格列表进入网格列表页面,点击需要开启链路追踪的网格实例名称/ID,进入网格实例详情页。
- 左侧 Tab 选择可观测管理,点击链路追踪进入链路追踪详情页。点击立即开启,在链路追踪配置弹窗中配置相关参数,点击确认即可启用链路追踪,参数及说明如下:
参数 | 说明 |
---|---|
采样率 | (必填)网格采集并持久化 tracing 的采样比例,范围 0-100。Sidecar 采集、上报数据消耗的资源与带宽和采样率成正比,请按需配置。 |
使用服务 | (默认)第三方 Jaeger/Zipkin 服务 |
服务地址 | (必填)第三方服务地址,仅支持输入英文字母、数字以及特殊字符(.)、(:)和(-)。注意:请确保第三方服务地址可达。 |
创建网格实例时开启链路追踪
- 登录 CSM 控制台,左侧选择网格列表进入网格列表页面,点击创建网格,进入创建网格页。
- 开启链路追踪开关,并配置采样率和服务地址,配置完毕后点击确认。
修改链路追踪配置
- 登录 CSM 控制台,左侧选择网格列表进入网格列表页面,点击需要修改链路追踪配置的网格实例名称/ID,进入网格实例详情页。
- 左侧 Tab 选择可观测管理,点击链路追踪进入链路追踪详情页。点击编辑按钮,在链路追踪编辑弹窗中可以修改链路追踪相关配置,点击确认后生效。
注意:修改链路追踪配置会导致控制面重启,建议您在系统负载较低时修改。
步骤二:在集群部署 Jaeger 和服务
说明:如果您使用本文档中 YAML 文件部署 Deployment 和 Service,请确保 Deployment 和 Service 均部署在 istio-system 命名空间下。
- 使用以下示例内容,创建 jaeger.yaml 文件
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: jaeger
5 namespace: istio-system
6 labels:
7 app: jaeger
8spec:
9 selector:
10 matchLabels:
11 app: jaeger
12 template:
13 metadata:
14 labels:
15 app: jaeger
16 annotations:
17 sidecar.istio.io/inject: "false"
18 prometheus.io/scrape: "true"
19 prometheus.io/port: "14269"
20 spec:
21 containers:
22 - name: jaeger
23 image: "registry.baidubce.com/csm-offline/all-in-one:1.35"
24 env:
25 - name: BADGER_EPHEMERAL
26 value: "false"
27 - name: SPAN_STORAGE_TYPE
28 value: "badger"
29 - name: BADGER_DIRECTORY_VALUE
30 value: "/badger/data"
31 - name: BADGER_DIRECTORY_KEY
32 value: "/badger/key"
33 - name: COLLECTOR_ZIPKIN_HOST_PORT
34 value: ":9411"
35 - name: MEMORY_MAX_TRACES
36 value: "50000"
37 - name: QUERY_BASE_PATH
38 value: /jaeger
39 livenessProbe:
40 httpGet:
41 path: /
42 port: 14269
43 readinessProbe:
44 httpGet:
45 path: /
46 port: 14269
47 volumeMounts:
48 - name: data
49 mountPath: /badger
50 resources:
51 requests:
52 cpu: 10m
53 volumes:
54 - name: data
55 emptyDir: {}
56---
57apiVersion: v1
58kind: Service
59metadata:
60 name: tracing
61 namespace: istio-system
62 labels:
63 app: jaeger
64spec:
65 type: ClusterIP
66 ports:
67 - name: http-query
68 port: 80
69 protocol: TCP
70 targetPort: 16686
71 # Note: Change port name if you add '--query.grpc.tls.enabled=true'
72 - name: grpc-query
73 port: 16685
74 protocol: TCP
75 targetPort: 16685
76 selector:
77 app: jaeger
78---
79# Jaeger implements the Zipkin API. To support swapping out the tracing backend, we use a Service named Zipkin.
80apiVersion: v1
81kind: Service
82metadata:
83 labels:
84 name: zipkin
85 name: zipkin
86 namespace: istio-system
87spec:
88 ports:
89 - port: 9411
90 targetPort: 9411
91 name: http-query
92 selector:
93 app: jaeger
94---
95apiVersion: v1
96kind: Service
97metadata:
98 name: jaeger-collector
99 namespace: istio-system
100 labels:
101 app: jaeger
102spec:
103 type: ClusterIP
104 ports:
105 - name: jaeger-collector-http
106 port: 14268
107 targetPort: 14268
108 protocol: TCP
109 - name: jaeger-collector-grpc
110 port: 14250
111 targetPort: 14250
112 protocol: TCP
113 - port: 9411
114 targetPort: 9411
115 name: http-zipkin
116 selector:
117 app: jaeger
- 执行以下命令,将该配置应用到数据面集群:
1$ kubectl apply -f jaeger.yaml
- 部署完毕后,查看 jaeger 服务,确认 pod 和 service 均正常启动:
1$ kubectl get pods -n istio-system
2$ kubectl get svc -n istio-system
- 打开 jaeger 页面:
1$ istioctl dashboard jaeger
步骤三:部署微服务应用程序
-
开启 Sidecar 自动注入
方式一:登陆 CSM 控制台,选择目标网格实例,选择【注入配置】,在自动注入配置模块选择需要部署的命名空间,点击【开启】即可开启 Sidecar 自动注入,也可通过切换开关状态开启自动注入。
方式二:使用 kubectl 开启自动注入 Sidecar 功能:
Kubectl1# 开启自动注入 Sidecar 功能 2$ kubectl label namespace ${namespace} istio-injection=enabled --overwrite
-
执行以下命令,将测试应用 consumer-demo 和 provider-demo 部署到集群中:
Kubectl1$ kubectl apply -f consumer-demo-deployment.yaml 2$ kubectl apply -f provider-demo-deployment.yaml
consumer-demo-deployment.yaml 文件如下:
YAML1apiVersion: apps/v1 2kind: Deployment 3metadata: 4 name: consumer-demo-deployment 5labels: 6 app: consumer-demo 7 name: consumer-demo 8spec: 9 replicas: 1 10 selector: 11 matchLabels: 12 app: consumer-demo 13template: 14 metadata: 15 labels: 16 app: consumer-demo 17 spec: 18 restartPolicy: Always 19 containers: 20 - name: consumer-demo 21 image: registry.baidubce.com/csm-offline/bms-orignal-consumer:dev 22 imagePullPolicy: Always 23 env: 24 - name: OTEL_TRACES_EXPORTER 25 value: otlp 26 - name: OTEL_EXPORTER_OTLP_ENDPOINT 27 value: http://otel-collector.istio-system.svc.cluster.local:4317 28 - name: OTEL_JAVAAGENT_ENABLED 29 value: 'true' 30 ports: 31 - containerPort: 9999 32 resources: 33 limits: 34 cpu: 350m 35 memory: 612Mi 36 requests: 37 cpu: 350m 38 memory: 612Mi
provider-demo-deployment-v1.yaml 文件如下:
YAML1apiVersion: apps/v1 2kind: Deployment 3metadata: 4name: provider-demo-deployment 5labels: 6 app: provider-demo 7 name: provider-demo 8spec: 9replicas: 1 10selector: 11 matchLabels: 12 app: provider-demo 13template: 14 metadata: 15 labels: 16 app: provider-demo 17 spec: 18 restartPolicy: Always 19 containers: 20 - name: provider-demo 21 image: registry.baidubce.com/csm-offline/bms-orignal-provider:dev 22 imagePullPolicy: Always 23 env: 24 - name: OTEL_TRACES_EXPORTER 25 value: otlp 26 - name: OTEL_EXPORTER_OTLP_ENDPOINT 27 value: http://otel-collector.istio-system.svc.cluster.local:4317 28 - name: OTEL_JAVAAGENT_ENABLED 29 value: 'true' 30 ports: 31 - containerPort: 10001 32 resources: 33 limits: 34 cpu: 350m 35 memory: 612Mi 36 requests: 37 cpu: 350m 38 memory: 612Mi
-
执行以下命令,部署应用的 Service:
Kubectl1$ kubectl apply -f consumer-demo-service.yaml 2$ kubectl apply -f provider-demo-service.yaml
consumer-demo-service.yaml 文件如下:
YAML1apiVersion: v1 2kind: Service 3metadata: 4 name: consumer-demo 5 annotations: 6 prometheus.io/scrape: "true" 7spec: 8 selector: 9 app: consumer-demo 10 type: ClusterIP 11 sessionAffinity: None 12 ports: 13 - protocol: TCP 14 port: 9999 15 targetPort: 9999 16 name: http-port
provider-demo-service.yaml 文件如下:
YAML1apiVersion: v1 2kind: Service 3metadata: 4 name: provider-demo 5 annotations: 6 prometheus.io/scrape: "true" 7spec: 8 selector: 9 app: provider-demo 10 type: ClusterIP 11 sessionAffinity: None 12 ports: 13 - protocol: TCP 14 port: 80 15 targetPort: 10001 16 name: http-port
步骤四:访问微服务应用产生追踪数据
进入 consumer-demo 的 pod 容器中,访问接口 :
1$ while true; do curl http://{consumer-demo-pod-ip}:9999/echo-rest/test && echo && sleep 1; done;
步骤五:查看链路追踪数据
- 执行以下命令,打开 jaeger 页面:
1$ istioctl dashboard jaeger
- 查看 tracing 采集数据,预期输出如下:
- 点击具体某条访问链路页面查询效果如下:
排查步骤
若观察到数据不符合预期,可按以下步骤进行排查:
-
确认是否成功安装 jaeger。
通过以下命令查看 jaeger 的 pod 和 service 是否均正常启动:
Kubectl1$ kubectl get pods -n istio-system 2$ kubectl get svc -n istio-system
-
确认 jaeger 服务地址及端口是否正确。
通过以下命令查看您在链路追踪所配置的服务地址与 jaeger-collector 服务地址及端口是否一致:
Kubectl1$ kubectl get svc -n istio-system | grep jaeger-collector
-
确认您部署的微服务应用程序 pod 是否成功注入 sidecar。
Kubectl1$ kubectl get pod -n ${namespace}