Node.js ZMQ套接字在Kubernetes上无法按预期工作
简短摘要:当我在kubernetes上部署代码时,我的ZMQ套接字不会接收(可能也会发送)消息 我有一个涉及多个客户端和服务器的应用程序。它是在节点上开发的,使用ZeroMQ作为通信层。它在我的本地机器上工作,在docker上工作,我正在尝试使用kubernetes部署应用程序 部署应用程序时,将启动POD、部署和kubernete的服务。显然一切正常,但客户端发送的初始消息从未到达服务器。部署在同一个名称空间中,我使用Flannel作为CNI。据我所知,集群已正确初始化,但消息从未到达 我读过关于ZMQ套接字在绑定kubernetes时遇到问题的文章。我尝试过使用ZMQ_CONNECT_TIMEOUT参数,但它没有任何作用。而且,与我提到的问题不同,我的信息从未到达 我可以提供一些代码,但是有很多代码,我认为应用程序不是问题所在。我想我在Kubernetes配置上遗漏了一些东西,因为这是我第一次使用它。如果你需要更多信息,请告诉我 编辑1。2021年1月12日 正如@anemyte所建议的,我将尝试提供代码的简化版本: 客户端:Node.js ZMQ套接字在Kubernetes上无法按预期工作,node.js,docker,kubernetes,zeromq,Node.js,Docker,Kubernetes,Zeromq,简短摘要:当我在kubernetes上部署代码时,我的ZMQ套接字不会接收(可能也会发送)消息 我有一个涉及多个客户端和服务器的应用程序。它是在节点上开发的,使用ZeroMQ作为通信层。它在我的本地机器上工作,在docker上工作,我正在尝试使用kubernetes部署应用程序 部署应用程序时,将启动POD、部署和kubernete的服务。显然一切正常,但客户端发送的初始消息从未到达服务器。部署在同一个名称空间中,我使用Flannel作为CNI。据我所知,集群已正确初始化,但消息从未到达 我读过
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时重新加载服务