必须使用Jaeger实现微服务全链路追踪,其Operator部署最可靠:先创建observability命名空间并安装Operator,再通过CR配置in-memory或Elasticsearch存储。

要在Kubernetes集群中实现微服务之间的全链路调用链跟踪,必须让每个服务请求携带唯一追踪上下文,并由统一的后端收集、存储和展示调用路径。Jaeger是CNCF毕业项目,原生支持OpenTracing和OpenTelemetry协议,适配K8s生态成熟稳定。
部署Jaeger后端组件到K8s集群
使用官方Jaeger Operator是最可靠的方式,它能自动管理Jaeger实例的生命周期、配置更新与扩缩容。
第一步:在目标命名空间(如observability)中安装Jaeger Operator:
kubectl create namespace observability && kubectl apply -n observability -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.54.0/operator.yaml
第二步:创建Jaeger自定义资源(CR),指定存储为in-memory(测试用)或Elasticsearch(生产推荐):
cat apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: simple-prod
spec:
strategy: production
storage:
type: elasticsearch
options:
es.server-urls: http://elasticsearch:9200
EOF
注意:若未提前部署Elasticsearch,【Jaeger会持续CrashLoopBackOff】,必须确保storage依赖就绪后再应用该CR。
第三步:等待Pod就绪,验证jaeger-query服务是否可访问:
kubectl port-forward -n observability svc/simple-prod-query 16686 && open http://localhost:16686
为微服务注入Jaeger客户端SDK
服务必须主动创建Span并传播trace context,否则Jaeger无法串联请求。不同语言SDK初始化方式不同,但核心逻辑一致。
方法一(Go服务):在main函数入口初始化tracer:
import "github.com/jaegertracing/jaeger-client-go"
tracer, _ := jaeger.NewTracer("user-service",
jaeger.NewConstSampler(true),
jaeger.NewRemoteReporter(jaeger.RemoteReporterParams{LocalAgentHostPort: "jaeger-agent.observability.svc:6831"}))
opentracing.InitGlobalTracer(tracer)
方法二(Java Spring Boot):引入spring-cloud-starter-zipkin并配置,但注意——Zipkin兼容层默认发送到Zipkin格式端点,需额外设置:spring.zipkin.base-url=http://simple-prod-collector.observability.svc:9411;更推荐直接用jaeger-client + opentracing-spring-web-interceptor,避免协议转换损耗。
方法三(Python Flask):使用flask_opentracing中间件,关键点是必须从HTTP头读取b3或uber-trace-id字段:
from flask_opentracing import FlaskTracer
from jaeger_client import Config
config = Config(config={'sampler': {'type': 'const', 'param': 1}}, service_name='order-service')
jaeger_tracer = config.initialize_tracer()
FlaskTracer(jaeger_tracer, trace_all_requests=True, app=app)
通过ServiceMesh(Istio)零代码接入Jaeger
如果集群已启用Istio,无需修改任何业务代码,所有Sidecar代理自动完成Span上报。
① 确保Istio控制平面已启用Tracing功能(1.20+版本默认开启):
istioctl install --set profile=default --set meshConfig.defaultConfig.tracing.zipkin.address=jaeger-collector.observability.svc:9411
② 将目标命名空间打上istio-injection=enabled标签:
kubectl label namespace default istio-injection=enabled --overwrite
③ 重新部署服务(触发Sidecar注入):
kubectl rollout restart deployment/product-service
这一步操作起来很简单,直接把文件拖进去就行。Istio会在每个HTTP/gRPC请求中自动注入uber-trace-id头,并将Span上报至Jaeger Collector。
④ 在Jaeger UI中选择对应service name,设置时间范围,点击“Find Traces”即可看到完整调用链。
注意:【必须保证jaeger-collector服务DNS可解析且端口连通】,否则Sidecar日志会出现"Failed to submit span"错误,且无任何Trace数据生成。


















