最近在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拥有巨大的权限不能用于生产环境。