Посол дает 403 попытки подключиться к Websocket - PullRequest
0 голосов
/ 07 августа 2020

Посол выдает ошибку 403 при попытке доступа к конечной точке веб-сокета в кластере. Вот шаги для воссоздания проблемы:

[Kube Environment: Docker для настольных компьютеров на Mac]

Установите Ambassador и Echo Service

  1. Развернуть Амбассадор с Шлем
helm repo add datawire https://getambassador.io
helm install ambassador datawire/ambassador
Развертывание развертывания / службы / сопоставления эха веб-сокета
---
apiVersion: v1
kind: Service
metadata:
  name: websocket-echo
  namespace: default
spec:
  ports:
    - name: http
      port: 80
      targetPort: 8080
  selector:
    app: websocket-echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: websocket-echo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: websocket-echo
  template:
    metadata:
      labels:
        app: websocket-echo
    spec:
      containers:
        - name: backend
          image: jmalloc/echo-server
          ports:
            - name: http
              containerPort: 8080
---
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
  name: websocket-echo
  namespace: default
spec:
  prefix: /websocket/
  service: websocket-echo
  allow_upgrade:
  - websocket

✅ Убедитесь, что эхо-сервер доступен из модуля в кластере

  1. Создание оболочки узла в кластере
kubectl run my-shell --rm -i --tty --image node:12 -- bash
В оболочке скачать wscat
npm i -g wscat
В оболочке подключиться к службе через конечную точку службы кластера
wscat -c websocket-echo.default.svc.cluster.local
Убедитесь, что соединение установлено и сообщения могут быть отправлены эхом

❌ Убедитесь, что эхо-сервер недоступен извне кластера

  1. Установите wscat на локальном компьютере
npm i -g wscat
Используя wscat, подключитесь к сервису с помощью сопоставления
wscat -c localhost/websocket-echo/
Убедитесь, что возвращенная ошибка: error: Unexpected server response: 403

Я упустил что-то простое?

1 Ответ

1 голос
/ 07 августа 2020

Амбассадор будет перенаправлять входящий запрос с http на https.

Вы можете проверить по

$ curl localhost/websocket/ -v
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 80 (#0)
> GET /websocket/ HTTP/1.1
> Host: localhost
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< location: https://localhost/websocket/
< date: Fri, 07 Aug 2020 08:25:38 GMT
< server: envoy
< content-length: 0
< 
* Connection #0 to host localhost left intact

Итак, вам нужно будет добавить эту конфигурацию, чтобы отключить перенаправление на localhost

apiVersion: getambassador.io/v2
kind: Host
metadata:
  name: localhost
  namespace: default
spec:
  hostname: localhost
  acmeProvider:
    authority: none
  requestPolicy:
    insecure:
      action: Route

Ссылка

...