【问题标题】:Ambassador Gives 403 Trying to Connect to Websocket大使给出 403 尝试连接到 Websocket
【发布时间】:2020-11-27 04:55:09
【问题描述】:

Ambassador 在尝试访问集群内的 websocket 端点时抛出 403。以下是重现问题的步骤:

[Kube 环境:Mac 上的 Docker for Desktop]

安装大使和 Echo 服务

  1. 使用 Helm 部署大使
helm repo add datawire https://getambassador.io
helm install ambassador datawire/ambassador
  1. 部署 websocket echo 部署/服务/映射
---
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

✅验证可以从集群中的 pod 访问 echo 服务器

  1. 在集群上创建节点外壳
kubectl run my-shell --rm -i --tty --image node:12 -- bash
  1. 在shell中,下载wscat
npm i -g wscat
  1. 在 shell 中,通过集群服务端点连接到服务
wscat -c websocket-echo.default.svc.cluster.local
  1. 验证连接是否已建立,并且可以回显消息

❌验证无法从集群外部访问 echo 服务器

  1. 在本地机器上安装wscat
npm i -g wscat
  1. 使用 wscat,使用映射连接到服务
wscat -c localhost/websocket-echo/
  1. 验证返回的错误是error: Unexpected server response: 403

我错过了一些简单的东西吗?

【问题讨论】:

  • 80 端口供集群使用,可以使用 kubectl portforward 或尝试 Nodeport 服务类型,然后使用 localhost:Nodeport 访问
  • 他正在使用Docker for Desktop on Mac。因此,可以localhost[:80]

标签: kubernetes aws-api-gateway ambassador


【解决方案1】:

Ambassador 会将传入的请求从 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

参考

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多