自定义仪表板
如何自定义 Kubeflow 中央仪表板?
Kubeflow 中央仪表板提供了一种自定义菜单项和集成第三方应用的方式。
例如,下图显示了带有一个自定义“我的应用”菜单项的 Kubeflow 中央仪表板
中央仪表板 ConfigMap
Kubeflow 中央仪表板使用 Kubernetes ConfigMap 进行配置。
central-dashboard Deployment 上的 CD_CONFIGMAP_NAME
环境变量指定 ConfigMap 的名称(默认为 centraldashboard-config
)。
您可以在以下位置找到 ConfigMap 的示例
外部链接
ConfigMap 的 externalLinks
部分在侧边栏中添加外部网站(未托管在 Kubernetes 集群上)的链接。
externalLinks
的每个元素都是一个 JSON 对象,包含以下字段
type
:必须设置为"item"
iframe
:必须设置为false
text
:要显示的链接文本link
:点击链接时要打开的 URLicon
:要为链接显示的 iron-icon 名称。- 注意,您必须排除
icons:
前缀 - 例如,要使用
icons:launch
,您将设置"launch"
- 例如,要使用
social:mood
,您将设置"social:mood"
- 注意,您必须排除
例如,下面的 ConfigMap 添加了一个指向 Kubeflow 网站的链接
apiVersion: v1
kind: ConfigMap
metadata:
name: centraldashboard-config
namespace: kubeflow
data:
settings: |-
...
links: |-
{
"menuLinks": [
...
],
"externalLinks": [
{
"type": "item",
"iframe": false,
"text": "Kubeflow Website",
"link": "https://kubeflow.org.cn/",
"icon": "launch"
}
],
"quickLinks": [
...
],
"documentationItems": [
...
]
}
文档链接
ConfigMap 的 documentationItems
部分在主页的“文档”部分添加链接。
documentationItems
的每个元素都是一个 JSON 对象,包含以下字段
text
:要显示的链接文本desc
:在链接下方显示的描述link
:点击链接时要打开的 URL
例如,下面的 ConfigMap 添加了一个指向 Kubeflow 网站文档的链接
apiVersion: v1
kind: ConfigMap
metadata:
name: centraldashboard-config
namespace: kubeflow
data:
settings: |-
...
links: |-
{
"menuLinks": [
...
],
"externalLinks": [
...
],
"quickLinks": [
...
],
"documentationItems": [
{
"text": "Kubeflow Website",
"desc": "Kubeflow website documentation",
"link": "https://kubeflow.org.cn/docs/"
}
]
}
集群内链接
创建 VirtualService
如果您在集群上运行非 Kubeflow 应用,可以通过在 Kubeflow Istio Gateway 上创建 VirtualService
将其暴露出来。为此,您的应用必须注入 Istio sidecar 并作为 Kubernetes Service 暴露。
例如,下面的 VirtualService
将 my-namespace
命名空间中的 Service/my-app
暴露在 Kubeflow Istio Gateway 的 /my-app/
路径下
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-custom-app
namespace: <MY_APP_NAMESPACE>
spec:
gateways:
## the istio gateway which is serving kubeflow
## TEMPLATE: <KUBEFLOW_GATEWAY_NAMESPACE>/<KUBEFLOW_GATEWAY_NAME>
- kubeflow/kubeflow-gateway
hosts:
- '*'
http:
- headers:
request:
add:
x-forwarded-prefix: /my-app
match:
- uri:
prefix: /my-app/
rewrite:
uri: /
route:
- destination:
host: <MY_APP_SERVICE_NAME>.<MY_APP_NAMESPACE>.svc.cluster.local
port:
number: 80
创建此 VirtualService
应该会使应用程序在 Kubeflow Istio Gateway 的 /_/my-app/
路径下可用。
http(s)://<KUBEFLOW_ISTIO_GATEWAY>/_/my-app/
UserID 头部认证
对应用程序的每个请求都将带有一个名为 kubeflow-userid
的头部,其中包含用户的电子邮件地址,可用于认证。
为确保此头部不被伪造,应确保应用程序只能从 Kubeflow Istio Gateway 访问。这可以通过以下方式实现
- 创建一个 ALLOW
AuthorizationPolicy
,要求from[].source[].principals[]
为cluster.local/ns/<ISTIO_GATEWAY_NAMESPACE>/sa/<ISTIO_GATEWAY_SERVICE_ACCOUNT>
- 通过使用
DestinationRule
并将trafficPolicy.tls.mode
设置为ISTIO_MUTUAL
来阻止 sidecar 之外的流量,以保护支持应用程序的Service
添加集群内链接
ConfigMap 的 menuLinks
部分在侧边栏中添加集群内应用程序的链接。
menuLinks
的每个元素都是一个 JSON 对象,包含以下字段
type
:必须设置为"item"
link
:点击链接时打开的路径text
:要显示的链接文本icon
:要为链接显示的 iron-icon 名称。- 注意,您必须排除
icons:
前缀 - 例如,要使用
icons:launch
,您将设置"launch"
- 例如,要使用
social:mood
,您将设置"social:mood"
- 注意,您必须排除
例如,下面的 ConfigMap 添加了上面提到的“我的应用”应用程序
apiVersion: v1
kind: ConfigMap
metadata:
name: centraldashboard-config
namespace: kubeflow
data:
settings: |-
...
links: |-
{
"menuLinks": [
...
{
"type": "item",
"link": "/my-app/",
"text": "My App",
"icon": "social:mood"
},
...
],
"externalLinks": [
...
],
"quickLinks": [
...
],
"documentationItems": [
...
]
}
命名空间的应用
如果您的应用程序在每个配置文件命名空间中都有实例,您可以在 link
字段中使用 {ns}
动态地将当前活动的配置文件命名空间插入到链接中。
例如,如果您的应用程序在 profile1
命名空间中有一个实例,在 profile2
命名空间中也有一个实例。您可以配置您的 VirtualService
,将应用程序暴露在 /my-app/{ns}/
路径下
http(s)://<KUBEFLOW_ISTIO_GATEWAY>/_/my-app/profile1/
http(s)://<KUBEFLOW_ISTIO_GATEWAY>/_/my-app/profile2/
此类应用的 menuLinks
元素可能如下所示
{
"type": "item",
"link": "/my-app/{ns}/",
"text": "My App",
"icon": "social:mood"
}
由于应用程序 pod 位于配置文件命名空间内,现有的 Kubeflow AuthorizationPolicies 应该将应用程序限制在配置文件贡献者范围内。例如,如果用户是 profile1
命名空间的贡献者(但不是 profile2
),他们将能够访问 http(s)://<KUBEFLOW_ISTIO_GATEWAY>/_/my-app/profile1/
,但无法访问 http(s)://<KUBEFLOW_ISTIO_GATEWAY>/_/my-app/profile2/
。