# K8s Ingress 支持socket.io多实例

# 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中,可以是这样配置

ingress.png