今天在远程k8s集群上部署了一个nsq,结果在调试本地程序时,报了如下错误:
本地调试程序的输出:
ERR 1 [topic/channel] (nsq-0.nsq.qijing.svc.cluster.local:4150) error connecting to nsqd - dial tcp: lookup nsq-0.nsq.qijing.svc.cluster.local: no such host
k8s pod内的输出:
[nsqd] 2022/12/21 14:49:20.274503 INFO: NSQ: persisting topic/channel metadata to nsqd.dat [nsqd] 2022/12/21 14:49:20.274637 INFO: LOOKUPD(127.0.0.1:4160): topic REGISTER topic [nsqd] 2022/12/21 14:49:20.291556 INFO: PROTOCOL(V2): [192.168.3.24:65465] exiting ioloop [nsqd] 2022/12/21 14:49:20.291591 ERROR: client(192.168.3.24:65465) - failed to read command - read tcp 172.17.182.159:4150->192.168.3.24:65465: read: connection reset by peer [nsqd] 2022/12/21 14:49:20.291647 INFO: PROTOCOL(V2): [192.168.3.24:65465] exiting messagePump
这里的nsq-0.nsq.qijing.svc.cluster.local
是启动 nsqd
服务时指定的/nsqd --lookupd-tcp-address=127.0.0.1:4160 --broadcast-address=nsq-0.nsq.qijing.svc.cluster.local
,因为k8s部署nsq应用时,使用的是 StatefulSet,因此,nsq-0.nsq.qijing.svc.cluster.local
在k8s内部是完全能解析到的。
那这个错误到底是从哪儿来的呢?原因在于:k8s集群外部(也就是我本机无法解析它)。所以在在本机的 hosts文件中加上这个域名的解析地址,程序就正常了。
经过重复测试发现:
- --broadcast-address 参数不指定域名,指定nsq的k8s服务(Service)对外的公共ip也是可以的。这样就不用编辑测试机器内部的域名解析地址了。其实编辑域名解析地址也是将域名指向k8s对外的公共ip。
- 建议使用 StatefulSet 不要使用 Deployment,因为同样指定了 --broadcast-address为公共ip,StatefulSet能正常运行,Deployment不能正常运行。
- pod 内部输出的
ERROR: client(192.168.3.24:65465) - failed to read command
不影响使用。
- 本地机器输出
no such host
错误,指的是本地的问题,并不是把远程nsq的日志拉到本地。