链路追踪
概述
百度智能云 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 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: jaeger
namespace: istio-system
labels:
app: jaeger
spec:
selector:
matchLabels:
app: jaeger
template:
metadata:
labels:
app: jaeger
annotations:
sidecar.istio.io/inject: "false"
prometheus.io/scrape: "true"
prometheus.io/port: "14269"
spec:
containers:
- name: jaeger
image: "registry.baidubce.com/csm-offline/all-in-one:1.35"
env:
- name: BADGER_EPHEMERAL
value: "false"
- name: SPAN_STORAGE_TYPE
value: "badger"
- name: BADGER_DIRECTORY_VALUE
value: "/badger/data"
- name: BADGER_DIRECTORY_KEY
value: "/badger/key"
- name: COLLECTOR_ZIPKIN_HOST_PORT
value: ":9411"
- name: MEMORY_MAX_TRACES
value: "50000"
- name: QUERY_BASE_PATH
value: /jaeger
livenessProbe:
httpGet:
path: /
port: 14269
readinessProbe:
httpGet:
path: /
port: 14269
volumeMounts:
- name: data
mountPath: /badger
resources:
requests:
cpu: 10m
volumes:
- name: data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: tracing
namespace: istio-system
labels:
app: jaeger
spec:
type: ClusterIP
ports:
- name: http-query
port: 80
protocol: TCP
targetPort: 16686
# Note: Change port name if you add '--query.grpc.tls.enabled=true'
- name: grpc-query
port: 16685
protocol: TCP
targetPort: 16685
selector:
app: jaeger
---
# Jaeger implements the Zipkin API. To support swapping out the tracing backend, we use a Service named Zipkin.
apiVersion: v1
kind: Service
metadata:
labels:
name: zipkin
name: zipkin
namespace: istio-system
spec:
ports:
- port: 9411
targetPort: 9411
name: http-query
selector:
app: jaeger
---
apiVersion: v1
kind: Service
metadata:
name: jaeger-collector
namespace: istio-system
labels:
app: jaeger
spec:
type: ClusterIP
ports:
- name: jaeger-collector-http
port: 14268
targetPort: 14268
protocol: TCP
- name: jaeger-collector-grpc
port: 14250
targetPort: 14250
protocol: TCP
- port: 9411
targetPort: 9411
name: http-zipkin
selector:
app: jaeger
- 执行以下命令,将该配置应用到数据面集群:
$ kubectl apply -f jaeger.yaml
- 部署完毕后,查看 jaeger 服务,确认 pod 和 service 均正常启动:
$ kubectl get pods -n istio-system
$ kubectl get svc -n istio-system
- 打开 jaeger 页面:
$ istioctl dashboard jaeger
步骤三:部署微服务应用程序
-
开启 Sidecar 自动注入
方式一:登陆 CSM 控制台,选择目标网格实例,选择【注入配置】,在自动注入配置模块选择需要部署的命名空间,点击【开启】即可开启 Sidecar 自动注入,也可通过切换开关状态开启自动注入。
方式二:使用 kubectl 开启自动注入 Sidecar 功能:
# 开启自动注入 Sidecar 功能 $ kubectl label namespace ${namespace} istio-injection=enabled --overwrite
-
执行以下命令,将测试应用 consumer-demo 和 provider-demo 部署到集群中:
$ kubectl apply -f consumer-demo-deployment.yaml $ kubectl apply -f provider-demo-deployment.yaml
consumer-demo-deployment.yaml 文件如下:
apiVersion: apps/v1 kind: Deployment metadata: name: consumer-demo-deployment labels: app: consumer-demo name: consumer-demo spec: replicas: 1 selector: matchLabels: app: consumer-demo template: metadata: labels: app: consumer-demo spec: restartPolicy: Always containers: - name: consumer-demo image: registry.baidubce.com/csm-offline/bms-orignal-consumer:dev imagePullPolicy: Always env: - name: OTEL_TRACES_EXPORTER value: otlp - name: OTEL_EXPORTER_OTLP_ENDPOINT value: http://otel-collector.istio-system.svc.cluster.local:4317 - name: OTEL_JAVAAGENT_ENABLED value: 'true' ports: - containerPort: 9999 resources: limits: cpu: 350m memory: 612Mi requests: cpu: 350m memory: 612Mi
provider-demo-deployment-v1.yaml 文件如下:
apiVersion: apps/v1 kind: Deployment metadata: name: provider-demo-deployment labels: app: provider-demo name: provider-demo spec: replicas: 1 selector: matchLabels: app: provider-demo template: metadata: labels: app: provider-demo spec: restartPolicy: Always containers: - name: provider-demo image: registry.baidubce.com/csm-offline/bms-orignal-provider:dev imagePullPolicy: Always env: - name: OTEL_TRACES_EXPORTER value: otlp - name: OTEL_EXPORTER_OTLP_ENDPOINT value: http://otel-collector.istio-system.svc.cluster.local:4317 - name: OTEL_JAVAAGENT_ENABLED value: 'true' ports: - containerPort: 10001 resources: limits: cpu: 350m memory: 612Mi requests: cpu: 350m memory: 612Mi
-
执行以下命令,部署应用的 Service:
$ kubectl apply -f consumer-demo-service.yaml $ kubectl apply -f provider-demo-service.yaml
consumer-demo-service.yaml 文件如下:
apiVersion: v1 kind: Service metadata: name: consumer-demo annotations: prometheus.io/scrape: "true" spec: selector: app: consumer-demo type: ClusterIP sessionAffinity: None ports: - protocol: TCP port: 9999 targetPort: 9999 name: http-port
provider-demo-service.yaml 文件如下:
apiVersion: v1 kind: Service metadata: name: provider-demo annotations: prometheus.io/scrape: "true" spec: selector: app: provider-demo type: ClusterIP sessionAffinity: None ports: - protocol: TCP port: 80 targetPort: 10001 name: http-port
步骤四:访问微服务应用产生追踪数据
进入 consumer-demo 的 pod 容器中,访问接口 :
$ while true; do curl http://{consumer-demo-pod-ip}:9999/echo-rest/test && echo && sleep 1; done;
步骤五:查看链路追踪数据
- 执行以下命令,打开 jaeger 页面:
$ istioctl dashboard jaeger
- 查看 tracing 采集数据,预期输出如下:
- 点击具体某条访问链路页面查询效果如下:
排查步骤
若观察到数据不符合预期,可按以下步骤进行排查:
-
确认是否成功安装 jaeger。
通过以下命令查看 jaeger 的 pod 和 service 是否均正常启动:
$ kubectl get pods -n istio-system $ kubectl get svc -n istio-system
-
确认 jaeger 服务地址及端口是否正确。
通过以下命令查看您在链路追踪所配置的服务地址与 jaeger-collector 服务地址及端口是否一致:
$ kubectl get svc -n istio-system | grep jaeger-collector
-
确认您部署的微服务应用程序 pod 是否成功注入 sidecar。
$ kubectl get pod -n ${namespace}