Grafana新版本中的mDNS问题排查(mDNS系列2)
起因
近期将使用的Grafana的Docker镜像升级到了最新版本,却发现面板都报错了。在查找了一下后发现因为我数据源中的Host或URL字段都是使用的mDNS(.local)的域名,导致无法解析IP地址。
分析
因为我是在Grafana的Docker镜像的基础上经行了mDNS支持,Dockerfile如下:
1 | FROM grafana/grafana:latest-ubuntu |
注:使用时需要挂载/run/avahi-daemon/socket
所以首先进入了运行中的容器测试了一下mDNS本身是否可用,有没有因为系统的其他组件的问题导致无法使用。发现没有问题,使用avahi-resolve-address
等命令时也可以得到正确的结果。(注:此时需要挂载/var/run/dbus
)
接着添加环境变量GODEBUG=netdns=cgo+2
重新运行容器,看打印出的日志,发现也没有问题,grafana使用的也是cgo。(注:纯Go版本的解析器是不支持mDNS的)
然后又用同版本的Golang编译了一个简单的Demo,放到了容器的环境下执行,发现同样可以解析mDNS,也没有问题。
此时常规排查陷入了僵局,无奈只能去翻Grafana官方文档及相关源码。
经过一番痛苦的排查后,终于发现了蛛丝马迹。原来Grafana在编译时使用的是基于Alpine
镜像的Golang版本,且使用了参数-ldflags "-linkmode 'external' -extldflags '-static'"
,将库静态编译了进去,此时使用的libc是musl libc
,而musl libc
是不支持 NSS (Name Service Switch)的。接着将编译好的文件放到了基于Ubuntu
的镜像中用于运行。所以即使运行环境是gnu libc
,支持mDNS,但实际上Grafana使用的还是静态编译的musl libc
,所以解析mDNS失败。
结果
知道了原因就有办法了,我选择了较为简单的一种。通过二分测试,找到了更改参数前的最后一个版本的Grafana,即10.0.3
版本来使用,接着向官方提了Issue以期早日修复,具体详见参考1的链接。在刚发Issue后,官方就有了回复,但之后近两个多月没有其它动静。本文修改时(2024-01-05),发现有官方人于前几天认领了这个Issue,希望有所进展吧。