流量代理与网关
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-19,命名空间 infra)只有一条兜底 match:prefix: /,把所有未被其它 VirtualService 命中的路径统一路由到前端服务 kubeflow-dashboard-frontend.infra:80(virtual.yaml:12-19)。也就是说 istio 层不区分 /backend、/frontend、/static,统一交给前端 nginx,再由 nginx 内部按前缀分发:
/backend—— 所有后端接口(前端 nginx 会 strip 掉/backend前缀,再转发给根路径上的 Flask 后端)。/frontend—— 前端 SPA。/static—— 静态资源。
这就是平台的「
/backendURL 前缀」架构:浏览器侧 URL 带/backend前缀经 istio → 前端 nginx,nginx strip 掉前缀后转发给运行在根路径的后端;服务间直连后端(如kubeflow-dashboard.infra)则不带前缀。istio 网关只负责"把流量放进来、按大前缀 / 命名空间分发",细粒度的/backend前缀 strip 与分发在前端 nginx 完成。后端框架细节见 06-二次开发 段。
路径前缀代理对照表
下表分两类:一类是 virtual.yaml 里静态声明的 VirtualService;另一类是后端在部署 notebook / aihub 应用时动态创建的 VirtualService。
| 路径前缀 | 命名空间 | 目标服务 (端口) | 来源 | 备注 |
|---|---|---|---|---|
/(兜底) |
infra | kubeflow-dashboard-frontend (80) | virtual.yaml 静态 |
平台前端/后端统一入口;/backend、/frontend、/static 由前端 nginx 内部分发,/backend 被 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:937-970) |
/gradio/aihub/$name/ |
aihub | 对应 aihub gradio 应用 | 后端动态创建 | 同上,gradio 界面入口 |
说明:grafana 部署在
monitoring命名空间(virtual.yaml:141-164,且install/kubernetes/prometheus/下各组件均部署在monitoring命名空间)。
/grafana、/labelstudio、/k8s/dashboard/*这几条都额外要求请求带myapp_usernamecookie(通过headers.cookie.regex校验),用于登录态透传。