使用 GraphQL 的 AKS 上的 Websocket 未连接

Posted

技术标签:

【中文标题】使用 GraphQL 的 AKS 上的 Websocket 未连接【英文标题】:Websockets on AKS using GraphQL Not Connecting 【发布时间】:2019-10-31 06:19:56 【问题描述】:

我目前有一个运行 GraphQL 服务器和正常 nginx 入口的 AKS 集群设置。我们正在尝试加入使用 Websocket 的 GraphQL 订阅。 GraphQL 用于 websocket 的 URL 与用于 GraphQL 查询的 URL 相同。我们尝试添加代理配置以启用 websocket 入口,但从未建立连接。在没有 Kubernetes 的情况下运行 GraphQL 服务器是成功的,所以我们认为这里有一些特定于 kubernetes 的事情……有人在这方面取得过成功吗?下面的相关入口配置

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-ingress
  namespace: web
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/affinity: cookie
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
    nginx.ingress.kubernetes.io/configuration-snippet: |
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
spec:
  tls:
  - hosts:
    - my.host
    - my-api.host
    secretName: tls-secret
  rules:
  - host: my.host
    http:
      paths:
      - path: /graphql
        backend:
          serviceName: webapi
          servicePort: 80
      - path: /(.*)
        backend:
          serviceName: website
          servicePort: 80
  - host: my-api.host
    http:
      paths:
      - backend:
          serviceName: webapi
          servicePort: 80
        path: /(.*)

【问题讨论】:

你检查过来自 Nginx Ingress 控制器的日志吗?那里有任何可疑记录吗? 我也遇到了同样的问题,你有解决办法吗? 【参考方案1】:

您可能希望从一个不太复杂的配置开始,如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-ingress
  namespace: web
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt
    ingress.kubernetes.io/ssl-redirect: "true"
    kubernetes.io/tls-acme: "true"
spec:
  tls:
  - hosts:
    - my.host
    secretName: tls-secret
  rules:
  - host: my.host
    http:
      paths:
      - path: /
        backend:
          serviceName: website
          servicePort: 80
      - path: /graphql
        backend:
          serviceName: webapi
          servicePort: 80

我将配置切换到一个端点而不是两个端点。由于 NGINX 开箱即用地处理 websocket,因此删除了一些配置。我删除了正则表达式。我添加了 tls-acme 注释。还有 ssl 重定向。总之,我只是让它变得不那么复杂。首先启动并运行它,然后开始应用高级配置内容,例如您所做的超时。

很高兴听到对此的任何反馈!

【讨论】:

以上是关于使用 GraphQL 的 AKS 上的 Websocket 未连接的主要内容,如果未能解决你的问题,请参考以下文章

AKS初体验:登录到node节点的几种方式

无法从连接到 Azure *** 的本地计算机(在家庭网络上)访问专用 AKS 群集

模拟 AKS 中的应用程序和 Azure 中的 PostgreSQL 服务器之间的网络延迟

使用 AKS 管理容器时的问题

将 azurerm_application_gateway 与 AKS 与 terraform 集成

是否可以将完整的 Uris 映射到不同的服务?