记一次Jaeger连接ElasticSearch找不到节点的排查过程

29 阅读2分钟

最近在K8S部署Jaeger做链路追踪的时候为了提升安全性增加TLS连接,部署完成后Collector、Agent能正常运行但Jaeger ingester报错错误无法启动。错误信息如下:

{"level":"fatal","ts":1766718241.7353685,"caller":"ingester/main.go:62","msg":"Failed to init storage factory","error":"failed to create Elasticsearch client: health check timeout: no Elasticsearch node ...}

因为所使用的ElasticSerch版本是8.18.8,Jaeger版本是1.74.0,起初以为是证书问题,但生成证书后错误依旧,后来在ES关闭xpack可以正常启动,但这样显然不是长久之计,诡异的是之前搭建的Fluent bit能正常访问。

然后我在ES找到如下信息:

{"@timestamp":"2025-12-26T05:56:23.053Z", "log.level": "WARN", "message":"received plaintext http traffic on an https channel, closing connection Netty4HttpChannel{localAddress=/?.?.?.?:9200, remoteAddress=/?.?.?.?:44962}", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"elasticsearch[node-1][transport_worker][T#1]","log.logger":"org.elasticsearch.http.netty4.Netty4HttpServerTransport","elasticsearch.cluster.uuid":"1111","elasticsearch.node.id":"1111","elasticsearch.node.name":"node-1","elasticsearch.cluster.name":"elasticsearch"}

这个提示有很强的迷惑性,从字面上分析意思是jaeger使用HTTP传输数据被ES关闭连接,我在排查证书问题上花了很多时间仍无法解决问题。紧接着我用kubectl port-forward svc/elasticsearch暴露端口,在Postman设置Basic Auth为Jaeger的账号密码连接ES,请求“/_nodes/_all/http”接口报错,提示没有权限,所以很明显是jaeger对应的jaeger角色权限设置存在问题——cluster权限为空,故使用接口增加cluster的权限:

PUT /_security/role/jaeger
{
  "description": "Jaeger链路追踪",
  "cluster": ["monitor"],
  "indices": [
    {
      "names": [ "jaeger-*""],
      "privileges": [...]
    }
  ]
}

jaeger ingester是以deployment部署在集群里的,故需要强制重启,最后问题解决。

kubectl rollout restart deployment/jaeger-ingester -n observability

分析

Jaeger ingester连接ES客户端的时候会先做健康检查,做不了健康检查或者接口返回错误信息即视为找不到节点,所以它的账号还需要有cluster的权限,为cluster分配monitor权限才能让jaeger ingester完成健康检查。至于Fluent Bit可以使用是因为它只要连接指定的host,为账号配置index相关的权限即可。

注意事项

  • 配置cluster权限时使用all会降低安全性,开放必要的权限即可。
  • superuser拥有巨大的权限不能用于生产环境。