Рукопожатие WebSocket: неожиданный код ответа: 400 в kubernetes-ingress - PullRequest
0 голосов
/ 26 сентября 2018

Возникла проблема при подключении к входу для службы веб-сокетов: ошибка при рукопожатии WebSocket: непредвиденный код ответа: 400

Ingress YAML

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: websocket-producer-cdph
spec:
  rules:
    host: some.domain.com
      http:
        paths:
          path: "/"
          backend:
            serviceName: websocket-producer-cdph
            servicePort: 8183
status:
loadBalancer:
ingress:
{}

Служба YAML

kind: Service
apiVersion: v1
metadata:
  name: websocket-producer-cdph
spec:
  ports:    
    name: ws
    protocol: TCP
    port: 8183
    targetPort: 8183
selector:
  app: websocket-producer-cdph
clusterIP: 10.100.254.99
type: ClusterIP
sessionAffinity: None
status:
loadBalancer:
{}

Когда я пытаюсь прослушать ws: //some.domain.com/ws, отображается ошибка во время рукопожатия WebSocket: Неожиданный код ответа: 400

/ ws - это путь

Но если пойти и обновить тип спецификации в сервисе до LoadBalancer, он сгенерирует IP 192.168.1.17:8183 и прослушит этот ws: //192.168.1.17:8183/ws он работает, но мне нужно предоставить URL-адрес с помощью входа, чтобы его можно было использовать за пределами сети.

Я использую следующий образ для контроллера входа:

quay.io / kubernetes-ingress-controller / nginx-ingress-controller: 0.19.0

Как создать вход для службы веб-сокетов?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Как указано в документации nginx-ingress , для прокси-трафика WebSocket следует использовать аннотацию с именем службы websocket.Не забудьте использовать кавычки:

nginx.org/websocket-services: "service1[,service2,...]"

В этом примере из документации WebSocket включен только для одной из трех служб (ws-svc):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    nginx.org/websocket-services: "ws-svc"
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
      - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80
      - path: /ws
        backend:
          serviceName: ws-svc
          servicePort: 8008
0 голосов
/ 01 января 2019

попробуйте добавить аннотацию nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_token"

https://github.com/kubernetes/ingress-nginx/issues/2097

0 голосов
/ 26 сентября 2018

Вы хотите добавить аннотацию nginx.org/websocket-services в определение входящего ресурса.Это, в свою очередь, говорит nginx о поддержке веб-сокетов (что, я думаю, связано с заголовками Upgrade / Connection?).

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: websocket-producer-cdph
  annotations:
    nginx.org/websocket-services: "websocket-producer-cdph"
spec:
  rules:
  - host: some.domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: websocket-producer-cdph
          servicePort: 8183
...