Ошибка при реализации Websocket в Azure Kubernetes Cluster Не работает - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь заставить службу websocket работать на Azure Kubernetes Cluster в среде нашей организации. В моей существующей среде также есть REST api и Angular приложение, работающее на входе с ssl. Но когда я добавил службу websocket на входе, она не работает.

Итак, я попытался использовать Azure Free Subscription для первой реализации того же БЕЗ SSL. Для своих приложений я включил маршрутизацию Http и использовал аннотацию addon-http-application-routing.

Я получаю сообщение об ошибке ниже. 'ws: //40.119.7.246/ws' не удалось: ошибка во время рукопожатия WebSocket: непредвиденный код ответа: 404

Пожалуйста, помогите в проверке, где я делаю неправильно?

Ниже приведена подробная информация о конфигурации.

Dockerfile

FROM node:alpine
WORKDIR /app
COPY package*.json /app/
RUN npm install

COPY ./ /app/
RUN npm run build

CMD ["node","./dist/server.js"]

EXPOSE 8010

socketserver.yaml - Содержит Demployment & Service.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: socketserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: socketserver
  template:
    metadata:
      labels:
        app: socketserver
    spec:
      containers:
      - name: socketserver
        image: regkompella.azurecr.io/socketserver:1.0.0
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 8010
      imagePullSecrets:
      - name: regkompella-azurecr-io
---
apiVersion: v1
kind: Service
metadata:
  name: socketserver-svc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8010
  selector:
    app: socketserver
  type: ClusterIP
---

ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    kubernetes.io/ingress.class: addon-http-application-routing
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET, PUT, POST, DELETE, OPTIONS"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: 10m
    nginx.ingress.kubernetes.io/websocket-services: socketserver-svc
    nginx.org/websocket-services: socketserver-svc
spec:
  rules:
  - host: demosocket.com
  - http:
      paths:
      - path: /
        backend:
          serviceName: angular-application-svc
          servicePort: 80
      - path: /ws
        backend:
          serviceName: socketserver-svc
          servicePort: 80

1 Ответ

2 голосов
/ 22 апреля 2020

После прочтения множества статей и ссылки на некоторые форумы github (добавлены ссылки на статьи ниже). Я дошел до того, что моя реализация websocket начала работать после выполнения двух вещей. Я еще не уверен, если это правильный способ сделать это или нет. Я добился этого решения исключительно методом следа и ошибки. Поэтому я прошу всех, у кого есть хороший gr asp, любезно предложить, если есть лучший способ решить мою проблему. Всегда делай мои шаги со щепоткой соли.

  1. Установлен NGINX Контроллер входа по ссылке .

Как я использую Azure Kubernetes Services, я применил приведенный ниже документ из документа.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml
Затем я внес необходимые изменения в свою конфигурацию демонстрационного входа для своих служб.

Я узнал, что kubernetes.io/ingress.class: addon-http-application-routing аннотация не поддерживает веб-сокетирование. Итак, пришлось его отключить.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    # this one annotation is making the websocket work.
    nginx.ingress.kubernetes.io/websocket-services: socketserver-svc

    # this one I left as-is. And not playing any role for this websocket 
    # implementation to work
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET, PUT, POST, DELETE, OPTIONS"

    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: 10m

    # I thought sticky session is also required for websocket to work. But seems 
    # this has no effect after I installed nginx ingress controller.
    # so disabled all the below annotations also.

    #nginx.org/websocket-services: socketserver-svc
    #nginx.ingress.kubernetes.io/affinity: cookie
    #nginx.ingress.kubernetes.io/affinity-mode: balanced
    #nginx.ingress.kubernetes.io/session-cookie-samesite: Strict
    #kubernetes.io/ingress.class: nginx
    #kubernetes.io/ingress.class: addon-http-application-routing

spec:
  rules:
  - host: demosocket.com
  - http:
      paths:
      - path: /ws
        backend:
          serviceName: socketserver-svc
          servicePort: 80
Я пытался получить доступ через IP-адрес publi c. И я могу успешно отправлять и получать сообщения.

ws: //52.188.38.118/ws

Теперь, что, если я хочу, чтобы реализация веб-сокета работала без установки? NGINX Ingress Controller (указан на шаге 1) и вы хотите попробовать использовать входной контроллер по умолчанию, поставляемый с AKS / minikube. Ответ ниже.

Из вышеприведенных шагов

a) Избегайте шага 1: Установка NGINX Ingress Controller.

b) Только изменения, которые необходимо выполнить на входе ниже. Используйте приведенные ниже аннотации вместо аннотаций, указанных на шаге 2 во входном файле yaml. Все начнет работать.

# this annotation is making my web application also work if I plan to configure something in future.
nginx.ingress.kubernetes.io/ingress.class: nginx

# this one annotation is making the websocket work.
nginx.ingress.kubernetes.io/websocket-services: socketserver-svc

# by default ssl is true - as I am trying locally and want to disable ssl-# redirect. So set this to false.
nginx.ingress.kubernetes.io/ssl-redirect: "false"

# Below are just additional annotation to allow CORS etc.
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, PUT, POST, DELETE, OPTIONS"
nginx.ingress.kubernetes.io/proxy-body-size: 10m

Ссылочные статьи:

  1. https://medium.com/flant-com/comparing-ingress-controllers-for-kubernetes-9b397483b46b

  2. https://kubernetes.github.io/ingress-nginx/deploy/#azure

  3. Г-н. Комментарии dstrebel -> https://github.com/Azure/AKS/issues/768

    Обычно я рекомендую просто установить Ingress Controller в кластере и не включать "http-application-routing", так как существует много ограничения к нему. Цель HTTP Application ROuting состояла в том, чтобы пользователи могли быстро настроить Ingress, но не для рабочих развертываний из-за ограничений конфигурации.

  4. DenisBiondi c прокомментировал 2 октября 2018 г. -> https://github.com/Azure/AKS/issues/672

    Я не уверен на 100%, поскольку не использую функцию маршрутизации приложений, но> думаю, что она не используется контроллер https://github.com/nginxinc/kubernetes-ingress/tree/master/examples/websocket, а точнее https://github.com/kubernetes/ingress-nginx. В последнем случае я думаю, что включения схожести сеанса с файлами cookie может быть достаточно: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#session -affinity

    В вашем случае вы используете неправильную аннотацию, которая не работает с маршрутизацией приложения входной контроллер под капотом.

Я приветствую предложения и лучшие практики.

...