链路追踪
概述
百度智能云 CSM 数据面支持链路追踪,可以将网格数据面内产生的 tracing 数据上报到 Jaeger/Zipkin 服务。上报后可在 Jaeger/Zipkin 界面查看调用链信息,帮助您理解服务间的依赖关系、分析链路情况或快速排障。本文以 Jaeger 为例介绍链路追踪使用流程。
前提条件
- 已将 Kubernetes 集群添加到 CSM 实例,并具备目标网格实例和目标集群的管理权限。
- 已准备可用的 Jaeger/Zipkin 服务地址;若需在目标集群中自行部署 Jaeger,请确保目标集群节点可调度。
- 已准备开启 Sidecar 自动注入的业务命名空间,并确保注入组件状态正常。
操作步骤
步骤一:为网格实例启用链路追踪
为已有网格实例开启链路追踪
导航路径:CSM 控制台 -> 网格列表 -> 目标网格实例 -> 可观测管理 -> 链路追踪

- 登录 CSM 控制台,进入 【网格列表】 页,点击需要开启链路追踪的网格实例名称或 ID,进入网格实例详情页。
- 进入 【可观测管理】 -> 【链路追踪】,点击 【立即开启】。在弹窗中按照下表配置相关参数后,点击 【确定】。
| 参数 | 必填 | 说明 |
|---|---|---|
| 采样率 | 是 | 网格采集并持久化 tracing 数据的采样比例,范围为 0 到 100。采样率越高,Sidecar 采集与上报产生的资源和带宽消耗越大,请按需设置。 |


创建网格实例时开启链路追踪
导航路径:CSM 控制台 -> 网格列表 -> 创建网格

- 登录 CSM 控制台,进入 【网格列表】 页,点击 【创建网格】,进入创建网格页。

修改链路追踪配置
导航路径:CSM 控制台 -> 网格列表 -> 目标网格实例 -> 可观测管理 -> 链路追踪
- 登录 CSM 控制台,进入 【网格列表】 页,点击需要修改链路追踪配置的网格实例名称或 ID,进入网格实例详情页。
- 进入 【可观测管理】 -> 【链路追踪】,点击 【编辑】。在弹窗中修改链路追踪相关配置后,点击 【确定】 使配置生效。
注意:修改链路追踪配置会导致控制面重启,建议您在系统负载较低时修改。


步骤二:在集群部署 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
步骤三:部署微服务应用程序
导航路径:CSM 控制台 -> 网格列表 -> 目标网格实例 -> 注入配置
- 登录 CSM 控制台,选择目标网格实例,进入 【注入配置】 页面。
- 在自动注入配置模块中选择需要部署应用的命名空间,点击 【开启】 或直接启用开关,确保该命名空间已开启 Sidecar 自动注入。
如需通过命令行开启自动注入,可执行以下命令:
1kubectl 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.yamlconsumer-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: 612Miprovider-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
导航路径:CCE 控制台 -> 集群列表 -> 目标集群 -> 网络 -> 服务
- 在相同命名空间中,通过 YAML 创建资源,分别提交
consumer-demo-service.yaml和provider-demo-service.yaml。
consumer-demo-service.yaml 文件如下:
1apiVersion: 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 文件如下:
1apiVersion: 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和provider-demoService 已创建成功,且端口映射符合预期。
步骤四:访问微服务应用产生追踪数据
导航路径:CCE 控制台 -> 集群列表 -> 目标集群 -> 工作负载 -> Pod
- 确认
consumer-demo和provider-demoPod 均已就绪,并记录consumer-demoPod IP。 - 进入
consumer-demo的 Pod 容器后,执行以下命令持续访问接口,产生 tracing 数据:
1while true; do curl http://{consumer-demo-pod-ip}:9999/echo-rest/test && echo && sleep 1; done;
步骤五:查看链路追踪数据
导航路径:CSM 控制台 -> 网格列表 -> 目标网格实例 -> 可观测管理 -> 链路追踪
- 确认 【链路追踪】 已开启,且 Jaeger 服务与业务应用 Pod 均已正常运行。
- 在具备集群访问能力的环境中,执行以下命令打开 Jaeger 页面:
1istioctl dashboard jaeger


排查步骤
若观察到数据不符合预期,可按以下步骤进行排查:
导航路径一:CCE 控制台 -> 集群列表 -> 目标集群 -> 工作负载 -> 部署
导航路径二:CCE 控制台 -> 集群列表 -> 目标集群 -> 网络 -> 服务
导航路径三:CSM 控制台 -> 网格列表 -> 目标网格实例 -> 可观测管理 -> 链路追踪
-
确认是否成功安装 Jaeger。
在 【工作负载】 -> 【部署】 页面检查
jaegerDeployment,确认至少有一个 Pod 处于Running状态;在 【网络】 -> 【服务】 页面检查tracing、zipkin和jaeger-collectorService 是否已创建成功。若jaegerPod 长时间处于Pending,或tracingService 没有可用后端,请先检查集群节点是否可调度,再继续后续排查。
1kubectl get pods -n istio-system
2kubectl get svc -n istio-system
-
确认 Jaeger 服务地址及端口是否正确。
在 【链路追踪】 页面检查当前追踪配置,确认服务地址指向可达的
jaeger-collectorService 和正确端口。若页面无法正常展示追踪配置,请先检查控制面状态,再重新校验服务地址。
1kubectl get svc -n istio-system | grep jaeger-collector
-
确认您部署的微服务应用程序 Pod 是否成功注入 Sidecar。
在 【工作负载】 -> 【部署】 页面检查
consumer-demo和provider-demo的运行状态。若 Pod 未创建成功或长期未就绪,请优先检查 Sidecar 注入组件和控制面证书状态。
1kubectl get pod -n ${namespace}
评价此篇文章
