pod.json•226 kB
{
"type": "page",
"data": {
"ns": "${'default'|selectedNs}",
"kind": "Pod",
"group": "",
"version": "v1"
},
"body": [
{
"type": "container",
"className": "floating-toolbar",
"body": [
{
"type": "tpl",
"tpl": "${kind}",
"className": "mr-2"
},
{
"type": "button",
"label": "属性文档",
"level": "link",
"icon": "fas fa-book-open text-primary",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind} 属性文档(ESC 关闭)",
"body": [
{
"type": "page",
"asideResizor": true,
"asideSticky": false,
"aside": [
{
"type": "input-tree",
"name": "tree",
"initiallyOpen": false,
"unfoldedLevel": 1,
"searchable": true,
"showOutline": true,
"showIcon": true,
"searchConfig": {
"sticky": true
},
"heightAuto": true,
"inputClassName": "no-border no-padder mt-1",
"source": "get:/k8s/doc/kind/$kind/group/$group/version/$version",
"onEvent": {
"change": {
"actions": [
{
"componentId": "basic",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
},
{
"componentId": "detail",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
}
]
}
}
}
],
"body": [
{
"type": "service",
"id": "basic",
"body": [
{
"type": "tpl",
"tpl": "<br><strong>属性:</strong> ${id}",
"visibleOn": "${id}"
},
{
"type": "button",
"label": "示例",
"level": "link",
"icon": "fas fa-lightbulb text-warning",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind}-${id} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example/field",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"field": "${full_id}"
}
}
]
},
"visibleOn": "${id}"
},
{
"type": "tpl",
"tpl": "<br><strong>类型:</strong> <span class='label label-primary'>${type}</span>",
"visibleOn": "${type}"
},
{
"type": "tpl",
"tpl": "<br><strong>描述:</strong> ${description}",
"visibleOn": "${description}"
}
]
},
{
"type": "service",
"id": "detail",
"api": "post:/k8s/doc/detail",
"body": [
{
"type": "divider",
"title": "描述翻译",
"titlePosition": "center",
"visibleOn": "${translate}"
},
{
"type": "markdown",
"value": "${translate|raw}",
"options": {
"linkify": true,
"html": true,
"breaks": true
},
"visibleOn": "${translate}"
},
{
"type": "container",
"body": [
{
"type": "tpl",
"tpl": "<div style='height:80vh'> </div>"
}
]
}
]
}
]
}
]
}
},
{
"type": "button",
"label": "指南",
"level": "link",
"icon": "fas fa-lightbulb text-primary",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}"
}
}
]
}
},
{
"type": "button",
"label": "智检",
"level": "link",
"icon": "fas fa-walking text-primary",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "AI 智能巡检 ${kind} (ESC 关闭)",
"body": [
{
"type": "k8sGPT",
"api": "/k8s/k8s_gpt/kind/${kind}/run"
}
]
}
},
{
"label": "创建",
"icon": "fas fa-dharmachakra text-primary",
"type": "button",
"level": "link",
"actionType": "url",
"blank": true,
"url": "/#/k/${''|selectedClusterBase64}/apply/apply?kind=${kind}"
}
]
},
{
"type": "container",
"className": "floating-toolbar-right",
"body": [
{
"type": "wrapper",
"body": [
{
"type": "form",
"mode": "inline",
"wrapWithPanel": false,
"body": [
{
"label": "命名空间",
"type": "select",
"multiple": true,
"maxTagCount": 1,
"name": "ns",
"id": "ns",
"searchable": true,
"checkAll": true,
"source": "/k8s/ns/option_list",
"value": "${'default'|selectedNs}",
"onEvent": {
"change": {
"actions": [
{
"actionType": "reload",
"componentId": "detailCRUD",
"data": {
"ns": "${ns}"
}
},
{
"actionType": "custom",
"script": "window.setSelectedNS(event.data.ns)"
}
]
}
}
},
{
"label": "集群",
"type": "select",
"multiple": false,
"name": "cluster",
"id": "cluster",
"searchable": true,
"source": "/params/cluster/option_list",
"value": "${''|selectedCluster}",
"onEvent": {
"change": {
"actions": [
{
"actionType": "custom",
"script": "window.setCurrentClusterId(event.data.value)"
}
]
}
}
}
]
}
]
}
]
},
{
"type": "crud",
"id": "detailCRUD",
"name": "detailCRUD",
"autoFillHeight": true,
"autoGenerateFilter": {
"columnsNum": 4,
"showBtnToolbar": false,
"defaultCollapsed": false
},
"headerToolbar": [
{
"type": "columns-toggler",
"align": "right",
"draggable": true,
"icon": "fas fa-cog",
"overlay": true,
"footerBtnSize": "sm"
},
{
"type": "tpl",
"tpl": "共${count}条",
"align": "right",
"visibleOn": "${count}"
},
{
"type": "columns-toggler",
"align": "left"
},
"reload",
{
"type": "button",
"label": "TOP资源用量",
"actionType": "drawer",
"tooltip": "资源用量 kubectl top pods -n xx",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"title": "容器组资源用量(ESC 关闭)",
"size": "xl",
"body": [
{
"type": "crud",
"id": "topPodCRUD",
"name": "topPodCRUD",
"autoFillHeight": true,
"autoGenerateFilter": {
"columnsNum": 4,
"showBtnToolbar": false
},
"headerToolbar": [
{
"type": "columns-toggler",
"align": "right",
"draggable": true,
"icon": "fas fa-cog",
"overlay": true,
"footerBtnSize": "sm"
},
{
"type": "tpl",
"tpl": "共${count}条",
"align": "right",
"visibleOn": "${count}"
},
{
"type": "columns-toggler",
"align": "left"
},
"reload"
],
"loadDataOnce": true,
"syncLocation": false,
"initFetch": true,
"perPage": 10,
"footerToolbar": [
{
"type": "pagination",
"align": "right"
},
{
"type": "statistics",
"align": "right"
},
{
"type": "switch-per-page",
"align": "right"
}
],
"api": "get:/k8s/pod/top/ns/${'default'|selectedNs}/list",
"columns": [
{
"name": "namespace",
"label": "命名空间",
"type": "text",
"sortable": true,
"searchable": true
},
{
"name": "name",
"label": "名称",
"type": "text",
"sortable": true,
"searchable": true
},
{
"name": "cpu",
"label": "cpu(核)",
"type": "text",
"sortable": true
},
{
"name": "cpu_fraction",
"label": "CPU资源<br><span class='text-gray-500 text-xs'>实时用量占比</span>",
"type": "container",
"width": "150px",
"sortable": true,
"body": [
{
"type": "progress",
"label": "realtime",
"value": "<%= data.cpu_fraction && Number(data.cpu_fraction) !== 0 ? data.cpu_fraction : 0 %>",
"placeholder": "N/A",
"animate": true,
"width": "100px",
"map": [
"bg-success",
"bg-success",
"bg-success",
"bg-warning",
"bg-danger"
]
}
]
},
{
"name": "memory",
"label": "内存(Mi)",
"type": "text",
"sortable": true
},
{
"name": "memory_fraction",
"label": "内存资源<br><span class='text-gray-500 text-xs'>实时用量占比</span>",
"type": "container",
"width": "150px",
"sortable": true,
"body": [
{
"type": "progress",
"label": "realtime",
"value": "<%= data.memory_fraction && Number(data.memory_fraction) !== 0 ? data.memory_fraction : 0 %>",
"placeholder": "N/A",
"animate": true,
"width": "100px",
"map": [
"bg-success",
"bg-success",
"bg-success",
"bg-warning",
"bg-danger"
]
}
]
}
]
}
]
}
},
"bulkActions"
],
"loadDataOnce": false,
"syncLocation": false,
"initFetch": true,
"perPage": 10,
"bulkActions": [
{
"label": "批量删除",
"actionType": "ajax",
"confirmText": "确定要批量删除?",
"api": {
"url": "/k8s/$kind/group/$group/version/$version/batch/remove",
"method": "post",
"data": {
"name_list": "${selectedItems | pick:metadata.name }",
"ns_list": "${selectedItems | pick:metadata.namespace }"
}
}
},
{
"label": "强制删除",
"actionType": "ajax",
"confirmText": "确定要批量强制删除?",
"api": {
"url": "/k8s/$kind/group/$group/version/$version/force_remove",
"method": "post",
"data": {
"name_list": "${selectedItems | pick:metadata.name }",
"ns_list": "${selectedItems | pick:metadata.namespace }"
}
}
}
],
"footerToolbar": [
{
"type": "pagination",
"align": "right"
},
{
"type": "statistics",
"align": "right"
},
{
"type": "switch-per-page",
"align": "right"
}
],
"api": "post:/k8s/$kind/group/$group/version/$version/list/ns/${ns}",
"columns": [
{
"type": "operation",
"label": "操作",
"width": 100,
"buttons": [
{
"type": "button",
"icon": "fas fa-eye text-primary",
"actionType": "drawer",
"tooltip": "资源描述",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "Describe: ${metadata.name} (ESC 关闭)",
"body": [
{
"type": "service",
"api": "post:/k8s/$kind/group/$group/version/$version/describe/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "button",
"label": "AI解读",
"icon": "fas fa-brain text-primary",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "AI解读 (ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/describe",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"name": "${metadata.name}",
"namespace": "${metadata.namespace}"
}
}
]
}
},
{
"type": "highlightHtml",
"keywords": [
"Error",
"Warning"
],
"html": "${result}"
}
]
}
]
}
},
{
"type": "button",
"icon": "fa fa-edit text-primary",
"tooltip": "Yaml编辑",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "Yaml管理",
"body": [
{
"type": "tabs",
"tabsMode": "tiled",
"tabs": [
{
"title": "查看编辑",
"body": [
{
"type": "service",
"api": "get:/k8s/$kind/group/$group/version/$version/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "mEditor",
"text": "${yaml}",
"componentId": "yaml",
"saveApi": "/k8s/${kind}/group/${group}/version/${version}/update/ns/${metadata.namespace}/name/${metadata.name}",
"options": {
"language": "yaml",
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
]
},
{
"title": "文档",
"body": [
{
"type": "page",
"asideResizor": true,
"asideSticky": false,
"aside": [
{
"type": "input-tree",
"name": "tree",
"initiallyOpen": false,
"unfoldedLevel": 1,
"searchable": true,
"showOutline": true,
"showIcon": true,
"searchConfig": {
"sticky": true
},
"heightAuto": true,
"inputClassName": "no-border no-padder mt-1",
"source": "get:/k8s/doc/gvk/${apiVersion|base64Encode}/$kind",
"onEvent": {
"change": {
"actions": [
{
"componentId": "basic",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
},
{
"componentId": "detail",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
}
]
}
}
}
],
"body": [
{
"type": "service",
"id": "basic",
"body": [
{
"type": "tpl",
"tpl": "<br><strong>属性:</strong> ${id}",
"visibleOn": "${id}"
},
{
"type": "button",
"label": "示例",
"level": "link",
"icon": "fas fa-lightbulb text-warning",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind}-${id} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example/field",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"field": "${full_id}"
}
}
]
},
"visibleOn": "${id}"
},
{
"type": "tpl",
"tpl": "<br><strong>类型:</strong> <span class='label label-primary'>${type}</span>",
"visibleOn": "${type}"
},
{
"type": "tpl",
"tpl": "<br><strong>描述:</strong> ${description}",
"visibleOn": "${description}"
}
]
},
{
"type": "service",
"id": "detail",
"api": "post:/k8s/doc/detail",
"body": [
{
"type": "divider",
"title": "描述翻译",
"titlePosition": "center",
"visibleOn": "${translate}"
},
{
"type": "markdown",
"value": "${translate|raw}",
"options": {
"linkify": true,
"html": true,
"breaks": true
},
"visibleOn": "${translate}"
},
{
"type": "container",
"body": [
{
"type": "tpl",
"tpl": "<div style='height:80vh'> </div>"
}
]
}
]
}
]
}
]
}
]
}
],
"actions": []
}
},
{
"tooltip": "终端",
"type": "button",
"level": "link",
"actionType": "url",
"icon": "fa fa-terminal text-primary",
"blank": true,
"url": "/#/k/${''|selectedClusterBase64}/PodExec?namespace=${metadata.namespace}&name=${metadata.name}"
},
{
"tooltip": "日志",
"icon": "fa fa-list text-primary",
"type": "button",
"level": "link",
"actionType": "url",
"blank": true,
"url": "/#/k/${''|selectedClusterBase64}/PodLog?namespace=${metadata.namespace}&name=${metadata.name}"
},
{
"type": "button",
"icon": "fas fa-binoculars text-primary",
"actionType": "drawer",
"tooltip": "端口",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "${metadata.name} 端口 (ESC 关闭)",
"body": [
{
"type": "crud",
"id": "detailPortList",
"name": "detailPortList",
"headerToolbar": [
"reload",
{
"type": "pagination",
"align": "right"
},
{
"type": "statistics",
"align": "right"
},
{
"type": "switch-per-page",
"align": "right"
}
],
"loadDataOnce": true,
"syncLocation": false,
"perPage": 10,
"api": "get:/k8s/pod/port_forward/ns/$metadata.namespace/name/$metadata.name/port/list",
"columns": [
{
"type": "operation",
"label": "操作",
"buttons": [
{
"type": "button",
"icon": "fas fa-random text-primary",
"label": "转发",
"actionType": "dialog",
"dialog": {
"title": "端口转发",
"body": [
{
"type": "form",
"api": "post:/k8s/pod/port_forward/ns/$metadata.namespace/name/$metadata.name/container/${container_name}/pod_port/${pod_port}/local_port/${local_port}/start",
"body": [
{
"type": "switch",
"name": "specify_port",
"label": "指定端口"
},
{
"type": "input-number",
"name": "local_port",
"label": "转发端口",
"visibleOn": "this.specify_port == true",
"min": 1,
"max": 65535
}
],
"onEvent": {
"submitSucc": {
"actions": [
{
"actionType": "reload",
"componentId": "detailPortList"
},
{
"actionType": "closeDrawer"
}
]
}
}
}
]
}
},
{
"type": "button",
"actionType": "ajax",
"icon": "fas fa-stop text-primary",
"label": "关闭",
"api": "post:/k8s/pod/port_forward/ns/$metadata.namespace/name/$metadata.name/container/${container_name}/pod_port/${pod_port}/stop",
"onEvent": {
"success": {
"actions": [
{
"actionType": "reload",
"componentId": "detailPortList"
}
]
}
}
}
],
"toggled": true
},
{
"name": "container_name",
"label": "容器名称",
"type": "text"
},
{
"name": "pod_port",
"label": "Pod端口",
"type": "tpl",
"tpl": "${port_name ? port_name +':': ''}${pod_port ? pod_port : ''}${protocol ?'['+ protocol+']' : ''}"
},
{
"name": "local_port",
"label": "访问端口",
"type": "tpl",
"tpl": "${local_port ? `${local_port} <a href='http://127.0.0.1:${local_port}' target='_blank'>http</a> <a href='https://127.0.0.1:${local_port}' target='_blank'>https</a>` : ''}"
},
{
"name": "status",
"label": "状态",
"type": "text"
}
]
}
]
}
}
],
"toggled": true
},
{
"name": "metadata.namespace",
"label": "命名空间",
"type": "text",
"sortable": true,
"searchable": {
"name": "metadata.namespace",
"clearable": true,
"label": "命名空间",
"placeholder": "输入命名空间",
"type": "select",
"searchable": true,
"source": "/k8s/ns/option_list"
}
},
{
"name": "metadata.name",
"label": "名称",
"type": "container",
"body": [
{
"type": "button",
"label": "${metadata.name}",
"level": "link",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"title": "${kind}/${metadata.namespace}/${metadata.name}-${status.podIP} 关联资源 (ESC 关闭)",
"size": "xl",
"actions": [
{
"type": "button",
"label": "关闭",
"close": true
}
],
"body": {
"type": "tabs",
"tabs": [
{
"title": "事件",
"body": [
{
"type": "crud",
"id": "detailEvent",
"name": "detailEvent",
"headerToolbar": [
"reload",
{
"type": "pagination",
"align": "right"
},
{
"type": "statistics",
"align": "right"
},
{
"type": "switch-per-page",
"align": "right"
}
],
"loadDataOnce": true,
"syncLocation": false,
"perPage": 10,
"api": "get:/k8s/$kind/group/$group/version/$version/ns/$metadata.namespace/name/$metadata.name/event",
"columns": [
{
"type": "operation",
"label": "操作",
"buttons": [
{
"type": "button",
"icon": "fas fa-brain text-primary",
"label": "AI问诊",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "AI 查询",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/event",
"params": {
"note": "${note}",
"source": "${source}",
"reason": "${reason}",
"reportingController": "${reportingController}",
"type": "${type}",
"regardingKind": "${kind}"
}
}
]
},
"visibleOn": "type === 'Warning'"
}
],
"toggled": true
},
{
"name": "type",
"label": "类型",
"filterable": {
"options": [
{
"label": "正常 ",
"value": "Normal"
},
{
"label": "告警 ",
"value": "Warning"
}
]
},
"type": "mapping",
"map": {
"Normal": "<span class='label label-success'>正常</span>",
"Warning": "<span class='label label-danger'>告警</span>"
}
},
{
"name": "reason",
"label": "原因",
"type": "text"
},
{
"name": "field",
"label": "关联字段",
"type": "tpl",
"tpl": "${regarding.fieldPath}"
},
{
"name": "source",
"label": "事件来源",
"type": "tpl",
"tpl": "${reportingController} ${reportingInstance}"
},
{
"name": "note",
"label": "说明",
"type": "text",
"searchable": true
},
{
"name": "metadata.creationTimestamp",
"label": "存在时长",
"type": "k8sAge"
}
]
}
]
},
{
"title": "日志",
"body": [
{
"type": "podLogViewer",
"url": "/k8s/pod/logs/sse/ns/${metadata.namespace}/pod_name/${metadata.name}/container/${containerName}",
"name": "${metadata.name}",
"namespace": "${metadata.namespace}"
}
]
},
{
"title": "网络",
"body": [
{
"type": "tabs",
"tabs": [
{
"title": "Ingress入口",
"body": {
"type": "crud",
"loadDataOnce": true,
"headerToolbar": [
"reload"
],
"api": "/k8s/${kind}/group/${group}/version/${version}/ns/${metadata.namespace}/name/${metadata.name}/links/ingress",
"columns": [
{
"type": "operation",
"label": "操作",
"width": 120,
"buttons": [
{
"type": "button",
"icon": "fas fa-eye text-primary",
"actionType": "drawer",
"tooltip": "资源描述",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "Describe: ${metadata.name} (ESC 关闭)",
"body": [
{
"type": "service",
"api": "post:/k8s/${kind}/group//version/v1/describe/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "button",
"label": "AI解读",
"icon": "fas fa-brain text-primary",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "AI解读 (ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/describe",
"params": {
"describe": "${result}",
"kind": "${kind}",
"group": "${group}"
}
}
]
}
},
{
"type": "highlightHtml",
"keywords": [
"Error",
"Warning"
],
"html": "${result}"
}
]
}
]
}
},
{
"type": "button",
"icon": "fa fa-edit text-primary",
"tooltip": "Yaml编辑",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "Yaml管理",
"body": [
{
"type": "tabs",
"tabsMode": "tiled",
"tabs": [
{
"title": "查看编辑",
"body": [
{
"type": "service",
"api": "get:/k8s/${kind}/group//version/v1/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "mEditor",
"text": "${yaml}",
"componentId": "yaml",
"saveApi": "/k8s/${kind}/group//version/v1/update/ns/${metadata.namespace}/name/${metadata.name}",
"options": {
"language": "yaml",
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
]
},
{
"title": "文档",
"body": [
{
"type": "page",
"asideResizor": true,
"asideSticky": false,
"aside": [
{
"type": "input-tree",
"name": "tree",
"initiallyOpen": false,
"unfoldedLevel": 1,
"searchable": true,
"showOutline": true,
"showIcon": true,
"searchConfig": {
"sticky": true
},
"heightAuto": true,
"inputClassName": "no-border no-padder mt-1",
"source": "get:/k8s/doc/gvk/${apiVersion|base64Encode}/$kind",
"onEvent": {
"change": {
"actions": [
{
"componentId": "basic",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
},
{
"componentId": "detail",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
}
]
}
}
}
],
"toolbar": [
{
"type": "tpl",
"tpl": ""
}
],
"body": [
{
"type": "service",
"id": "basic",
"body": [
{
"type": "tpl",
"tpl": "<br><strong>属性:</strong> ${id}",
"visibleOn": "${id}"
},
{
"type": "button",
"label": "示例",
"level": "link",
"icon": "fas fa-lightbulb text-warning",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind}-${id} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example/field",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"field": "${full_id}"
}
}
]
},
"visibleOn": "${id}"
},
{
"type": "tpl",
"tpl": "<br><strong>类型:</strong> <span class='label label-primary'>${type}</span>",
"visibleOn": "${type}"
},
{
"type": "tpl",
"tpl": "<br><strong>描述:</strong> ${description}",
"visibleOn": "${description}"
}
]
},
{
"type": "service",
"id": "detail",
"api": "post:/k8s/doc/detail",
"body": [
{
"type": "divider",
"title": "描述翻译",
"titlePosition": "center",
"visibleOn": "${translate}"
},
{
"type": "markdown",
"value": "${translate|raw}",
"options": {
"linkify": true,
"html": true,
"breaks": true
},
"visibleOn": "${translate}"
}
]
}
]
}
]
}
]
}
],
"actions": []
}
}
],
"toggled": true
},
{
"name": "metadata.name",
"label": "名称",
"type": "text"
},
{
"name": "spec.rules",
"label": "访问规则",
"type": "tpl",
"tpl": "<% if (data.spec.rules && data.spec.rules.length) { %><% data.spec.rules.forEach(function(rule) { %><div style='display: inline-block; margin-right: 20px; padding: 10px;'>域名: <%- rule.host || '*' %><br><% if (rule.http && rule.http.paths && rule.http.paths.length) { %><% rule.http.paths.forEach(function(path) { %><% if (path.backend && path.backend.service) { %>路径: <%- path.path %> → 服务: <%- path.backend.service.name %><br><% } %><% }); %><% } %></div><% }); %><% } %>"
},
{
"name": "metadata.creationTimestamp",
"label": "存在时长",
"type": "k8sAge"
}
]
}
},
{
"title": "Service网络",
"body": {
"type": "crud",
"loadDataOnce": true,
"headerToolbar": [
"reload"
],
"api": "/k8s/${kind}/group/${group}/version/${version}/ns/${metadata.namespace}/name/${metadata.name}/links/services",
"columns": [
{
"type": "operation",
"label": "操作",
"width": 120,
"buttons": [
{
"type": "button",
"icon": "fas fa-eye text-primary",
"actionType": "drawer",
"tooltip": "资源描述",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "Describe: ${metadata.name} (ESC 关闭)",
"body": [
{
"type": "service",
"api": "post:/k8s/${kind}/group//version/v1/describe/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "button",
"label": "AI解读",
"icon": "fas fa-brain text-primary",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "AI解读 (ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/describe",
"params": {
"describe": "${result}",
"kind": "${kind}",
"group": "${group}"
}
}
]
}
},
{
"type": "highlightHtml",
"keywords": [
"Error",
"Warning"
],
"html": "${result}"
}
]
}
]
}
},
{
"type": "button",
"icon": "fa fa-edit text-primary",
"tooltip": "Yaml编辑",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "Yaml管理",
"body": [
{
"type": "tabs",
"tabsMode": "tiled",
"tabs": [
{
"title": "查看编辑",
"body": [
{
"type": "service",
"api": "get:/k8s/${kind}/group//version/v1/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "mEditor",
"text": "${yaml}",
"componentId": "yaml",
"saveApi": "/k8s/${kind}/group//version/v1/update/ns/${metadata.namespace}/name/${metadata.name}",
"options": {
"language": "yaml",
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
]
},
{
"title": "文档",
"body": [
{
"type": "page",
"asideResizor": true,
"asideSticky": false,
"aside": [
{
"type": "input-tree",
"name": "tree",
"initiallyOpen": false,
"unfoldedLevel": 1,
"searchable": true,
"showOutline": true,
"showIcon": true,
"searchConfig": {
"sticky": true
},
"heightAuto": true,
"inputClassName": "no-border no-padder mt-1",
"source": "get:/k8s/doc/gvk/${apiVersion|base64Encode}/$kind",
"onEvent": {
"change": {
"actions": [
{
"componentId": "basic",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
},
{
"componentId": "detail",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
}
]
}
}
}
],
"toolbar": [
{
"type": "tpl",
"tpl": ""
}
],
"body": [
{
"type": "service",
"id": "basic",
"body": [
{
"type": "tpl",
"tpl": "<br><strong>属性:</strong> ${id}",
"visibleOn": "${id}"
},
{
"type": "button",
"label": "示例",
"level": "link",
"icon": "fas fa-lightbulb text-warning",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind}-${id} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example/field",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"field": "${full_id}"
}
}
]
},
"visibleOn": "${id}"
},
{
"type": "tpl",
"tpl": "<br><strong>类型:</strong> <span class='label label-primary'>${type}</span>",
"visibleOn": "${type}"
},
{
"type": "tpl",
"tpl": "<br><strong>描述:</strong> ${description}",
"visibleOn": "${description}"
}
]
},
{
"type": "service",
"id": "detail",
"api": "post:/k8s/doc/detail",
"body": [
{
"type": "divider",
"title": "描述翻译",
"titlePosition": "center",
"visibleOn": "${translate}"
},
{
"type": "markdown",
"value": "${translate|raw}",
"options": {
"linkify": true,
"html": true,
"breaks": true
},
"visibleOn": "${translate}"
}
]
}
]
}
]
}
]
}
],
"actions": []
}
}
],
"toggled": true
},
{
"name": "metadata.name",
"label": "Service 名称",
"type": "text"
},
{
"name": "spec.type",
"label": "访问类型",
"type": "tpl",
"tpl": "<% if (data.spec && data.spec.type === 'ClusterIP' && data.spec.clusterIP === 'None') { %><span class='label label-warning'>Headless</span><% } else { %><span class='label label-success'><%= data.spec.type %></span><% } %>"
},
{
"name": "spec.clusterIP",
"label": "访问地址",
"type": "text"
},
{
"name": "spec.ports",
"label": "访问端口<br><span class='text-gray-500 text-xs'>访问端口[:节点端口]/协议 => 容器端口</span>",
"type": "each",
"items": {
"type": "tpl",
"tpl": "<div>${port}${nodePort?':<span class=\"text text-danger font-black\">'+nodePort+'</span>':''}/${protocol} <span class=\"text text-success font-black\">=>${targetPort}</span></div>"
}
},
{
"name": "spec.sessionAffinity",
"label": "会话亲和性",
"type": "mapping",
"map": {
"ClientIP": "<span class='label label-danger'>ClientIP</span>",
"None": "<span class='label label-success'>None</span>"
}
},
{
"name": "metadata.creationTimestamp",
"label": "存在时长",
"type": "k8sAge"
}
]
}
},
{
"title": "端点",
"body": {
"type": "crud",
"loadDataOnce": true,
"headerToolbar": [
"reload"
],
"api": "/k8s/${kind}/group/${group}/version/${version}/ns/${metadata.namespace}/name/${metadata.name}/links/endpoints",
"columns": [
{
"type": "operation",
"label": "操作",
"width": 120,
"buttons": [
{
"type": "button",
"icon": "fas fa-eye text-primary",
"actionType": "drawer",
"tooltip": "资源描述",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "Describe: ${metadata.name} (ESC 关闭)",
"body": [
{
"type": "service",
"api": "post:/k8s/${kind}/group//version/v1/describe/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "button",
"label": "AI解读",
"icon": "fas fa-brain text-primary",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "AI解读 (ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/describe",
"params": {
"describe": "${result}",
"kind": "${kind}",
"group": "${group}"
}
}
]
}
},
{
"type": "highlightHtml",
"keywords": [
"Error",
"Warning"
],
"html": "${result}"
}
]
}
]
}
},
{
"type": "button",
"icon": "fa fa-edit text-primary",
"tooltip": "Yaml编辑",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "Yaml管理",
"body": [
{
"type": "tabs",
"tabsMode": "tiled",
"tabs": [
{
"title": "查看编辑",
"body": [
{
"type": "service",
"api": "get:/k8s/${kind}/group//version/v1/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "mEditor",
"text": "${yaml}",
"componentId": "yaml",
"saveApi": "/k8s/${kind}/group//version/v1/update/ns/${metadata.namespace}/name/${metadata.name}",
"options": {
"language": "yaml",
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
]
},
{
"title": "文档",
"body": [
{
"type": "page",
"asideResizor": true,
"asideSticky": false,
"aside": [
{
"type": "input-tree",
"name": "tree",
"initiallyOpen": false,
"unfoldedLevel": 1,
"searchable": true,
"showOutline": true,
"showIcon": true,
"searchConfig": {
"sticky": true
},
"heightAuto": true,
"inputClassName": "no-border no-padder mt-1",
"source": "get:/k8s/doc/gvk/${apiVersion|base64Encode}/$kind",
"onEvent": {
"change": {
"actions": [
{
"componentId": "basic",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
},
{
"componentId": "detail",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
}
]
}
}
}
],
"toolbar": [
{
"type": "tpl",
"tpl": ""
}
],
"body": [
{
"type": "service",
"id": "basic",
"body": [
{
"type": "tpl",
"tpl": "<br><strong>属性:</strong> ${id}",
"visibleOn": "${id}"
},
{
"type": "button",
"label": "示例",
"level": "link",
"icon": "fas fa-lightbulb text-warning",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind}-${id} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example/field",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"field": "${full_id}"
}
}
]
},
"visibleOn": "${id}"
},
{
"type": "tpl",
"tpl": "<br><strong>类型:</strong> <span class='label label-primary'>${type}</span>",
"visibleOn": "${type}"
},
{
"type": "tpl",
"tpl": "<br><strong>描述:</strong> ${description}",
"visibleOn": "${description}"
}
]
},
{
"type": "service",
"id": "detail",
"api": "post:/k8s/doc/detail",
"body": [
{
"type": "divider",
"title": "描述翻译",
"titlePosition": "center",
"visibleOn": "${translate}"
},
{
"type": "markdown",
"value": "${translate|raw}",
"options": {
"linkify": true,
"html": true,
"breaks": true
},
"visibleOn": "${translate}"
}
]
}
]
}
]
}
]
}
],
"actions": []
}
}
],
"toggled": true
},
{
"name": "metadata.name",
"label": "端点 名称",
"type": "text"
},
{
"name": "subsets",
"label": "就绪IP",
"type": "tpl",
"tpl": "<% if (data.subsets && data.subsets[0].addresses) { %><% data.subsets[0].addresses.forEach(function(address) { %><span class='text-green-500 font-black'><%= address.ip %><% if (address.targetRef) { %> 【<%= address.targetRef.namespace %>/<%= address.targetRef.name %>】<% } %></span><br><% }); %><% } %>"
},
{
"name": "subsets",
"label": "未就绪IP",
"type": "tpl",
"tpl": "<% if (data.subsets && data.subsets[0].notReadyAddresses) { %><% data.subsets[0].notReadyAddresses.forEach(function(address) { %><span class='text-red-500 font-black'><%= address.ip %><% if (address.targetRef) { %> 【<%= address.targetRef.namespace %>/<%= address.targetRef.name %>】<% } %></span><br><% }); %><% } %>"
},
{
"name": "metadata.creationTimestamp",
"label": "存在时长",
"type": "k8sAge"
}
]
}
}
]
}
]
},
{
"title": "存储",
"body": [
{
"type": "tabs",
"tabs": [
{
"title": "存储卷声明",
"body": {
"type": "crud",
"loadDataOnce": true,
"headerToolbar": [
"reload"
],
"api": "/k8s/${kind}/group/${group}/version/${version}/ns/${metadata.namespace}/name/${metadata.name}/links/pvc",
"columns": [
{
"type": "operation",
"label": "操作",
"width": 120,
"buttons": [
{
"type": "button",
"icon": "fas fa-eye text-primary",
"actionType": "drawer",
"tooltip": "资源描述",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "Describe: ${metadata.name} (ESC 关闭)",
"body": [
{
"type": "service",
"api": "post:/k8s/${kind}/group//version/v1/describe/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "button",
"label": "AI解读",
"icon": "fas fa-brain text-primary",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "AI解读 (ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/describe",
"params": {
"describe": "${result}",
"kind": "${kind}",
"group": "${group}"
}
}
]
}
},
{
"type": "highlightHtml",
"keywords": [
"Error",
"Warning"
],
"html": "${result}"
}
]
}
]
}
},
{
"type": "button",
"icon": "fa fa-edit text-primary",
"tooltip": "Yaml编辑",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "Yaml管理",
"body": [
{
"type": "tabs",
"tabsMode": "tiled",
"tabs": [
{
"title": "查看编辑",
"body": [
{
"type": "service",
"api": "get:/k8s/${kind}/group//version/v1/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "mEditor",
"text": "${yaml}",
"componentId": "yaml",
"saveApi": "/k8s/${kind}/group//version/v1/update/ns/${metadata.namespace}/name/${metadata.name}",
"options": {
"language": "yaml",
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
]
},
{
"title": "文档",
"body": [
{
"type": "page",
"asideResizor": true,
"asideSticky": false,
"aside": [
{
"type": "input-tree",
"name": "tree",
"initiallyOpen": false,
"unfoldedLevel": 1,
"searchable": true,
"showOutline": true,
"showIcon": true,
"searchConfig": {
"sticky": true
},
"heightAuto": true,
"inputClassName": "no-border no-padder mt-1",
"source": "get:/k8s/doc/gvk/${apiVersion|base64Encode}/$kind",
"onEvent": {
"change": {
"actions": [
{
"componentId": "basic",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
},
{
"componentId": "detail",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
}
]
}
}
}
],
"toolbar": [
{
"type": "tpl",
"tpl": ""
}
],
"body": [
{
"type": "service",
"id": "basic",
"body": [
{
"type": "tpl",
"tpl": "<br><strong>属性:</strong> ${id}",
"visibleOn": "${id}"
},
{
"type": "button",
"label": "示例",
"level": "link",
"icon": "fas fa-lightbulb text-warning",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind}-${id} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example/field",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"field": "${full_id}"
}
}
]
},
"visibleOn": "${id}"
},
{
"type": "tpl",
"tpl": "<br><strong>类型:</strong> <span class='label label-primary'>${type}</span>",
"visibleOn": "${type}"
},
{
"type": "tpl",
"tpl": "<br><strong>描述:</strong> ${description}",
"visibleOn": "${description}"
}
]
},
{
"type": "service",
"id": "detail",
"api": "post:/k8s/doc/detail",
"body": [
{
"type": "divider",
"title": "描述翻译",
"titlePosition": "center",
"visibleOn": "${translate}"
},
{
"type": "markdown",
"value": "${translate|raw}",
"options": {
"linkify": true,
"html": true,
"breaks": true
},
"visibleOn": "${translate}"
}
]
}
]
}
]
}
]
}
],
"actions": []
}
}
],
"toggled": true
},
{
"name": "metadata.name",
"label": "名称",
"type": "text",
"width": "180px",
"sortable": true
},
{
"name": "metadata.annotations.pvcMounts",
"label": "挂载信息",
"type": "tpl",
"tpl": "<% const mounts = (data.metadata.annotations && data.metadata.annotations.pvcMounts) ? JSON.parse(data.metadata.annotations.pvcMounts) : []; %><% if (mounts.length > 0) { %><% mounts.forEach((item) => { %>挂载文件夹: <%= item.mountPath + (item.subPath ? '/' + item.subPath : '') %>, 只读: <%= item.readOnly ? '是' : '否' %><br><% }); %><% } else { %>没有挂载信息<% } %>"
},
{
"name": "status.phase",
"label": "状态",
"type": "mapping",
"map": {
"Bound": "<span class='label label-success'>已绑定</span>",
"Lost": "<span class='label label-danger'>丢失</span>",
"Pending": "<span class='label label-warning'>未绑定</span>"
}
},
{
"name": "request",
"label": "申请容量",
"type": "tpl",
"tpl": "${spec.resources.requests.storage}"
},
{
"name": "capacity",
"label": "存储容积",
"type": "tpl",
"tpl": "${status.capacity.storage}"
},
{
"name": "spec.accessModes",
"label": "访问模式",
"type": "tpl",
"tpl": "<%= data.spec.accessModes.map(item => item === 'ReadWriteOnce' ? '<span class=\\'label label-success\\'>单路读写</span>' : item === 'ReadOnlyMany' ? '<span class=\\'label label-warning\\'>多路只读</span>' : item === 'ReadWriteMany' ? '<span class=\\'label label-info\\'>多路读写</span>' : '').join(' ') %>"
},
{
"name": "spec.volumeMode",
"label": "卷模式",
"type": "mapping",
"map": {
"Filesystem": "<span class='label label-success'>文件系统</span>",
"Block": "<span class='label label-warning'>块设备</span>"
}
},
{
"name": "metadata.creationTimestamp",
"label": "存在时长",
"type": "k8sAge"
}
]
}
},
{
"title": "存储卷",
"body": {
"type": "crud",
"loadDataOnce": true,
"headerToolbar": [
"reload"
],
"api": "/k8s/${kind}/group/${group}/version/${version}/ns/${metadata.namespace}/name/${metadata.name}/links/pv",
"columns": [
{
"type": "operation",
"label": "操作",
"width": 120,
"buttons": [
{
"type": "button",
"icon": "fas fa-eye text-primary",
"actionType": "drawer",
"tooltip": "资源描述",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "Describe: ${metadata.name} (ESC 关闭)",
"body": [
{
"type": "service",
"api": "post:/k8s/${kind}/group//version/v1/describe/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "button",
"label": "AI解读",
"icon": "fas fa-brain text-primary",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "AI解读 (ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/describe",
"params": {
"describe": "${result}",
"kind": "${kind}",
"group": "${group}"
}
}
]
}
},
{
"type": "highlightHtml",
"keywords": [
"Error",
"Warning"
],
"html": "${result}"
}
]
}
]
}
},
{
"type": "button",
"icon": "fa fa-edit text-primary",
"tooltip": "Yaml编辑",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "Yaml管理",
"body": [
{
"type": "tabs",
"tabsMode": "tiled",
"tabs": [
{
"title": "查看编辑",
"body": [
{
"type": "service",
"api": "get:/k8s/${kind}/group//version/v1/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "mEditor",
"text": "${yaml}",
"componentId": "yaml",
"saveApi": "/k8s/${kind}/group//version/v1/update/ns/${metadata.namespace}/name/${metadata.name}",
"options": {
"language": "yaml",
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
]
},
{
"title": "文档",
"body": [
{
"type": "page",
"asideResizor": true,
"asideSticky": false,
"aside": [
{
"type": "input-tree",
"name": "tree",
"initiallyOpen": false,
"unfoldedLevel": 1,
"searchable": true,
"showOutline": true,
"showIcon": true,
"searchConfig": {
"sticky": true
},
"heightAuto": true,
"inputClassName": "no-border no-padder mt-1",
"source": "get:/k8s/doc/gvk/${apiVersion|base64Encode}/$kind",
"onEvent": {
"change": {
"actions": [
{
"componentId": "basic",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
},
{
"componentId": "detail",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
}
]
}
}
}
],
"toolbar": [
{
"type": "tpl",
"tpl": ""
}
],
"body": [
{
"type": "service",
"id": "basic",
"body": [
{
"type": "tpl",
"tpl": "<br><strong>属性:</strong> ${id}",
"visibleOn": "${id}"
},
{
"type": "button",
"label": "示例",
"level": "link",
"icon": "fas fa-lightbulb text-warning",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind}-${id} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example/field",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"field": "${full_id}"
}
}
]
},
"visibleOn": "${id}"
},
{
"type": "tpl",
"tpl": "<br><strong>类型:</strong> <span class='label label-primary'>${type}</span>",
"visibleOn": "${type}"
},
{
"type": "tpl",
"tpl": "<br><strong>描述:</strong> ${description}",
"visibleOn": "${description}"
}
]
},
{
"type": "service",
"id": "detail",
"api": "post:/k8s/doc/detail",
"body": [
{
"type": "divider",
"title": "描述翻译",
"titlePosition": "center",
"visibleOn": "${translate}"
},
{
"type": "markdown",
"value": "${translate|raw}",
"options": {
"linkify": true,
"html": true,
"breaks": true
},
"visibleOn": "${translate}"
}
]
}
]
}
]
}
]
}
],
"actions": []
}
}
],
"toggled": true
},
{
"name": "metadata.name",
"label": "名称",
"type": "text",
"width": "180px",
"sortable": true
},
{
"name": "spec.accessModes",
"label": "访问模式",
"type": "tpl",
"tpl": "<%= data.spec.accessModes.map(item => item === 'ReadWriteOnce' ? '<span class=\\'label label-success\\'>单路读写</span>' : item === 'ReadOnlyMany' ? '<span class=\\'label label-warning\\'>多路只读</span>' : item === 'ReadWriteMany' ? '<span class=\\'label label-info\\'>多路读写</span>' : '').join(' ') %>"
},
{
"name": "spec.capacity.storage",
"label": "存储容积",
"type": "text"
},
{
"name": "spec.persistentVolumeReclaimPolicy",
"label": "回收策略",
"type": "mapping",
"map": {
"Retain": "<span class='label label-success'>保留</span>",
"Recycle": "<span class='label label-info'>回收</span>",
"Delete": "<span class='label label-danger'>删除</span>"
}
},
{
"name": "status.phase",
"label": "状态",
"type": "mapping",
"map": {
"Available": "<span class='label label-success'>待绑定</span>",
"Bound": "<span class='label label-info'>已绑定</span>",
"Failed": "<span class='label label-danger'>回收失败</span>",
"Pending": "<span class='label label-primary'>待分配</span>",
"Released": "<span class='label label-success'>已释放</span>"
}
},
{
"name": "claim",
"label": "PVC声明",
"type": "tpl",
"tpl": "${spec.claimRef.namespace}/${spec.claimRef.name}"
},
{
"name": "spec.storageClassName",
"label": "存储类名称",
"type": "text"
},
{
"name": "spec.volumeMode",
"label": "卷模式",
"type": "mapping",
"map": {
"Filesystem": "<span class='label label-success'>文件系统</span>",
"Block": "<span class='label label-warning'>块设备</span>"
}
},
{
"name": "metadata.creationTimestamp",
"label": "存在时长",
"type": "k8sAge"
}
]
}
}
]
}
]
},
{
"title": "环境变量",
"body": {
"type": "crud",
"autoGenerateFilter": {
"columnsNum": 4,
"showBtnToolbar": false
},
"headerToolbar": [
{
"type": "columns-toggler",
"align": "right",
"draggable": true,
"icon": "fas fa-cog",
"overlay": true,
"footerBtnSize": "sm"
},
"reload",
{
"type": "pagination",
"align": "right"
},
{
"type": "statistics",
"align": "right"
},
{
"type": "switch-per-page",
"align": "right"
}
],
"loadDataOnce": true,
"api": "/k8s/${kind}/group/${group}/version/${version}/ns/${metadata.namespace}/name/${metadata.name}/links/envFromPod",
"columns": [
{
"name": "containerName",
"label": "容器",
"type": "text",
"sortable": true,
"searchable": {
"type": "select",
"name": "containerName",
"source": "${spec.containers | pick:name | map: {label: item, value: item}}",
"clearable": true
}
},
{
"name": "envName",
"label": "环境变量名称",
"type": "text",
"sortable": true,
"searchable": true
},
{
"name": "envValue",
"label": "环境变量值",
"type": "text",
"sortable": true,
"searchable": true
}
]
}
},
{
"title": "配置映射",
"body": {
"type": "crud",
"loadDataOnce": true,
"headerToolbar": [
"reload"
],
"api": "/k8s/${kind}/group/${group}/version/${version}/ns/${metadata.namespace}/name/${metadata.name}/links/configmap",
"columns": [
{
"type": "operation",
"label": "操作",
"width": 120,
"buttons": [
{
"type": "button",
"icon": "fas fa-eye text-primary",
"actionType": "drawer",
"tooltip": "资源描述",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "Describe: ${metadata.name} (ESC 关闭)",
"body": [
{
"type": "service",
"api": "post:/k8s/${kind}/group//version/v1/describe/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "button",
"label": "AI解读",
"icon": "fas fa-brain text-primary",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "AI解读 (ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/describe",
"params": {
"describe": "${result}",
"kind": "${kind}",
"group": "${group}"
}
}
]
}
},
{
"type": "highlightHtml",
"keywords": [
"Error",
"Warning"
],
"html": "${result}"
}
]
}
]
}
},
{
"type": "button",
"icon": "fa fa-edit text-primary",
"tooltip": "Yaml编辑",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "Yaml管理",
"body": [
{
"type": "tabs",
"tabsMode": "tiled",
"tabs": [
{
"title": "查看编辑",
"body": [
{
"type": "service",
"api": "get:/k8s/${kind}/group//version/v1/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "mEditor",
"text": "${yaml}",
"componentId": "yaml",
"saveApi": "/k8s/${kind}/group//version/v1/update/ns/${metadata.namespace}/name/${metadata.name}",
"options": {
"language": "yaml",
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
]
},
{
"title": "文档",
"body": [
{
"type": "page",
"asideResizor": true,
"asideSticky": false,
"aside": [
{
"type": "input-tree",
"name": "tree",
"initiallyOpen": false,
"unfoldedLevel": 1,
"searchable": true,
"showOutline": true,
"showIcon": true,
"searchConfig": {
"sticky": true
},
"heightAuto": true,
"inputClassName": "no-border no-padder mt-1",
"source": "get:/k8s/doc/gvk/${apiVersion|base64Encode}/$kind",
"onEvent": {
"change": {
"actions": [
{
"componentId": "basic",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
},
{
"componentId": "detail",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
}
]
}
}
}
],
"toolbar": [
{
"type": "tpl",
"tpl": ""
}
],
"body": [
{
"type": "service",
"id": "basic",
"body": [
{
"type": "tpl",
"tpl": "<br><strong>属性:</strong> ${id}",
"visibleOn": "${id}"
},
{
"type": "button",
"label": "示例",
"level": "link",
"icon": "fas fa-lightbulb text-warning",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind}-${id} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example/field",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"field": "${full_id}"
}
}
]
},
"visibleOn": "${id}"
},
{
"type": "tpl",
"tpl": "<br><strong>类型:</strong> <span class='label label-primary'>${type}</span>",
"visibleOn": "${type}"
},
{
"type": "tpl",
"tpl": "<br><strong>描述:</strong> ${description}",
"visibleOn": "${description}"
}
]
},
{
"type": "service",
"id": "detail",
"api": "post:/k8s/doc/detail",
"body": [
{
"type": "divider",
"title": "描述翻译",
"titlePosition": "center",
"visibleOn": "${translate}"
},
{
"type": "markdown",
"value": "${translate|raw}",
"options": {
"linkify": true,
"html": true,
"breaks": true
},
"visibleOn": "${translate}"
}
]
}
]
}
]
}
]
}
],
"actions": []
}
}
],
"toggled": true
},
{
"name": "metadata.name",
"label": "名称",
"type": "text"
},
{
"name": "metadata.annotations.configMapMounts",
"label": "挂载信息",
"type": "tpl",
"tpl": "<% const mounts = (data.metadata.annotations && data.metadata.annotations.configMapMounts) ? JSON.parse(data.metadata.annotations.configMapMounts) : []; %><% if (mounts.length > 0) { %><% mounts.forEach((item) => { %>挂载文件夹: <%= item.mountPath + (item.subPath ? '/' + item.subPath : '') %>, 模式: <%= '0' + (item.mode || 0).toString(8) %>, 只读: <%= item.readOnly ? '是' : '否' %><br><% }); %><% } else { %>没有挂载信息<% } %>"
},
{
"label": "文件列表",
"type": "each",
"name": "data",
"items": {
"type": "button",
"level": "link",
"label": "${key}",
"actionType": "drawer",
"drawer": {
"size": "lg",
"closeOnEsc": true,
"closeOnOutside": true,
"title": "查看 ${metadata.name}-${key} 文件内容 (ESC 关闭)",
"body": [
{
"type": "editor",
"name": "yaml",
"size": "xxl",
"allowFullscreen": true,
"placeholder": "loading",
"language": "yaml",
"value": "${value}",
"options": {
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
}
},
{
"name": "metadata.creationTimestamp",
"label": "存在时长",
"type": "k8sAge"
}
]
}
},
{
"title": "密钥",
"body": {
"loadDataOnce": true,
"headerToolbar": [
"reload"
],
"type": "crud",
"api": "/k8s/${kind}/group/${group}/version/${version}/ns/${metadata.namespace}/name/${metadata.name}/links/secret",
"columns": [
{
"type": "operation",
"label": "操作",
"width": 120,
"buttons": [
{
"type": "button",
"icon": "fas fa-eye text-primary",
"actionType": "drawer",
"tooltip": "资源描述",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "Describe: ${metadata.name} (ESC 关闭)",
"body": [
{
"type": "service",
"api": "post:/k8s/${kind}/group//version/v1/describe/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "button",
"label": "AI解读",
"icon": "fas fa-brain text-primary",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "xl",
"title": "AI解读 (ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/describe",
"params": {
"describe": "${result}",
"kind": "${kind}",
"group": "${group}"
}
}
]
}
},
{
"type": "highlightHtml",
"keywords": [
"Error",
"Warning"
],
"html": "${result}"
}
]
}
]
}
},
{
"type": "button",
"icon": "fa fa-edit text-primary",
"tooltip": "Yaml编辑",
"actionType": "drawer",
"drawer": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "Yaml管理",
"body": [
{
"type": "tabs",
"tabsMode": "tiled",
"tabs": [
{
"title": "查看编辑",
"body": [
{
"type": "service",
"api": "get:/k8s/${kind}/group//version/v1/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "mEditor",
"text": "${yaml}",
"componentId": "yaml",
"saveApi": "/k8s/${kind}/group//version/v1/update/ns/${metadata.namespace}/name/${metadata.name}",
"options": {
"language": "yaml",
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
]
},
{
"title": "文档",
"body": [
{
"type": "page",
"asideResizor": true,
"asideSticky": false,
"aside": [
{
"type": "input-tree",
"name": "tree",
"initiallyOpen": false,
"unfoldedLevel": 1,
"searchable": true,
"showOutline": true,
"showIcon": true,
"searchConfig": {
"sticky": true
},
"heightAuto": true,
"inputClassName": "no-border no-padder mt-1",
"source": "get:/k8s/doc/gvk/${apiVersion|base64Encode}/$kind",
"onEvent": {
"change": {
"actions": [
{
"componentId": "basic",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
},
{
"componentId": "detail",
"actionType": "reload",
"data": {
"description": "${event.data.item.description}",
"id": "${event.data.item.id}",
"full_id": "${event.data.item.full_id}",
"type": "${event.data.item.type}"
}
}
]
}
}
}
],
"toolbar": [
{
"type": "tpl",
"tpl": ""
}
],
"body": [
{
"type": "service",
"id": "basic",
"body": [
{
"type": "tpl",
"tpl": "<br><strong>属性:</strong> ${id}",
"visibleOn": "${id}"
},
{
"type": "button",
"label": "示例",
"level": "link",
"icon": "fas fa-lightbulb text-warning",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${kind}-${id} 参考样例(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/example/field",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"field": "${full_id}"
}
}
]
},
"visibleOn": "${id}"
},
{
"type": "tpl",
"tpl": "<br><strong>类型:</strong> <span class='label label-primary'>${type}</span>",
"visibleOn": "${type}"
},
{
"type": "tpl",
"tpl": "<br><strong>描述:</strong> ${description}",
"visibleOn": "${description}"
}
]
},
{
"type": "service",
"id": "detail",
"api": "post:/k8s/doc/detail",
"body": [
{
"type": "divider",
"title": "描述翻译",
"titlePosition": "center",
"visibleOn": "${translate}"
},
{
"type": "markdown",
"value": "${translate|raw}",
"options": {
"linkify": true,
"html": true,
"breaks": true
},
"visibleOn": "${translate}"
}
]
}
]
}
]
}
]
}
],
"actions": []
}
}
],
"toggled": true
},
{
"name": "metadata.name",
"label": "名称",
"type": "text"
},
{
"name": "type",
"label": "类型",
"type": "mapping",
"map": {
"Opaque": "<span class='label label-primary'>自定义数据</span>",
"kubernetes.io/service-account-token": "<span class='label label-primary'>服务账户令牌</span>",
"kubernetes.io/dockercfg": "<span class='label label-info'>旧版镜像凭证</span>",
"kubernetes.io/dockerconfigjson": "<span class='label label-success'>镜像凭证</span>",
"kubernetes.io/basic-auth": "<span class='label label-warning'>Basic Auth 凭证</span>",
"kubernetes.io/ssh-auth": "<span class='label label-warning'>SSH 凭证</span>",
"kubernetes.io/tls": "<span class='label label-danger'>TLS 凭证</span>",
"bootstrap.kubernetes.io/token": "<span class='label label-default'>引导令牌</span>",
"*": "<span class='label label-primary'>${type}</span>"
}
},
{
"name": "metadata.annotations.secretMounts",
"label": "挂载信息",
"type": "tpl",
"tpl": "<% const mounts = (data.metadata.annotations && data.metadata.annotations.secretMounts) ? JSON.parse(data.metadata.annotations.secretMounts) : []; %><% if (mounts.length > 0) { %><% mounts.forEach((item) => { %>挂载文件夹: <%= item.mountPath + (item.subPath ? '/' + item.subPath : '') %>, 模式: <%= '0' + (item.mode || 0).toString(8) %>, 只读: <%= item.readOnly ? '是' : '否' %><br><% }); %><% } else { %>没有挂载信息<% } %>"
},
{
"label": "文件列表",
"type": "each",
"name": "data",
"items": {
"type": "button",
"level": "link",
"label": "${key}",
"actionType": "drawer",
"drawer": {
"size": "lg",
"closeOnEsc": true,
"closeOnOutside": true,
"title": "查看 ${metadata.name}-${key} 文件内容 (ESC 关闭)",
"body": [
{
"type": "editor",
"name": "yaml",
"size": "xxl",
"allowFullscreen": true,
"placeholder": "loading",
"language": "yaml",
"value": "${value| base64Decode}",
"options": {
"wordWrap": "on",
"scrollbar": {
"vertical": "auto"
}
}
}
]
}
}
},
{
"name": "metadata.creationTimestamp",
"label": "存在时长",
"type": "k8sAge"
}
]
}
}
]
}
}
}
],
"width": "180px",
"sortable": true,
"searchable": {
"type": "input-text",
"name": "metadata.name",
"clearable": true,
"label": "名称",
"placeholder": "输入名称"
}
},
{
"name": "ready",
"label": "就绪",
"type": "k8sPodReady"
},
{
"name": "status.phase",
"label": "状态",
"type": "k8sPodStatus",
"searchable": {
"type": "select",
"clearable": true,
"name": "status.phase",
"label": "状态",
"placeholder": "选择状态",
"options": [
{
"label": "运行中",
"value": "Running"
},
{
"label": "调度中",
"value": "Pending"
},
{
"label": "成功完成",
"value": "Succeeded"
},
{
"label": "失败",
"value": "Failed"
},
{
"label": "未知",
"value": "Unknown"
}
]
}
},
{
"name": "status.podIP",
"label": "容器组IP",
"type": "text",
"searchable": true,
"sortable": true
},
{
"name": "status.qosClass",
"label": "保障等级",
"type": "mapping",
"map": {
"Guaranteed": "<span class='label label-success'>保证型</span>",
"Burstable": "<span class='label label-warning'>可突增型</span>",
"BestEffort": "<span class='label label-danger'>尽力型</span>"
},
"searchable": {
"type": "select",
"clearable": true,
"name": "status.qosClass",
"label": "保障等级",
"placeholder": "选择保障等级",
"options": [
{
"label": "保证型",
"value": "Guaranteed"
},
{
"label": "可突增型",
"value": "Burstable"
},
{
"label": "尽力型",
"value": "BestEffort"
}
]
}
},
{
"name": "spec.containers",
"label": "容器镜像<br><span class='text-gray-500 text-xs'>容器名称=>镜像:版本</span>",
"width": "250px",
"type": "each",
"items": {
"type": "tpl",
"tpl": "<div style='margin-bottom: 10px;'><strong class='text-green-500 font-black'>${name}</strong>=>${image|simpleImageName}</div>"
}
},
{
"name": "status.containerStatuses",
"label": "重启次数",
"type": "tpl",
"tpl": "${status.containerStatuses|pick:restartCount | map | sum }"
},
{
"name": "realtime",
"label": "实时用量<br><span class='text-gray-500 text-xs'>CPU(m毫核)/内存(Mi)</span>",
"type": "tpl",
"tpl": "<%= ( data.metadata.annotations && data.metadata.annotations['cpu.realtime'] && Number(data.metadata.annotations['cpu.realtime']) !== 0 ? data.metadata.annotations['cpu.realtime'] : '0m') + ' / ' + (data.metadata.annotations && data.metadata.annotations['memory.realtime'] && Number(data.metadata.annotations['memory.realtime']) !== 0? data.metadata.annotations['memory.realtime'] : '0Mi') %>"
},
{
"name": "资源设定",
"label": "资源设定<br><span class='text-gray-500 text-xs'>请求<设定<上限</span>",
"width": "180px",
"type": "tpl",
"tpl": "<% for (var i = 0; i < data.spec.containers.length; i++) { %><% var container = data.spec.containers[i]; var requests = container?.resources?.requests || {}; var limits = container?.resources?.limits || {}; var cpuRequest = requests.cpu || null; var cpuLimit = limits.cpu || null; var memoryRequest = requests.memory || null; var memoryLimit = limits.memory || null; %><% if (cpuRequest || cpuLimit || memoryRequest || memoryLimit) { %><strong>容器:<%= container.name || '未知' %></strong><br><% if (cpuRequest || cpuLimit) { %><strong class='text-blue-500 font-black'><%= cpuRequest || '0' %> ≦处理器≦ <%= cpuLimit || '♾️' %></strong><br><% } %><% if (memoryRequest || memoryLimit) { %><strong class='text-green-500 font-black'><%= memoryRequest || '0' %> ≦内存≦ <%= memoryLimit || '♾️' %></strong><br><% } %><% if (i < data.spec.containers.length - 1) { %><br><% } %><% } %><% } %>"
},
{
"name": "resource",
"label": "CPU资源<br><span class='text-gray-500 text-xs'>需求可用Node总量比例<br>上限可用Node总量比例<br>实时/上限比例</span>",
"type": "container",
"width": "150px",
"body": [
{
"type": "progress",
"label": "request",
"value": "<%= data.metadata.annotations['cpu.requestFraction'] && Number(data.metadata.annotations['cpu.requestFraction']) !== 0 ? data.metadata.annotations['cpu.requestFraction'] : 100 %>",
"placeholder": "N/A",
"animate": true,
"width": "100px",
"map": [
"bg-success",
"bg-success",
"bg-success",
"bg-warning",
"bg-danger"
],
"visibleOn": "this.metadata.annotations && this.metadata.annotations['cpu.requestFraction'] && Number(this.metadata.annotations['cpu.requestFraction']) !== 0"
},
{
"type": "tpl",
"tpl": "<div class='text-left'>♾️</div>",
"visibleOn": "!(this.metadata.annotations && this.metadata.annotations['cpu.requestFraction'] && Number(this.metadata.annotations['cpu.requestFraction']) !== 0)"
},
{
"type": "progress",
"label": "limit",
"value": "<%= data.metadata.annotations['cpu.limitFraction'] && Number(data.metadata.annotations['cpu.limitFraction']) !== 0 ? data.metadata.annotations['cpu.limitFraction'] : 100 %>",
"placeholder": "N/A",
"animate": true,
"width": "100px",
"map": [
"bg-success",
"bg-success",
"bg-success",
"bg-warning",
"bg-danger"
],
"visibleOn": "(this.metadata.annotations && this.metadata.annotations['cpu.limitFraction'] && Number(this.metadata.annotations['cpu.limitFraction']) !== 0)"
},
{
"type": "tpl",
"tpl": "<div class='text-left'>♾️</div>",
"visibleOn": "!(this.metadata.annotations && this.metadata.annotations['cpu.limitFraction'] && Number(this.metadata.annotations['cpu.limitFraction']) !== 0)"
},
{
"type": "progress",
"label": "realtime",
"value": "<%= data.metadata.annotations['cpu.realtimeFraction'] && Number(data.metadata.annotations['cpu.realtimeFraction']) !== 0 ? data.metadata.annotations['cpu.realtimeFraction'] : 0 %>",
"placeholder": "N/A",
"animate": true,
"width": "100px",
"map": [
"bg-success",
"bg-success",
"bg-success",
"bg-warning",
"bg-danger"
],
"visibleOn": "(this.metadata.annotations && this.metadata.annotations['cpu.realtimeFraction'] && Number(this.metadata.annotations['cpu.realtimeFraction']) !== 0)"
},
{
"type": "tpl",
"tpl": "<div class='text-left'>♾️</div>",
"visibleOn": "!(this.metadata.annotations && this.metadata.annotations['cpu.realtimeFraction'] && Number(this.metadata.annotations['cpu.realtimeFraction']) !== 0)"
}
]
},
{
"name": "resource",
"label": "内存资源<br><span class='text-gray-500 text-xs'>需求可用Node总量比例<br>上限可用Node总量比例<br>实时/上限比例</span>",
"type": "container",
"width": "150px",
"body": [
{
"type": "progress",
"label": "request",
"value": "<%= data.metadata.annotations['memory.requestFraction'] && Number(data.metadata.annotations['memory.requestFraction']) !== 0 ? data.metadata.annotations['memory.requestFraction'] : 100 %>",
"placeholder": "N/A",
"animate": true,
"width": "100px",
"map": [
"bg-success",
"bg-success",
"bg-success",
"bg-warning",
"bg-danger"
],
"visibleOn": "this.metadata.annotations && this.metadata.annotations['memory.requestFraction'] && Number(this.metadata.annotations['memory.requestFraction']) !== 0"
},
{
"type": "tpl",
"tpl": "<div class='text-left'>♾️</div>",
"visibleOn": "!(this.metadata.annotations && this.metadata.annotations['memory.requestFraction'] && Number(this.metadata.annotations['memory.requestFraction']) !== 0)"
},
{
"type": "progress",
"label": "limit",
"value": "<%= data.metadata.annotations['memory.limitFraction'] && Number(data.metadata.annotations['memory.limitFraction']) !== 0 ? data.metadata.annotations['memory.limitFraction'] : 100 %>",
"placeholder": "N/A",
"animate": true,
"width": "100px",
"map": [
"bg-success",
"bg-success",
"bg-success",
"bg-warning",
"bg-danger"
],
"visibleOn": "(this.metadata.annotations && this.metadata.annotations['memory.limitFraction'] && Number(this.metadata.annotations['memory.limitFraction']) !== 0)"
},
{
"type": "tpl",
"tpl": "<div class='text-left'>♾️</div>",
"visibleOn": "!(this.metadata.annotations && this.metadata.annotations['memory.limitFraction'] && Number(this.metadata.annotations['memory.limitFraction']) !== 0)"
},
{
"type": "progress",
"label": "realtime",
"value": "<%= data.metadata.annotations['memory.realtimeFraction'] && Number(data.metadata.annotations['memory.realtimeFraction']) !== 0 ? data.metadata.annotations['memory.realtimeFraction'] : 0 %>",
"placeholder": "N/A",
"animate": true,
"width": "100px",
"map": [
"bg-success",
"bg-success",
"bg-success",
"bg-warning",
"bg-danger"
],
"visibleOn": "(this.metadata.annotations && this.metadata.annotations['memory.realtimeFraction'] && Number(this.metadata.annotations['memory.realtimeFraction']) !== 0)"
},
{
"type": "tpl",
"tpl": "<div class='text-left'>♾️</div>",
"visibleOn": "!(this.metadata.annotations && this.metadata.annotations['memory.realtimeFraction'] && Number(this.metadata.annotations['memory.realtimeFraction']) !== 0)"
}
]
},
{
"name": "metadata.labels",
"label": "标签",
"type": "tpl",
"tpl": "${metadata.labels ? '<i class=\"fa fa-tags text-primary\"></i>' : '<i class=\"fa fa-tags text-secondary\"></i>'}",
"onEvent": {
"click": {
"actions": [
{
"actionType": "dialog",
"dialog": {
"title": "${metadata.name} 标签 (ESC 关闭)",
"name": "dialog_labels",
"size": "lg",
"closeOnEsc": true,
"closeOnOutside": true,
"body": [
{
"type": "form",
"mode": "horizontal",
"labelWidth": 0,
"api": "post:/k8s/$kind/group/$group/version/$version/update_labels/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "input-kv",
"name": "labels",
"draggable": false,
"value": "${metadata.labels}"
}
]
}
]
}
}
]
}
},
"style": {
"cursor": "pointer"
},
"searchable": {
"type": "input-text",
"name": "metadata.labels",
"clearable": true,
"label": "模糊标签",
"placeholder": "模糊搜索label标签中的k、v"
}
},
{
"name": "metadata.annotations",
"label": "注解",
"type": "tpl",
"tpl": "${metadata.annotations|filterAnnotations|showAnnotationIcon|isTrue:'<i class=\"fa fa-note-sticky text-primary\"></i>':'<i class=\"fa fa-note-sticky text-secondary\"></i>'}",
"onEvent": {
"click": {
"actions": [
{
"actionType": "dialog",
"dialog": {
"title": "${metadata.name} 注解 (ESC 关闭)",
"name": "dialog_annotations",
"body": [
{
"type": "form",
"mode": "horizontal",
"labelWidth": 0,
"api": "post:/k8s/$kind/group/$group/version/$version/update_annotations/ns/$metadata.namespace/name/$metadata.name",
"initApi": "get:/k8s/$kind/group/$group/version/$version/annotations/ns/$metadata.namespace/name/$metadata.name",
"body": [
{
"type": "input-kv",
"name": "annotations",
"draggable": false,
"value": "${annotations}"
}
]
}
],
"size": "lg",
"closeOnEsc": true,
"closeOnOutside": true
}
}
]
}
},
"style": {
"cursor": "pointer"
}
},
{
"name": "status.conditions",
"label": "条件",
"type": "k8sTextConditions"
},
{
"name": "spec.tolerations",
"label": "容忍度",
"type": "tpl",
"tpl": "${spec.tolerations ? '<i class=\"fa-solid fa-exclamation-triangle text-primary\"></i>' : '<i class=\"fa-solid fa-exclamation-triangle text-secondary\"></i>'}",
"onEvent": {
"click": {
"actions": [
{
"actionType": "dialog",
"dialog": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${metadata.name} 容忍度 (ESC 关闭)",
"body": [
{
"type": "panel",
"title": "调度规则:如何使用 容忍度",
"body": [
{
"type": "button",
"label": "什么是容忍度",
"level": "link",
"icon": "fas fa-question-circle text-primary",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "什么是容忍度(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/any_question",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"question": "什么是容忍度"
}
}
]
}
},
{
"type": "tpl",
"tpl": "<div><div><strong>容忍度规则:</strong> Pod 必须容忍节点上的污点(Taints),才能调度到该节点。容忍度由 key、operator、value 和 effect 组成,其中 key 代表污点键,operator 决定匹配方式,effect 代表污点的影响类型。</div><div><strong>匹配规则:</strong><br>1. key 和 effect 必须与节点上的污点完全一致,否则容忍度无效。<br>2. operator 决定 value 是否必须匹配:当 operator 为 Equal 时,value 也必须与节点污点的 value 一致;当 operator 为 Exists 时,只要 key 存在即可,不关心 value。</div><div><strong>调度行为:</strong> 仅当 Pod 的容忍度与节点污点的 key 和 effect 匹配,并且 value 符合 operator 规则时,Pod 才能调度到该节点,否则调度将被阻止。</div></div>"
}
]
},
{
"type": "crud",
"api": "/k8s/$kind/group/$group/version/$version/list_tolerations/ns/$metadata.namespace/name/$metadata.name",
"quickSaveItemApi": "/k8s/$kind/group/$group/version/$version/update_tolerations/ns/$metadata.namespace/name/$metadata.name",
"headerToolbar": [],
"showIndex": true,
"columns": [
{
"name": "key",
"label": "键"
},
{
"name": "operator",
"label": "操作符",
"placeholder": "-",
"type": "mapping",
"map": {
"Equal": "<span class='label label-success'>等于</span>",
"Exists": "<span class='label label-success'>存在</span>"
}
},
{
"name": "value",
"label": "值",
"placeholder": "-"
},
{
"name": "effect",
"label": "效果",
"type": "mapping",
"map": {
"NoSchedule": "<span class='label label-warning'>禁止调度</span>",
"PreferNoSchedule": "<span class='label label-danger'>优先不调度</span>",
"NoExecute": "<span class='label label-danger'>不可执行</span>"
}
}
]
}
]
}
}
]
}
},
"style": {
"cursor": "pointer"
}
},
{
"name": "spec.affinity",
"label": "亲和性",
"type": "tpl",
"tpl": "${spec.template.spec.affinity ? '<i class=\"fa-solid fa-sitemap text-primary\"></i>' : '<i class=\"fa-solid fa-sitemap text-secondary\"></i>'}",
"onEvent": {
"click": {
"actions": [
{
"actionType": "dialog",
"dialog": {
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "${metadata.name} 亲和性 (ESC 关闭)",
"body": [
{
"type": "tabs",
"swipeable": true,
"tabs": [
{
"title": "节点亲和性",
"tab": [
{
"type": "panel",
"title": "调度规则:如何使用 NodeAffinity",
"body": [
{
"type": "button",
"label": "什么是节点亲和性",
"level": "link",
"icon": "fas fa-question-circle text-primary",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "什么是节点亲和性(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/any_question",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"question": "什么是节点亲和性"
}
}
]
}
},
{
"type": "tpl",
"tpl": "<div><div><strong>节点规则:</strong> 节点必须匹配 `nodeAffinity` 中定义的规则,如节点上必须有标签(例如 `kubernetes.io/hostname`)。</div><div><strong>标签筛选:</strong>当操作符为存在、不存在时,不能填写筛选值。当为其他类型时,按定义过滤。</div></div>"
}
]
},
{
"type": "divider",
"title": "节点标签 必须满足",
"titlePosition": "left",
"visibleOn": "${spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution}"
},
{
"type": "crud",
"api": "/k8s/$kind/group/$group/version/$version/list_node_affinity/ns/$metadata.namespace/name/$metadata.name",
"quickSaveItemApi": "/k8s/$kind/group/$group/version/$version/update_node_affinity/ns/$metadata.namespace/name/$metadata.name",
"headerToolbar": [],
"showIndex": true,
"columns": [
{
"name": "key",
"label": "键",
"width": "250px"
},
{
"name": "operator",
"label": "操作符",
"type": "mapping",
"map": {
"In": "<span class='label label-success'>包含</span>",
"NotIn": "<span class='label label-warning'>不包含</span>",
"Exists": "<span class='label label-info'>存在</span>",
"DoesNotExist": "<span class='label label-info'>不存在</span>"
},
"placeholder": "-",
"width": "100px"
},
{
"name": "values",
"label": "值",
"type": "each",
"items": {
"type": "tpl",
"tpl": "${item}<br>"
},
"placeholder": "-"
}
]
},
{
"type": "wrapper",
"className": "h-10",
"visibleOn": "${spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution}"
},
{
"type": "divider",
"title": "节点标签 优先满足",
"titlePosition": "left",
"visibleOn": "${spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution}"
},
{
"name": "spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution",
"visibleOn": "${spec.template.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution}",
"type": "each",
"items": {
"type": "table",
"source": "${item.preference.matchExpressions}",
"columns": [
{
"name": "key",
"label": "键",
"width": "250px"
},
{
"name": "operator",
"label": "操作符",
"type": "mapping",
"map": {
"In": "<span class='label label-success'>包含</span>",
"NotIn": "<span class='label label-warning'>不包含</span>",
"Exists": "<span class='label label-info'>存在</span>"
},
"placeholder": "-",
"width": "50px"
},
{
"name": "values",
"label": "值",
"type": "each",
"items": {
"type": "tpl",
"tpl": "${item}<br>"
},
"placeholder": "-"
}
]
}
}
]
},
{
"title": "Pod亲和性",
"tab": [
{
"type": "panel",
"title": "调度规则:如何使用 PodAffinity 和 TopologyKey",
"body": [
{
"type": "button",
"label": "什么是Pod亲和性",
"level": "link",
"icon": "fas fa-question-circle text-primary",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "什么是Pod亲和性(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/any_question",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"question": "什么是Pod亲和性"
}
}
]
}
},
{
"type": "tpl",
"tpl": "<div><div><strong>1、节点规则:</strong> 节点必须要有拓扑键同名的(如 topology.kubernetes.io/zone)标签。</div><div><strong>2、Pod标签:</strong> 节点上的 Pod 必须带有满足 labelSelector 中定义的标签(如 app=myapp)。</div><div>筛选出满足以上两条规则的节点,k8s将Pod调度到该节点上。</div></div>"
}
]
},
{
"type": "divider",
"title": "Pod标签 必须满足",
"titlePosition": "left",
"visibleOn": "${spec.template.spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution}"
},
{
"type": "crud",
"api": "/k8s/$kind/group/$group/version/$version/list_pod_affinity/ns/$metadata.namespace/name/$metadata.name",
"showIndex": true,
"headerToolbar": [],
"columns": [
{
"type": "json",
"label": "标签",
"source": "${labelSelector.matchLabels}",
"levelExpand": 1
},
{
"name": "topologyKey",
"label": "拓扑键",
"type": "text"
}
]
},
{
"type": "wrapper",
"className": "h-10",
"visibleOn": "${spec.template.spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution}"
},
{
"type": "divider",
"title": "Pod标签 优先满足",
"titlePosition": "left",
"visibleOn": "${spec.template.spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution}"
},
{
"type": "table",
"visibleOn": "${spec.template.spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution}",
"source": "${spec.template.spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution}",
"columns": [
{
"type": "json",
"label": "标签",
"source": "${podAffinityTerm.labelSelector.matchLabels}",
"levelExpand": 1
},
{
"name": "topologyKey",
"label": "拓扑键",
"type": "text",
"value": "${podAffinityTerm.topologyKey|raw}"
},
{
"name": "weight",
"label": "权重",
"type": "text",
"value": "${weight}"
}
]
}
]
},
{
"title": "Pod反亲和性",
"tab": [
{
"type": "panel",
"title": "调度规则:如何使用 PodAntiAffinity 和 TopologyKey",
"body": [
{
"type": "button",
"label": "什么是Pod反亲和性",
"level": "link",
"icon": "fas fa-question-circle text-primary",
"actionType": "drawer",
"drawer": {
"overlay": false,
"closeOnEsc": true,
"closeOnOutside": true,
"size": "lg",
"title": "什么是Pod反亲和性(ESC 关闭)",
"body": [
{
"type": "websocketMarkdownViewer",
"url": "/ai/chat/any_question",
"params": {
"kind": "${kind}",
"group": "${group}",
"version": "${version}",
"question": "什么是Pod反亲和性"
}
}
]
}
},
{
"type": "tpl",
"tpl": "<div><div><strong>1、节点规则:</strong> 节点必须要有拓扑键同名的(如 topology.kubernetes.io/zone)标签。</div><div><strong>2、Pod标签:</strong> 节点上的 Pod 标签满足 labelSelector 中定义的标签(如 app=myapp),那么该节点排除。</div><div><strong></strong> 从带有拓扑键的主机列表中,但是排除运行某些pod的节点。例如,若一个节点已经有了某个特定标签的 Pod,新的 Pod 将避免调度到该节点。</div></div>"
}
]
},
{
"type": "divider",
"title": "Pod标签 必须满足",
"titlePosition": "left",
"visibleOn": "${spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution}"
},
{
"type": "crud",
"api": "/k8s/$kind/group/$group/version/$version/list_pod_anti_affinity/ns/$metadata.namespace/name/$metadata.name",
"showIndex": true,
"headerToolbar": [],
"columns": [
{
"type": "json",
"label": "标签",
"source": "${labelSelector.matchLabels}",
"levelExpand": 1
},
{
"name": "topologyKey",
"label": "拓扑键",
"type": "text"
}
]
},
{
"type": "wrapper",
"className": "h-10",
"visibleOn": "${spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution}"
},
{
"type": "divider",
"title": "Pod标签 优先满足",
"titlePosition": "left",
"visibleOn": "${spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution}"
},
{
"type": "table",
"visibleOn": "${spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution}",
"source": "${spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution}",
"columns": [
{
"type": "json",
"label": "标签",
"source": "${podAffinityTerm.labelSelector.matchLabels}",
"levelExpand": 1
},
{
"name": "topologyKey",
"label": "拓扑键",
"type": "text",
"value": "${podAffinityTerm.topologyKey|raw}"
},
{
"name": "weight",
"label": "权重",
"type": "text",
"value": "${weight}"
}
]
}
]
}
]
}
]
}
}
]
}
},
"style": {
"cursor": "pointer"
}
},
{
"name": "spec.hostNetwork",
"label": "网络类型",
"width": "150px",
"sortable": true,
"type": "tpl",
"tpl": "<% if (data.spec.hostNetwork) { %><span class='label label-danger'>主机网络</span><% } else { %><span class='label label-success'>容器网络</span><% } %>"
},
{
"name": "spec.nodeName",
"label": "所在节点",
"type": "text",
"searchable": {
"type": "select",
"clearable": true,
"searchable": true,
"source": "/k8s/node/name/option_list"
},
"width": "150px",
"sortable": true
},
{
"name": "metadata.creationTimestamp",
"label": "存在时长",
"type": "k8sAge"
},
{
"name": "metadata.ownerReferences.name",
"label": "所有者",
"type": "text",
"searchable": true,
"visibleOn": "1==2"
},
{
"name": "unique_labels",
"label": "精确标签",
"visibleOn": "1==2",
"searchable": {
"type": "select",
"clearable": true,
"searchable": true,
"source": "/k8s/pod/labels/unique_labels",
"creatable": true,
"addControls": [
{
"type": "text",
"name": "label",
"label": "自定义标签",
"placeholder": "k=v,如果不写等号,则只搜索k"
}
]
}
}
]
}
]
}