Node.js ZMQ套接字在Kubernetes上无法按预期工作

Node.js ZMQ套接字在Kubernetes上无法按预期工作,node.js,docker,kubernetes,zeromq,Node.js,Docker,Kubernetes,Zeromq,简短摘要:当我在kubernetes上部署代码时,我的ZMQ套接字不会接收(可能也会发送)消息 我有一个涉及多个客户端和服务器的应用程序。它是在节点上开发的,使用ZeroMQ作为通信层。它在我的本地机器上工作,在docker上工作,我正在尝试使用kubernetes部署应用程序 部署应用程序时,将启动POD、部署和kubernete的服务。显然一切正常,但客户端发送的初始消息从未到达服务器。部署在同一个名称空间中,我使用Flannel作为CNI。据我所知,集群已正确初始化,但消息从未到达 我读过

简短摘要:当我在kubernetes上部署代码时,我的ZMQ套接字不会接收(可能也会发送)消息

我有一个涉及多个客户端和服务器的应用程序。它是在节点上开发的,使用ZeroMQ作为通信层。它在我的本地机器上工作,在docker上工作,我正在尝试使用kubernetes部署应用程序

部署应用程序时,将启动POD、部署和kubernete的服务。显然一切正常,但客户端发送的初始消息从未到达服务器。部署在同一个名称空间中,我使用Flannel作为CNI。据我所知,集群已正确初始化,但消息从未到达

我读过关于ZMQ套接字在绑定kubernetes时遇到问题的文章。我尝试过使用ZMQ_CONNECT_TIMEOUT参数,但它没有任何作用。而且,与我提到的问题不同,我的信息从未到达

我可以提供一些代码,但是有很多代码,我认为应用程序不是问题所在。我想我在Kubernetes配置上遗漏了一些东西,因为这是我第一次使用它。如果你需要更多信息,请告诉我

编辑1。2021年1月12日

正如@anemyte所建议的,我将尝试提供代码的简化版本:

客户端:

initiate () {
        return new Promise(resolve => {
            this.N_INCOMING = 0;
            this.N_OUTGOING = 0;
            this.rrCounter = 0;
            this.PULL_SOCKET.bind("tcp://*:" + this.MY_PORT, error => {
                utils.handleError(error);
                this.PUB_SOCKET.bind("tcp://*:" + (this.MY_PORT + 1), error => {
                    utils.handleError(error);
                    this.SUB_SOCKET.subscribe("");                    
                    this.SUB_SOCKET.connect(this.SERVER + ":" + (this.SERVER_PORT + 1),
                        error => {utils.handleError(error)});
                    this.PULL_SOCKET.on("message", (m) => this.handlePullSocket(m));
                    this.SUB_SOCKET.on("message", (m) => this.handleSubSocket(m));
                    this.SERVER_PUSH_SOCKET = zmq.socket("push");
                    this.SERVER_PUSH_SOCKET.connect(this.SERVER + ":" + this.SERVER_PORT,
                        error => {utils.handleError(error)});
                    this.sendHello();
                    resolve();
                });
            });
        });
服务器端:

    initiate () {
        return new Promise(resolve => {
            this.PULL_SOCKET.bind(this.MY_IP + ":" + this.MY_PORT, err => {
                if (err) {
                    console.log(err);
                    process.exit(0);
                }
                this.PUB_SOCKET.bind(this.MY_IP + ":" + (this.MY_PORT + 1), err => {
                    if (err) {
                        console.log(err);
                        process.exit(0);
                    }
                    this.PULL_SOCKET.on("message", (m) => this.handlePullSocket(m));
                    resolve();
                });
            });
        });
    }
客户端通过发送Hello消息来启动连接。服务器的侦听器函数
handlePullSocket
应该处理这些消息

编辑2。12/01/2021 根据要求,我正在添加部署/服务配置

Client-deployment.yaml

apiVersion:apps/v1 种类:部署 元数据: 注释: kompose.cmd:kompose convert-f docker-compose-resolved.yml kompose.version:1.19.0(f63a961c) creationTimestamp:空 标签: io.kompose.service:c1 姓名:c1 名称空间:fishtrace 规格: 副本:1份 选择器: 火柴标签: app:c1 战略: 类型:重新创建 模板: 元数据: 注释: kompose.cmd:kompose convert-f docker-compose-resolved.yml kompose.version:1.19.0(f63a961c) creationTimestamp:空 标签: app:c1 规格: 容器: -环境: -姓名:NODO_地址 数值:0.0.0.0 -姓名:NODO_PUERTO 值:“9999” -姓名:NODO_PUERTO_CADENA 值:“8888” -名称:服务器地址 价值:tcp://servidor -名称:服务器 值:“7777” 图片:registrogeminis.com/docker\u c1\u rpi:latest 姓名:c1 端口: -集装箱港口:8888 -集装箱港口:9999 资源:{} 体积数量: -装载路径:/app/vol 名称:c1卷 imagePullPolicy:始终 restartPolicy:始终 你的秘密: -姓名:myregistrykey 卷数: -名称:c1卷 persistentVolumeClaim: 权利要求书名称:c1卷 状态:{} Client-service.yaml

apiVersion:v1 种类:服务 元数据: 注释: kompose.cmd:./kompose转换 kompose.version:1.22.0(955b78124) creationTimestamp:空 标签: io.kompose.service:c1 姓名:c1 规格: 端口: -姓名:“9999” 港口:9999 目标港:9999 -姓名:“8888” 港口:8888 目标港:8888 选择器: app:c1 类型:集群 Server-deployment.yaml

apiVersion:apps/v1 种类:部署 元数据: 注释: kompose.cmd:kompose convert-f docker-compose-resolved.yml kompose.version:1.19.0(f63a961c) creationTimestamp:空 标签: io.kompose.service:施维多 姓名:施维多 名称空间:fishtrace 规格: 副本:1份 选择器: 火柴标签: 应用程序:施维多 战略: 类型:重新创建 模板: 元数据: 注释: kompose.cmd:kompose convert-f docker-compose-resolved.yml kompose.version:1.19.0(f63a961c) creationTimestamp:空 标签: 应用程序:施维多 规格: 容器: -环境: -名称:服务器地址 值:tcp://* -名称:服务器 值:“7777” 图片:registrogeminis.com/docker\u servidor\u rpi:latest 姓名:施维多 端口: -集装箱港口:7777 -集装箱港口:7778 资源:{} 体积数量: -装载路径:/app/vol 名称:施维多卷 imagePullPolicy:始终 restartPolicy:始终 你的秘密: -姓名:myregistrykey 卷数: -名称:施维多卷 persistentVolumeClaim: 权利要求书名称:施维多卷 状态:{} Server-service.yaml

apiVersion:v1 种类:服务 元数据: 注释: kompose.cmd:./kompose转换 kompose.version:1.22.0(955b78124) creationTimestamp:空 标签: io.kompose.service:施维多 姓名:施维多 规格: 端口: -姓名:“7777” 港口:7777 目标港:7777 选择器: 应用程序:施维多 类型:集群
最后,这是一个DNS问题。这一直是一个DNS问题。感谢@Matt指出问题所在

在官方的Kubernetes中,他们指出使用
/etc/resolv.conf
链接到真实配置文件的系统存在一个已知问题,在我的例子中,
/run/systemd/resolv.conf
。这是一个众所周知的问题,建议将kubelet的配置更新为指向
/run/systemd/resolv/resolv.conf

为此,我在
/var/lib/kubelet/config.yaml
中添加了行
resolvConf:/run/systemd/resolv/resolv.conf
。我还编辑了
/etc/kubernetes/kubelet.conf
,只是为了确定。最后,您应该在执行sudosystemctl守护进程reload&&sudosystemctl restart kube时重新加载服务