模型 Web 应用
什么是 KServe 模型 Web 应用?
The KServe 模型 Web 应用 是 KServe 的一个组件,它提供了一种用户友好的方式来处理 Kubeflow 集群中 InferenceService
CR 的生命周期。这允许用户无需直接与 Kubernetes 资源交互即可创建、删除和检查其模型服务器的状态。
作为 Kubeflow 的一部分安装
自 Kubeflow 1.5 版本发布以来,该 Web 应用已 包含在 kubeflow/manifests
中。
默认情况下,它在 Kubeflow 中央仪表盘中作为菜单链接暴露。
独立安装
请参考 kserve/models-web-app
仓库获取独立安装说明。
在这种情况下,Web 应用的所有资源将安装在 kserve
命名空间中。用户可以通过 knative-ingress-gateway.knative-serving
Istio Ingress Gateway 访问 Web 应用,或者通过端口转发后端进行访问。
要端口转发后端,您可以使用以下命令
# set the following ENV vars in the app's Deployment
kubectl edit -n kserve deployments.apps kserve-models-web-app
# APP_PREFIX: /
# APP_DISABLE_AUTH: "True"
# APP_SECURE_COOKIES: "False"
# expose the app under localhost:5000
kubectl port-forward -n kserve svc/kserve-models-web-app 5000:80
以下是可以配置应用程序不同方面的环境变量列表。
环境变量 | 默认值 | 描述 |
---|---|---|
APP_PREFIX | “/models” | 通过设置 base-url 元素控制应用的路径前缀 |
APP_DISABLE_AUTH | “False” | 控制应用是否应使用 SubjectAccessReviews 来确保用户有权执行操作 |
APP_SECURE_COOKIES | “True” | 控制应用是否应使用 安全 (Secure) CSRF cookie。默认情况下,应用期望通过 https 暴露。 |
CSRF_SAMESITE | “Strict” | 控制 CSRF cookie 的 SameSite 值 |
USERID_HEADER | “kubeflow-userid” | 每个请求中包含登录用户名的头部 |
USERID_PREFIX | "" | 从 USERID_HEADER 值中移除的前缀,用于提取登录用户名 |
用法
该 Web 应用当前支持 InferenceService
对象的 v1beta1
版本。
Web 应用暴露了来自底层 Knative 资源的信息,例如来自 Knative Configuration、Route 和 Revision 的 Conditions,以及来自模型服务器 Pod 的实时日志。
列出
应用主页提供了所选命名空间中部署的所有 InferenceService 的列表。前端定期轮询后端以获取 InferenceService 的最新状态。
创建
创建新 InferenceService 的页面。用户可以粘贴希望创建的 InferenceService 的 YAML 对象。
请注意,后端将覆盖提交对象的 .metadata.namespace
字段,以防止用户尝试在其他命名空间中创建 InferenceService。
删除
用户可以通过在列出所有命名空间资源的主页面上点击 InferenceService 旁边的 图标来删除现有 InferenceService。
注意
删除 InferenceService 时,后端使用前台级联删除 (foreground cascading deletion)。这意味着只有在底层资源被删除后,InferenceService CR 才会从 K8s API Server 中删除。检查
用户可以从主页面点击 InferenceService 的名称,查看该 CR 状态的更详细摘要。
注意
为了收集日志,后端将
- 过滤所有具有
serving.knative.dev/revision
标签的 Pod - 获取
kserve-container
的日志
指标
如上所述,Web 应用允许用户检查 InferenceService 的指标。默认情况下此标签页不会启用。要启用它,用户需要安装 Grafana 和 Prometheus。
目前,前端期望在 /grafana
路径前缀下找到 Grafana。这个 Grafana 实例需要有特定的仪表盘,以便应用能够将它们嵌入到 iframes 中。我们正在努力使其更加通用,以便人们能够暴露自己的图表。
您可以安装 Grafana 和 Prometheus,供 Web 应用使用,通过安装
- 来自 Knative 0.18 版本的
monitoring-core.yaml
和monitoring-metrics-prometheus.yaml
文件 - 以下 yaml 文件用于在集群外部暴露 Grafana,通过允许匿名访问
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-custom-config
namespace: knative-monitoring
labels:
serving.knative.dev/release: "v0.11.0"
data:
custom.ini: |
# You can customize Grafana via changing the context of this field.
[auth.anonymous]
# enable anonymous access
enabled = true
[security]
allow_embedding = true
[server]
root_url = "/grafana"
serve_from_sub_path = true
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: grafana
namespace: knative-monitoring
spec:
gateways:
- kubeflow/kubeflow-gateway
hosts:
- '*'
http:
- match:
- uri:
prefix: /grafana/
route:
- destination:
host: grafana.knative-monitoring.svc.cluster.local
port:
number: 30802
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: models-web-app
namespace: kubeflow
spec:
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account
selector:
matchLabels:
kustomize.component: kserve-models-web-app
app.kubernetes.io/component: kserve-models-web-app
注意
如果您以独立模式安装了应用,则需要转而使用 knative-serving/knative-ingress-gateway Ingress Gateway,并将 AuthorizationPolicy 部署到 kserve 命名空间中。根据您的安装模式应用这些 YAML 文件,并确保 Grafana 实例暴露在 /grafana
下,Web 应用将显示 指标
标签页。
架构
Web 应用包含以下资源
- 一个
Deployment
,用于运行后端服务器并提供静态前端文件 - 一个
Service
,用于配置集群内网络流量 - 一个
ServiceAccount
和ClusterRole{Binding}
,用于授予 Web 应用 Pod 所需的权限 - 一个
VirtualService
,用于通过集群的 Istio Ingress Gateway 暴露应用
SubjectAccessReviews
Web 应用具有执行身份验证和授权检查的机制,以确保用户操作符合集群的 RBAC,此机制仅在应用的 kubeflow manifests 中启用。可以通过利用 APP_DISABLE_AUTH: "True" | "False"
环境变量来切换此机制。
此机制仅在 kubeflow manifests 中启用,因为在 Kubeflow 安装中,到达 Web 应用 Pod 的所有请求也将包含一个表示用户的自定义头部。在 Kubeflow 安装中,集群前面有一个身份验证组件,确保只有登录用户才能访问集群服务。在独立模式下,此类组件可能并未部署。
Web 应用将使用此自定义头部的值来提取发起请求的 K8s 用户名称。然后它将创建一个 SubjectAccessReview 来检查用户是否具有执行特定操作的权限,例如在某个命名空间中删除 InferenceService。
提示
如果您通过 kubectl port-forward 进行端口转发,则需要在 Web 应用的 Deployment 中设置 APP_DISABLE_AUTH=“True”。进行端口转发时,身份验证头部不会设置,这将导致 Web 应用出现 401 错误。命名空间选择
在独立和kubeflow设置中,用户都需要能够选择一个命名空间才能与其中的 InferenceServices 交互。
在独立模式下,Web 应用会显示一个下拉菜单,向用户展示所有命名空间并允许他们选择其中任何一个。后端会向 API Server 发出 LIST 请求以获取所有命名空间。在这种情况下,唯一的授权检查发生在 K8s API Server 中,确保 Web 应用 Pod 的 ServiceAccount 具有列出命名空间的权限。
在kubeflow模式下,中央仪表盘负责命名空间选择。一旦用户选择一个命名空间,仪表盘将通知嵌入式的 Models Web 应用关于新选择的命名空间。在此模式下,Models Web 应用本身不会暴露下拉式命名空间选择器。