微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有负载均衡器错误上游的 Azure-AKS 入口过早关闭了 websocket 连接上的连接

如何解决带有负载均衡器错误上游的 Azure-AKS 入口过早关闭了 websocket 连接上的连接

我有一个 nodejs express 服务器,它带有在 Azure Kubernetes 服务上运行的 socket.io 应用程序。简单的 Http/s 请求工作正常,Websocket 连接在入口日志中出现以下错误

2021/03/30 06:59:51 [error] 1773#1773: *316873 upstream prematurely closed connection while reading response header from upstream,client: 123.212.143.111,server: socketio.medflix.app,request: "GET / HTTP/1.1",upstream: "http://10.244.0.10:3000/",host: "mydomain.com"
2021/03/30 06:59:52 [error] 1773#1773: *316873 upstream prematurely closed connection while reading response header from upstream,host: "mydomain.com"
2021/03/30 06:59:53 [error] 1773#1773: *316873 upstream prematurely closed connection while reading response header from upstream,host: "mydomain.com"
123.212.143.111 - - [30/Mar/2021:06:59:53 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/89.0.4389.90 Safari/537.36" 536 3.005 [default-websocketsamplesvc-8080] [] 10.244.0.10:3000,10.244.0.10:3000,10.244.0.10:3000 0,0 1.004,1.000,1.004 502,502,502 f167278bb44053d41f3b7d0ee10093d5

这是我使用的集群设置

---
apiVersion: v1
kind: Service
Metadata:
  name: websocketsamplesvc
  annotations: 
    service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec:
  ports:
  - port: 8080
    targetPort: 3000
    protocol: TCP
  selector:
    app: websocketsampledeploy
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
Metadata:
  name: websocketsampledeploy
spec:
  selector:
    matchLabels:
      app: websocketsampledeploy
  replicas: 1
  progressDeadlineseconds: 3600
  template:
    Metadata:
      labels:
        app: websocketsampledeploy
    spec:
      volumes:
        - name: secret-volume
          secret:
            secretName: env-secret-websocketsample     
      imagePullSecrets:
        - name: mycreds
      containers:
        - name: websocketsampledeploy
          image: myuser/myimage:v1
          imagePullPolicy: Always
          ports:
            - containerPort: 3000
          resources:
            limits:
              cpu: "1"
              memory: 1200Mi
            requests:
              cpu: 500m
              memory: 800Mi    
          envFrom:
            - secretRef:
                name: env-secret-websocketsample
          volumeMounts:
            - name: secret-volume
              readOnly: true
              mountPath: "/etc/secret-volume"



--- 
  apiVersion: extensions/v1beta1
  kind: Ingress
  Metadata: 
    annotations: 
      kubernetes.io/ingress.class: Nginx-api
      Nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
      Nginx.ingress.kubernetes.io/proxy-connect-timeout: "3600"
      Nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
      Nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
      Nginx.ingress.kubernetes.io/send-timeout: "3600"
      Nginx.ingress.kubernetes.io/proxy-body-size: 10m    
      cert-manager.io/cluster-issuer: letsencrypt  
      Nginx.ingress.kubernetes.io/websocket-services: "websocketsamplesvc"
      Nginx.org/websocket-services: "websocketsamplesvc"
    name: websocketsampleingress
  spec: 
    tls:
      - hosts:
        - mydomain.com
        secretName: tls-secret
    rules: 
      - 
        host: mydomain.com
        http:
          paths: 
            - 
              backend: 
                serviceName: websocketsamplesvc
                servicePort: 8080
              path: /



---
apiVersion: apps/v1
kind: Deployment
Metadata:
  name: nginx-ingress-controller
  namespace: ingress-Nginx
  labels:
    app.kubernetes.io/name: ingress-Nginx
    app.kubernetes.io/part-of: ingress-Nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-Nginx
      app.kubernetes.io/part-of: ingress-Nginx
  template:
    Metadata:
      labels:
        app.kubernetes.io/name: ingress-Nginx
        app.kubernetes.io/part-of: ingress-Nginx
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      # wait up to five minutes for the drain of connections
      terminationGracePeriodSeconds: 300
      serviceAccountName: nginx-ingress-serviceaccount
      nodeselector:
        kubernetes.io/os: linux
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:master
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/Nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-Nginx
            - --annotations-prefix=Nginx.ingress.kubernetes.io
            - --ingress-class=Nginx-api
          securityContext:
            allowPrivilegeEscalation: true
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            # www-data -> 101
            runAsUser: 101
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldpath: Metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldpath: Metadata.namespace
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
            - name: https
              containerPort: 443
              protocol: TCP
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 10
            successthreshold: 1
            timeoutSeconds: 10
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            periodSeconds: 10
            successthreshold: 1
            timeoutSeconds: 10
          lifecycle:
            preStop:
              exec:
                command:
                  - /wait-shutdown

要测试:我正在使用浏览器 API,--> new WebSocket('wss://mydomain.com')

似乎负载均衡器服务正在拒绝 wss 连接? 似乎无法弄清楚我错过了什么?请帮忙。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。