kubernetes

528.【消息队列】解决ERR 1 [topic/chan

2022-12-23  本文已影响0人  七镜

今天在远程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文件中加上这个域名的解析地址,程序就正常了。


程序不再报错

经过重复测试发现:

  1. --broadcast-address 参数不指定域名,指定nsq的k8s服务(Service)对外的公共ip也是可以的。这样就不用编辑测试机器内部的域名解析地址了。其实编辑域名解析地址也是将域名指向k8s对外的公共ip。
  2. 建议使用 StatefulSet 不要使用 Deployment,因为同样指定了 --broadcast-address为公共ip,StatefulSet能正常运行,Deployment不能正常运行。
  3. pod 内部输出的 ERROR: client(192.168.3.24:65465) - failed to read command不影响使用。
  4. 本地机器输出 no such host 错误,指的是本地的问题,并不是把远程nsq的日志拉到本地。
上一篇下一篇

猜你喜欢

热点阅读