欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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中,可以是这样配置
K8s Ingress 支持socket.io多实例

相关标签: 后端