【问题标题】:Error in implementing WebSocket in Kubernetes在 Kubernetes 中实现 WebSocket 时出错
【发布时间】:2019-09-18 08:22:42
【问题描述】:

我们正在尝试按照 GCP 文档“https://cloud.google.com/kubernetes-engine/docs/concepts/ingress#support_for_websocket”和“https://cloud.google.com/kubernetes-engine/docs/how-to/configure-backend-service”中给出的步骤在 Kubernetes 中实现 WebSocket。但我们收到“WebSocket 握手期间出错:意外的响应代码:502”。

Error Message : “WebSocket connection to 'wss://..../backend-channeladaptor-web/socket.io/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 502”.

我还附上了为 gke 实现创建的文件:

  1. 后端-channeladaptor-web.yaml

    • 部署内容

    • 服务内容

    • 后端配置内容
  2. Converse-ingress.yaml(它还包含其他服务的详细信息,除了 backend-channeladaptor-web,您可以忽略它)。

Converse-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: converse-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: $Static-Ip-Name
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: $SSL-certificate
  rules:
  - host: $HostName
    http:
      paths:
      - path: /*
        backend:
          serviceName: frontend-chat-client
          servicePort: 3040
      - path: /socket-io/*
        backend:
          serviceName: backend-channeladaptor-engineerportal
          servicePort: 11009          
      - path: /login/*
        backend:
          serviceName: frontend-engineeringportal
          servicePort: 3021
      - path: /frontend-engineeringportal/*
        backend:
          serviceName: frontend-engineeringportal
          servicePort: 3021
      - path: /backend-channeladaptor-web/*
        backend:
          serviceName: backend-channeladaptor-web
          servicePort: 11006

后端-channeladaptor-web.yaml

apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: backend-channeladaptor-web-backendconfig
spec:
  timeoutSec: 3600
  connectionDraining:
    drainingTimeoutSec: 3600

---
apiVersion: v1
kind: Service
metadata:
  name: backend-channeladaptor-web
  annotations:
    beta.cloud.google.com/backend-config: '{"ports": {"8081":"backend-channeladaptor-web-backendconfig"}}'
spec:
  type: NodePort
  ports:
    - port: 8081
      targetPort: 11006
      protocol: TCP
      nodePort: 30078
      name: http
  selector:
    app: backend-channeladaptor-web

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: backend-channeladaptor-web
spec:
  selector:
    matchLabels:
      app: backend-channeladaptor-web
  replicas: 1
  template:
    metadata:
      labels:
        app: backend-channeladaptor-web
    spec:
      containers:
        - image: gcr.io/acn-careful-granite-240620/backend-channeladaptor-web:0.2
          name: backend-channeladaptor-web
          ports:
           - name: http
             containerPort: 11006
             hostPort: 11006
          env:
            - name: NODE_ENV
              value: dev

我希望响应状态代码为 101,但收到 502 Bad Gateway

【问题讨论】:

  • 在 https 负载均衡器启动后 是否收到 502?
  • @yyyyahir 我们在此服务中添加了 healthcheck 并且运行良好,即我们得到状态代码 200 ,但是当我们点击 webSocket 时调用它给出 502 Bad Gateway。是的 https 负载均衡器已启动并运行良好

标签: kubernetes websocket socket.io google-kubernetes-engine


【解决方案1】:

看起来您的入口有 URI /backend-channeladaptor-web/* 指向服务 backend-channeladaptor-web,并且期望服务正在侦听 11006。但是,NodePort 配置正在侦听8081

混淆可能来自targetPort 指令,指向实际后端(部署)中的11006

这会导致 502,这意味着尽管您正在访问一个中介(在您的情况下为负载均衡器),但它无法到达后端(部署,由 NodePort 服务提供服务)。

您可以将入口定义更改为指向 8081,以匹配当前的 NodePort 配置。

【讨论】:

  • 1.我尝试更改“NodePort 配置以侦听 11006”但同样的问题。 2. 我能够访问所有服务的健康检查,包括上述一个唯一的 websocket 调用失败
  • 运行状况检查独立于Service 允许对您的Deployment 的请求。 Have you triedrun在集群中创建一个 pod 并到达 WS?或者attach直接访问 Pod 中的网络空间,看看那里的一切是否真的运行良好?
猜你喜欢
  • 2022-01-18
  • 2020-08-03
  • 2013-11-28
  • 1970-01-01
  • 2020-05-04
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多