在具有多个pod的Google Container Engine中运行socket.io失败

cri*_*eys 6 socket.io kubernetes google-kubernetes-engine

我正在尝试使用Google容器引擎运行socket.io应用.我已经设置了入口服务,该服务创建了一个指向群集的Google负载均衡器.如果群集中有一个pod,则一切正常.一旦我添加更多,我就会收到大量的socket.io错误.看起来连接最终会进入集群中的不同pod,我怀疑这是socket.io正在进行的所有轮询和升级的问题.

我设置负载均衡器以使用基于IP的粘性会话.

这仅仅意味着它对kubernetes集群中的特定NODE具有亲和力而不是POD吗?

如何设置它以确保与群集中特定POD的会话亲和性?

注意:我在云负载均衡器上手动设置sessionAffinity. 在此输入图像描述

这将是我的入口yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-static-ip
spec:
  backend:
    serviceName: my-service
    servicePort: 80
Run Code Online (Sandbox Code Playgroud)

服务

apiVersion: v1
kind: Service
metadata:
  name: my-service
  labels:
    app: myApp
spec:
  sessionAffinity: ClientIP
  type: NodePort
  ports:
    - port: 80
      targetPort: http-port
  selector:
    app: myApp
Run Code Online (Sandbox Code Playgroud)

小智 2

首先,您需要在Ingress资源级别设置“sessionAffinity”,而不是负载均衡器(这仅与目标组中的特定节点相关):

这是一个示例Ingress规范:

apiVersion: extensions/v1beta1  
kind: Ingress  
metadata:  
  name: nginx-test-sticky
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "route"
    nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
spec:
  rules:
  - host: $HOST
    http:
      paths:
      - path: /
        backend:
          serviceName: $SERVICE_NAME
          servicePort: $SERVICE_PORT
Run Code Online (Sandbox Code Playgroud)

其次,您可能需要调整ingress-controller以允许更长的连接时间。默认情况下,其他所有内容都支持 websocket 代理。

如果您仍然遇到问题,请提供kubectl describe -oyaml pod/<ingress-controller-pod>和 的输出kubectl describe -oyaml ing/<your-ingress-name>

希望这有帮助,祝你好运!