@nano_e_t_4

Как пробросить вебсокет через ингрес?

Всем привет. При переносе мс-ов в кубер столкнулся с такой проблемой: nginx ingress (предположитеьно) рвет socket.io сессию с мс-ом на го.

Что происходит:
На домен k8s.my-domain.com приходит запрос на локейшн /socket.io/. Бэк этот запрос обрабатывает создает socket.io коннект, и отправляет назад на ингресс валидные данные (они отображаются на фронтовой страничке). но далее сокетные пинги не проходят и бэк говорит что таймаут при попытке отдать данные на ингресовый нджинкс. Почему происходит такая ситуаций, понять не могу. Если кто то сталкивался или знает в чем дело, подсобите пожалуйста

пробовал играть с Session Affinity на стороне бэка, одно что таймауты

ingress вот этот

сокет ио вот этот

Детализация:

ingress NodePort

конфигурация ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
metadata:
  name: ms-frontend
  namespace: awesomeNS
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "route"
    nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
    nginx.ingress.kubernetes.io/websocket-services: ms-backend
    nginx.org/websocket-services: ms-backend
    nginx.org/server-snippets: |
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;
      proxy_set_header HTTPS $https;
      proxy_http_version 1.1;
      proxy_read_timeout         600s;
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "upgrade";

spec:
  rules:
  - host: k8s.my-domain.com
    http:
      paths:
      - path: /
        backend:
          serviceName: ms-frontend
          servicePort: 80
      - path: /socket.io/
        backend:
          serviceName: ms-backend
          servicePort: 4400


**Лог бэкэнда**:
{"level":"debug","ts":1613842562.1601045,"caller":"sioconnector/sioconnector.go:47","msg":"client connected:","id":"b"}
{"level":"debug","ts":1613842622.160182,"caller":"sioconnector/sioconnector.go:52","msg":"client error:","error":"write tcp 10.back-ip-address:4400->10.ingress-ip-address:39470: i/o timeout"}
{"level":"debug","ts":1613842622.160477,"caller":"sioconnector/sioconnector.go:52","msg":"client error:","error":"write tcp 10.back-ip-address:4400->10.ingress-ip-address:39470: i/o timeout"}
{"level":"debug","ts":1613842622.160499,"caller":"sioconnector/sioconnector.go:52","msg":"client error:","error":"write tcp 10.back-ip-address:4400->10.ingress-ip-address:39470: i/o timeout"}
{"level":"debug","ts":1613842622.1605527,"caller":"sioconnector/sioconnector.go:56","msg":"client connected:","id":"b","reason":"client namespace disconnect"}

{"level":"debug","ts":1613842645.158182,"caller":"sioconnector/sioconnector.go:47","msg":"client connected:","id":"c"}
{"level":"debug","ts":1613842705.159041,"caller":"sioconnector/sioconnector.go:52","msg":"client error:","error":"write tcp 10.back-ip-address:4400->10.ingress-ip-address:39598: i/o timeout"}
{"level":"debug","ts":1613842705.1603222,"caller":"sioconnector/sioconnector.go:52","msg":"client error:","error":"write tcp 10.back-ip-address:4400->10.ingress-ip-address:39598: i/o timeout"}
{"level":"debug","ts":1613842705.160439,"caller":"sioconnector/sioconnector.go:52","msg":"client error:","error":"write tcp 10.back-ip-address:4400->10.ingress-ip-address:39598: i/o timeout"}
{"level":"debug","ts":1613842705.1612012,"caller":"sioconnector/sioconnector.go:52","msg":"client error:","error":"write tcp 10.back-ip-address:4400->10.ingress-ip-address:39598: i/o timeout"}
{"level":"debug","ts":1613842705.1615343,"caller":"sioconnector/sioconnector.go:56","msg":"client connected:","id":"c","reason":"client namespace disconnect"}


конфигурация сервиса бэка:

Name:                     ms-backend
Namespace:                awesomeNS
Labels:                   app.kubernetes.io/instance=ms-backend
                          app.kubernetes.io/managed-by=Helm
                          app.kubernetes.io/name=ms-backend
                          app.kubernetes.io/version=1.0.1
                          helm.sh/chart=ms-backend-0.1.0
Annotations:              meta.helm.sh/release-name: ms-backend
                          meta.helm.sh/release-namespace: default
Selector:                 app.kubernetes.io/instance=ms-backend,app.kubernetes.io/name=ms-backend
Type:                     NodePort
IP:                       10.0.0.10
Port:                     http  4400/TCP
TargetPort:               http/TCP
NodePort:                 http  30335/TCP
Endpoints:                back-ip-address:4400
Session Affinity:         ClientIP
External Traffic Policy:  Cluster
Events:                   <none>
  • Вопрос задан
  • 3741 просмотр
Пригласить эксперта
Ответы на вопрос 1
@q2digger
никого не трогаю, починяю примус
Привет, я с такой бедой не сталкивался, но вот тут есть описание похожей проблемы
https://github.com/kubernetes/ingress-nginx/issues/3746
и строчка в документации которая относится к этому
https://kubernetes.github.io/ingress-nginx/user-gu...
там сказано
If the NGINX ingress controller is exposed with a service type=LoadBalancer make sure the protocol between the loadbalancer and NGINX is TCP.

просто проверьте, как оно указано в деплойменте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы