我正在尝试使用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
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
答案 0 :(得分:1)
首先,您需要在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
第二,您可能需要调整ingress-controller
以允许更长的连接时间。默认情况下,其他所有内容都支持websocket代理。
如果您仍然遇到问题,请提供kubectl describe -oyaml pod/<ingress-controller-pod>
和kubectl describe -oyaml ing/<your-ingress-name>
希望这会有所帮助,祝您好运!