【问题标题】:Kubernetes ingress websockets connection issueKubernetes入口websockets连接问题
【发布时间】:2020-02-20 08:55:04
【问题描述】:

使用 KOPS 在 AWS 上部署 k8s。 我已经创建了 nginx 入口https://github.com/kubernetes/ingress-nginx nginx-ingress-controller 镜像:quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.18.0

一切都已启动并运行,我可以使用由 nginx 服务创建的 aws 经典负载均衡器从外部访问应用程序。

最近我们开始研究 websockets。我在 k8s 中部署了我的服务并尝试从外部访问。

我为我的应用程序创建了服务和入口。 Ingress 现在指向负载均衡器(在 json 文件下方)。

我在 aws 中创建了 route53 条目并尝试连接到该条目,但是当我尝试通过 chrome 浏览器从客户端应用程序连接时遇到错误

与“wss://blockchain.aro/socket.io/?EIO=3&transport=websocket”的 WebSocket 连接失败:WebSocket 握手期间出错:意外响应代码:400

我尝试创建应用程序负载均衡器,但无法连接到wss://<host>

错误:

WebSocket 连接到 'wss://blockchain.aro/socket.io/?EIO=3&transport=websocket' 失败: WebSocket 握手期间出错:意外响应代码:400

const config: SocketIoConfig = { url: 'wss://blockchain.aro',
  options: { autoConnect: false, transports: ['websocket']} };


Ingress:

   "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"extensions/v1beta1\",\"kind\":\"Ingress\",\"metadata\":{\"annotations\":{},\"name\":\"blockchain\",\"namespace\":\"adapt\"},\"spec\":{\"rules\":[{\"host\":\"blockchain.aro\",\"http\":{\"paths\":[{\"backend\":{\"serviceName\":\"blockchain\",\"servicePort\":8097},\"path\":\"/\"},{\"backend\":{\"serviceName\":\"blockchain\",\"servicePort\":8097},\"path\":\"/socket.io\"},{\"backend\":{\"serviceName\":\"blockchain\",\"servicePort\":8097},\"path\":\"/ws/\"}]}}],\"tls\":[{\"hosts\":[\"blockchain.aro\"],\"secretName\":\"blockchain-tls-secret\"}]}}\n",
      "nginx.ingress.kubernetes.io/proxy-read-timeout": "3600",
      "nginx.ingress.kubernetes.io/proxy-send-timeout": "3600"
    }

在入口文件中包含 tlssecretnamerules。我尝试创建ApplicationLoadbalancer,但我也无法连接。

【问题讨论】:

    标签: kubernetes websocket nginx-ingress aws-elb


    【解决方案1】:
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        certmanager.k8s.io/cluster-issuer: core-prod
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
        nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
        nginx.ingress.kubernetes.io/rewrite-target: /
        nginx.ingress.kubernetes.io/secure-backends: "true"
        nginx.ingress.kubernetes.io/ssl-redirect: "true"
        nginx.ingress.kubernetes.io/websocket-services: core-service
        nginx.org/websocket-services: core-service
      name: core-ingress
    spec:
      rules:
      - host: test.io
        http:
          paths:
          - backend:
              serviceName: core-service
              servicePort: 80
      tls:
      - hosts:
        - test.io
        secretName: core-prod
    

    【讨论】:

    • 我根据您的输入更新了 asp。握手错误为 . WebSocket 连接到“wss://blockchain.aro/socket.io/?EIO=3&transport=websocket”失败:WebSocket 握手期间出错:意外响应代码:502
    • @Ram 如果您在 AWS 上,请尝试添加注释service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
    • 或者你也可以这样做:"service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp" "
    • 当然,Harsha,我更新了,看起来它正在连接,但我可以看到 pod 日志中的 websockets 信息,如服务器中的“从客户端接收到的 websocket 连接”,但在客户端出现相同的错误“失败: WebSocket 在建立连接之前已关闭。我正在检查这是否是代码问题。我会检查并更新。再次感谢您的支持,我将恢复到此并更新不会失败。
    • 谢谢,google了30分钟才找到这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多