Рукопожатие WebSocket: неожиданный код ответа: 400 в kubernetes-ingress

Столкновение с этой проблемой, если я подключаюсь к входу для службы веб-сокетов, не удалось: ошибка во время рукопожатия 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

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


person Kartik Purohit    schedule 26.09.2018    source источник
comment
Вы когда-нибудь это решали?   -  person musicformellons    schedule 19.12.2018


Ответы (3)


Как указано в документации по 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
person VASャ    schedule 27.09.2018
comment
Это репо предоставляет реализацию контроллера Ingress для NGINX и NGINX Plus. Эта реализация отличается от контроллера NGINX Ingress в репозитории kubernetes / ingress-nginx. См. Этот документ, чтобы узнать об основных различиях. [github.com/nginxinc/kubernetes- ingress / blob / master / docs / Я использую репозиторий kubernetes / ingress-nginx [github.com/kubernetes/ingress-nginx] В [github .com / nginxinc / kubernetes-ingress], readme.md они ЯВНО заявили, ОБЕ КОНТРОЛЛЕРЫ РАЗНЫЕ. - person Kartik Purohit; 27.09.2018
comment
Спасибо за информацию. Ваши ссылки были очень полезны. Не могли бы вы проверить содержимое файла ingress-controller /etc/nginx.conf на наличие следующих строк в расположении службы? ‹Proxy_set_header Upgrade $ http_upgrade;› и ‹proxy_set_header Connection $ connection_upgrade;› Я считаю, что они должны присутствовать для включения функциональности WebSocket для бэкэнда. - person VASャ; 27.09.2018
comment
# Pass the extracted client certificate to the backend # Allow websocket connections proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header X-Request-ID $req_id; proxy_set_header X-Real-IP $the_real_ip; Проверил там - person Kartik Purohit; 01.10.2018
comment
Не могу сказать больше, не увидев весь nginx.conf из вашего входящего контроллера. Не могли бы вы загрузить его на github и дать ссылку? - person VASャ; 11.10.2018

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

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

person leonzhao    schedule 01.01.2019

Вы хотите добавить аннотацию 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
person samhain1138    schedule 26.09.2018
comment
`kind: Ingress apiVersion: extensions / v1beta1 metadata: name: websocket-продюсер-3tlb пространство имен: аннотации dpqa: nginx.org/websocket-services: websocket-продюсер-3tlb spec: rules: - host: some.domain.com http: paths: - path: / backend: serviceName: websocket-продюсер-3tlb servicePort: 8183 status: loadBalancer: ingress: - {} `Пробовал это все еще не может слушать, то же самое исключение рукопожатия приближается И эта аннотация для nginx-ingress и я использую Kubernetes-Ingress - person Kartik Purohit; 26.09.2018