流量代理与网关

想搞清楚平台对外只有一个 istio 网关入口、各功能(前端/后端/grafana/notebook/aihub/标注/k8s dashboard)分别走哪个路径前缀、以及 /backend URL 前缀如何工作时阅读。

01-架构原理 / 网络入口
流量代理网关gatewayistioingressgatewayistio-ingressgatewayVirtualServicevirtual.yamlgateway.yaml路径前缀path prefix/backend/frontend/staticgrafanalabelstudio

流量代理与网关

CubeStudio 对外统一通过 istio ingress gateway 暴露服务:浏览器侧所有请求都打到网关的 80 端口,再由网关按 URL 路径前缀分发到各命名空间的后端服务。

流量入口(Gateway)

  • 网关资源 kubeflow-gateway 定义在 kubeflow 命名空间,通过 selector: istio: ingressgateway 绑定到 istio ingress gateway 的 Pod,开放 80 端口(HTTP)。源码见 install/kubernetes/gateway.yaml
  • gateway.yaml 决定哪些流量可以进来(监听端口、host);virtual.yaml(VirtualService)决定进来的流量如何分发到后端服务。源码见 install/kubernetes/virtual.yaml
  • 仓库另带一份 ingress gateway 的安装清单 install/kubernetes/istio/istio-gateway.yaml,把网关 Pod 部署到 istio-ingress 命名空间,Service 类型为 LoadBalancer、保留客户端源 IP(externalTrafficPolicy: Local)、对外暴露 80 / 443 端口。

注意:gateway.yaml 的 Gateway 选择器是 istio: ingressgateway(见 install/kubernetes/gateway.yaml:9),而 install/kubernetes/istio/istio-gateway.yaml 部署的网关 Pod label 是 istio: ingress、命名空间 istio-ingress(见该文件 :86,108)。两者 label 不一致,实际生效的入口网关 Pod 取决于集群里到底装了哪个网关,请按部署实际确认。

入口白名单与 /backend URL 前缀

主入口的 VirtualService infra-kubeflow-dashboardvirtual.yaml:1-27)的 match 声明了 /backend/frontend/static 三个前缀,外加一条兜底 prefix: /virtual.yaml:14-22),全部路由到前端服务 kubeflow-dashboard-frontend.infra:80

  • /backend —— 所有后端接口(前端 nginx 会 strip 掉 /backend 前缀,再转发给根路径上的 Flask 后端)。
  • /frontend —— 前端 SPA。
  • /static —— 静态资源。

根路径 / 也被 match 命中:除上面三个前缀外还有一条兜底 prefix: /virtual.yaml:21-22),会把根路径及其余未被本网关其它 VirtualService 匹配的路径都路由到前端服务 kubeflow-dashboard-frontend.infra:80

这就是平台的「/backend URL 前缀」架构:浏览器侧 URL 带 /backend 前缀经 istio → 前端 nginx,nginx strip 掉前缀后转发给运行在根路径的后端;服务间直连后端(如 kubeflow-dashboard.infra)则不带前缀。后端框架细节见 06-二次开发 段。

注意:文件内注释(virtual.yaml:12-13)写的是「不放开 /、其余路径返回 404」,与 match 里实际多出的兜底 prefix: / 不一致——按当前配置根路径会被路由到 kubeflow-dashboard-frontend,再由前端 nginx 按 /backend 等前缀转发到后端。实际生效行为以你部署的 virtual.yaml 为准。

路径前缀代理对照表

下表分两类:一类是 virtual.yaml 里静态声明的 VirtualService;另一类是后端在部署 notebook / aihub 应用时动态创建的 VirtualService。

路径前缀 命名空间 目标服务 (端口) 来源 备注
/backend/frontend/static infra kubeflow-dashboard-frontend (80) virtual.yaml 静态 平台前端/后端统一入口;/backend 被 nginx strip
/grafana/ monitoring grafana (8080) virtual.yaml 静态 rewrite 到 /,需带 myapp_username cookie
/k8s/dashboard/cluster/ kube-system kubernetes-dashboard-cluster (9090) virtual.yaml 静态 高权限 k8s dashboard,rewrite 到 /,需 cookie
/k8s/dashboard/user1/ kube-system kubernetes-dashboard-user1 (9090) virtual.yaml 静态 低权限 k8s dashboard,rewrite 到 /,需 cookie
/labelstudio/ kubeflow labelstudio (8080) virtual.yaml 静态 标注平台,rewrite 到 /labelstudio/,需 cookie
/notebook/jupyter/$name/ jupyter 对应 notebook 应用 后端动态创建 每个 notebook 部署时建一个 VirtualService(myapp/views/view_notebook.py:497-514
/aihub/$name(app1 为 /aihub/ aihub 对应 aihub 应用 后端动态创建 aihub 应用部署时创建(myapp/views/view_aihub.py:934-961
/gradio/aihub/$name/ aihub 对应 aihub gradio 应用 后端动态创建 同上,gradio 界面入口

校正说明:原文档把 grafana 标在 prometheus 命名空间,实际为 monitoringvirtual.yaml:150-170,且 install/kubernetes/prometheus/ 下各组件均部署在 monitoring 命名空间)。

/grafana/labelstudio/k8s/dashboard/* 这几条都额外要求请求带 myapp_username cookie(通过 headers.cookie.regex 校验),用于登录态透传。

相关阅读

最后更新 2026-07-04完整文档以官方仓库为准:GitHub Wiki