Contour Websocket 注释不适用于 Ingress 资源

问题描述 投票:0回答:1

我的 Kubernetes 实例上设置了 Contour Ingress 控制器。我还根据 Contour 规范设置了 Ingress 资源和 HTTProxy 资源:

入口

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: common-api-ingress
  annotations:
    ingress.kubernetes.io/tls-minimum-version: "1.2"
spec:
  ingressClassName: contour
  tls:
  - hosts:
      - dev.mycompany.com
    secretName: dev.mycompany.com-tls
  rules:
  - host: dev.mycompany.com
    http:
      paths:       
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80       
      - path: /swagger
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

HTTP代理

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: signalr-proxy
spec:
  virtualhost:
    fqdn: dev.mycompany.com
    tls:
      secretName: dev.mycompany.com-tls
  routes:
    - conditions:
      - prefix: /api/notificationhub
      enableWebsockets: true # Setting this to true enables websocket for all paths that match /websocket
      services:
        - name: my-service
          port: 80

此配置按预期工作,当我打开 UI 的 Chrome 开发人员工具时,我在“控制台”选项卡上看到以下日志:

config vundefined loaded
main.56e2cc4e6f9f283a998a.js:2 [01-003] redirecting...
main.56e2cc4e6f9f283a998a.js:2 Connection to signalR has been established....
2.b4c26156c9f4449d4bbf.js:2 Resetting cache..

我决定放弃 Contour 的自定义 HTTPProxy 资源并保留普通的 Ingress 资源。为此,我删除了之前提供的 HTTPProxy 资源,并在 Ingress 资源上添加了启用 websocket 流量的注释。更新后的 Ingress 资源如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: common-api-ingress
  annotations:
    ingress.kubernetes.io/tls-minimum-version: "1.2"
    projectcontour.io/websocket-routes: /api/notificationhub/
spec:
  ingressClassName: contour
  tls:
  - hosts:
      - dev.mycompany.com
    secretName: dev.mycompany.com-tls
  rules:
  - host: dev.mycompany.com
    http:
      paths:       
      - path: /api/notificationhub/
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80       
      - path: /swagger
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

当我部署此更新时,我在 Chrome 开发者工具控制台中收到以下错误:

config vundefined loaded
main.56e2cc4e6f9f283a998a.js:2 [01-002] redirecting...
main.56e2cc4e6f9f283a998a.js:2 ERROR e
Wn @ main.56e2cc4e6f9f283a998a.js:2
main.56e2cc4e6f9f283a998a.js:2 Connection to signalR has been established....
api/UserSettings/:1     Failed to load resource: the server responded with a status of 405 ()
2.b4c26156c9f4449d4bbf.js:2 Resetting cache...

视觉:

Contour 部署具有以下一组 pod:

kubectl -n projectcontour get pods
NAME                                         READY   STATUS    RESTARTS       AGE
contour-controller-contour-b5d6fdxxx-xxxxx   1/1     Running   1 (3d1h ago)   112d
contour-controller-contour-b5d6fdxxx-xx8x8   1/1     Running   1 (17d ago)    150d
contour-controller-contour-b5d6fdxxx-xxxxx   1/1     Running   2 (3d1h ago)   150d
contour-controller-envoy-ncxxx               2/2     Running   0              10d
contour-controller-envoy-wcxxx               2/2     Running   0              150d
contour-controller-envoy-wxxxx             2/2     Running   0              150d
contour-controller-envoy-xkxxx               2/2     Running   2 (69d ago)    146d

但是我有另一个 Grafana 的 Ingress 资源,它使用 websockets 并且工作完美。下面提供了 Helm value.yaml 文件:

adminPassword: "*xxa]{xxxxxxxxxxx"
grafana.ini:
  server:
    root_url: https://dev.mycompany.com/-/grafana
    serve_from_sub_path: true
  smtp:
    enabled: true
    host: mail2.mycompany.com:25
    from_address: [email protected]
    skip_verify: true
ingress:
  enabled: true
  ingressClassName: contour
  annotations:
    projectcontour.io/websocket-routes: /-/grafana/
  hosts:
    - dev.mycompany.com
  path: /-/grafana/
  tls:
  - hosts:
      - dev.mycompany.com
    secretName: dev.mycompany.com-tls
persistence:
  enabled: true

我错过了什么?

websocket signalr kubernetes-ingress contour
1个回答
0
投票

我错误地配置了 websocket 路由。我所需要的只是为 websocket 路由本身添加一个单独的路径:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: common-api-ingress
  annotations:
    ingress.kubernetes.io/tls-minimum-version: "1.2"
    projectcontour.io/websocket-routes: /api/notificationhub
spec:
  ingressClassName: contour
  tls:
  - hosts:
      - dev.mycompany.com
    secretName: dev.mycompany.com-tls
  rules:
  - host: dev.mycompany.com
    http:
      paths: 
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80        
      - path: /api/notificationhub
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80       
      - path: /swagger
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80
© www.soinside.com 2019 - 2024. All rights reserved.