K8s Ingress 支持socket.io多实例
程序员文章站
2022-03-08 17:54:52
...
socket.io 多实例间通信
在实际工程中不会只用一个node实例,用户多的时候会需要开多个node实例。这些实例间的通信可以用redis适配器来实现,socket.io官方有个现有的封装socket.io-redis,它是利用redis的发布订阅模式来实现的,使用示例如下:
const redisAdapter = require('socket.io-redis');
var redis_config = { host: ’127.0.0.1‘, port: 3306, password:'abc' };
io.adapter(redisAdapter(redis_config));
加载Redis适配器后就可以直接使用io对象了,和单实例的使用方式是一致的。
在k8s Ingress下使用socket.io
socket.io官方的例子是直接利用nginx来实现:
http {
server {
listen 3000;
server_name io.yourhost.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://nodes;
# enable WebSockets
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
upstream nodes {
# enable sticky session based on IP
ip_hash;
server app01:3000;
server app02:3000;
server app03:3000;
}
}
在k8s下一般用Ingress来暴露服务,Ingress其实就是nginx,所以在Ingress中增加相关注解即可实现,参考如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: websocket
namespace: default
annotations:
# 代理发送超时
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
# 代理读取超时
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
# 代理连接超时
nginx.ingress.kubernetes.io/proxy-connect-timeout: "3600"
# 基于客户端出口ip哈希
nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x_forwarded_for"
spec:
rules:
- host: websocket.example.com
http:
paths:
- backend:
serviceName: websocket
servicePort: 8080
path: /
在阿里云的k8s中,可以是这样配置
下一篇: java并发编程——CAS