使用 RStudio 和 Shiny 的 HTTP 负载平衡入口设置 Kubernetes 集群会导致错误页面

Setting up a Kuberentes cluster with HTTP Load balancing ingress for RStudio and Shiny results in error pages

我正在尝试在 Google 运行 nginx、RStudio 服务器和两个 Shiny 应用程序的 Kubernetes Engine 上创建集群,遵循并调整 this guide

我有 4 个工作负载,它们在 UI 中都是绿色的,通过以下方式部署:

kubectl run nginx --image=nginx --port=80
kubectl run rstudio --image gcr.io/gcer-public/persistent-rstudio:latest --port 8787
kubectl run shiny1 --image gcr.io/gcer-public/shiny-googleauthrdemo:latest --port 3838
kubectl run shiny5 --image=flaviobarros/shiny-wordcloud --port=80

然后它们都通过以下方式公开为节点端口:

kubectl expose deployment nginx --target-port=80  --type=NodePort
kubectl expose deployment rstudio --target-port=8787  --type=NodePort
kubectl expose deployment shiny1 --target-port=3838  --type=NodePort
kubectl expose deployment shiny5 --target-port=80  --type=NodePort

..在UI.

里面都是绿色的

然后我部署了这个 Ingress 后端

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: r-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
      - path: /rstudio/
        backend:
          serviceName: rstudio
          servicePort: 8787
      - path: /shiny1/
        backend:
          serviceName: shiny1
          servicePort: 3838
      - path: /shiny5/
        backend:
          serviceName: shiny5
          servicePort: 80

结果是 nginx 路由工作得很好,我可以从家里看到 "Welcome to nginx" 网页,但我得到的其他三个路径:

RStudio 和 Shiny 工作负载在通过单个负载均衡器公开时均有效,分别映射到 8787 和 3838。

谁能指出我哪里出错了?

问题:

你遇到的最可能的问题是,当你使用这个入口时,你附加的 URI 与直接访问(/shiny1/ vs /)不同,所以你的应用程序丢失并且没有该 uri 的内容。

使用 Nginx Ingress Controller,您可以使用 ingress.kubernetes.io/rewrite-target: / 注释来缓解这种情况,并确保即使在入口路径中有子文件夹时也可以访问 /。

正如 Radek 所建议的,ingress.kubernetes.io/rewrite-target: / 是 re-write 您的请求所必需的。但是,GKE 入口控制器目前不支持此功能,这也是您收到 404 响应的原因。

相反,在 GKE 上,您必须使用 nginx ingress controller

然后您将能够为遵守重写规则的 rstudio 和闪亮图像配置入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: r-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: rstudio
          servicePort: 8787
        path: /rstudio/*
      - backend:
          serviceName: shiny1
          servicePort: 3838
        path: /shiny1/*
      - backend:
          serviceName: shiny5
          servicePort: 80
        path: /shiny5/*