流量代理与网关
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-dashboard(virtual.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。
这就是平台的「
/backendURL 前缀」架构:浏览器侧 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命名空间,实际为monitoring(virtual.yaml:150-170,且install/kubernetes/prometheus/下各组件均部署在monitoring命名空间)。
/grafana、/labelstudio、/k8s/dashboard/*这几条都额外要求请求带myapp_usernamecookie(通过headers.cookie.regex校验),用于登录态透传。