美文网首页kubernetes
528.【消息队列】解决ERR 1 [topic/chan

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

作者: 七镜 | 来源:发表于2022-12-23 00:01 被阅读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的日志拉到本地。

    相关文章

      网友评论

        本文标题:528.【消息队列】解决ERR 1 [topic/chan

        本文链接:https://www.haomeiwen.com/subject/rswpqdtx.html