=== 一、主机「测试连接」永远显示旧错误(真实 bug)===
HostService.Validate 的失败分支也写 status=active,且从不写 statusMessage:
if info, err := client.GetHostInfo(ctx); err == nil { 更新 os/arch }
else { s.Update(id, {status:"active"}) } // ← 失败也标记成功
结果:连不上也显示正常,页面永远停在几分钟前的旧错误文案,
用户改了 IP 再点测试,还以为"改了还是不行"。
改为区分成功/失败并写清原因:
成功 → status=active + os/arch + statusMessage="连接成功"
失败 → status=error + statusMessage=FormatSSHError(err)
=== 二、回环地址在平台里必然连不上 ===
平台跑在容器/Pod 内,127.0.0.1 指向平台自身。
- 新建主机时拦截:hostIP 为 127.0.0.1/localhost/::1 直接报错并解释原因
- 前端表单同步校验 + 文案
- SSH 错误映射补充:连接被拒绝时提示可能是地址填了回环
=== 三、主机模式采集系统日志(两处会导致采集失败)===
1. pipeline 一律套 cri 阶段:cri 只认容器运行时格式,
套在 /var/log/messages 这类 syslog 上会取不到时间戳、整行被丢。
→ appPipelineStages() 按路径判断:容器日志用 cri,普通文本日志只做限流。
2. promtailExternalLabels 写死 8 空格缩进:主机模板 external_labels 只有 4 空格,
一旦给采集器配置了标签就生成非法 YAML,Promtail 装不上。
→ 增加 indent 参数,主机 6 空格 / DaemonSet 8 空格。
3. 新增 system 采集任务:
/var/log/{messages,secure,cron,maillog,syslog,dmesg}
正则解析 syslog 时间戳(Jan _2 15:04:05,Asia/Shanghai)+ 限流
测试:TestHostPromtailConfigValid / CRIPathKeepsCRIStage / PlainFileHasNoCRIStage
TestPromtailManifestParses 全部通过
=== 四、资源用量 CPU 解析(nanocores)===
metrics-server 返回的 CPU 常是纳核(如 "194533645n"=194.5m)。
原解析只处理 "m",导致 194 亿核、页面出现"CPU 已达 limit 的 4863341125%"。
→ parseQuantityMilli 支持 n/u/m/整核
实测:CPU 当前=178m,峰值=3300m,建议"峰值占 limit 82%,可考虑提前扩容"
=== 五、其他 ===
- 添加集群默认改用 Token 认证(最小权限、可随时吊销)
- RBAC 片段补 metrics.k8s.io(资源面板需要,独立 API 组常被漏授)
- 文案去掉 Grafana 需求描述(平台自身不部署 Grafana)
镜像:lghost/lokistack:latest + v0.1 = sha256:7bddd0f4d1f1
89 lines
3.6 KiB
TypeScript
89 lines
3.6 KiB
TypeScript
// clusters 命名空间 — 集群管理页中文文案
|
||
// 富文本(含 <code>/<strong>)配合 react-i18next <Trans> 渲染,勿删标签
|
||
export default {
|
||
title: '集群管理',
|
||
description: '管理用于 Loki 部署的 Kubernetes 集群',
|
||
actions: {
|
||
add: '添加集群',
|
||
detail: '详情',
|
||
editAria: '编辑集群 {{name}}',
|
||
validateAria: '验证集群 {{name}}',
|
||
deleteAria: '删除集群 {{name}}',
|
||
},
|
||
fields: {
|
||
accessType: '接入方式',
|
||
apiServer: 'API Server',
|
||
version: '版本',
|
||
nodes: '节点数',
|
||
unknown: '未知',
|
||
},
|
||
empty: {
|
||
title: '暂无集群',
|
||
description: '添加第一个 Kubernetes 集群开始使用',
|
||
},
|
||
delete: {
|
||
warning:
|
||
'确定要删除「{{name}}」吗?警告:仍有 {{dep}} 个部署、{{col}} 个采集策略引用该集群,删除后它们将无法工作。',
|
||
},
|
||
toast: {
|
||
deleteFailed: '删除集群失败',
|
||
validateFailed: '验证失败',
|
||
createFailed: '创建集群失败',
|
||
},
|
||
form: {
|
||
addTitle: '添加 Kubernetes 集群',
|
||
editTitle: '编辑集群',
|
||
editTitleWithName: '编辑集群 · {{name}}',
|
||
nameLabel: '集群名称 *',
|
||
descriptionLabel: '描述',
|
||
descriptionPlaceholder: '生产环境日志集群',
|
||
accessTypeLabel: '接入方式',
|
||
kubeconfigLabel: 'Kubeconfig 内容 *',
|
||
kubeconfigLabelEdit: 'Kubeconfig 内容(留空保持不变)',
|
||
kubeconfigPlaceholder: '粘贴 kubeconfig YAML(自动识别 API Server)...',
|
||
apiServerDetected: '已识别 API Server:{{server}}',
|
||
apiServerLabel: 'API Server *',
|
||
tokenLabel: 'Token *',
|
||
tokenLabelEdit: 'Token(留空保持不变)',
|
||
tokenPlaceholder: '粘贴 Service Account Token...',
|
||
tokenInsecureHint: '推荐:Token 权限可精确控制、可随时吊销;该模式下跳过 TLS 校验以兼容内网自签证书。若集群有公网可信证书,请改用 Kubeconfig 模式做严格校验。',
|
||
rbacSummary: '最小授权建议(点击展开)',
|
||
rbacScope:
|
||
'只授予 <code>log</code> 命名空间权限,Token 泄露也不会影响其他命名空间;<strong>不要使用 cluster-admin</strong>。',
|
||
rbacScriptIntro:
|
||
'在集群执行一次,创建命名空间 / SA / Role / 长期 Token:',
|
||
rbacScriptComment1: '# 1) 一次创建:命名空间 + SA + 命名空间级 Role + 长期 Token',
|
||
rbacScriptComment2: '# 2) 取出长期 Token(不自动过期),粘贴到 Token 输入框',
|
||
rbacNamespaceNote:
|
||
'Token 无集群级权限;仅当需要平台自建命名空间时才额外授予 namespaces: create/get。',
|
||
rbacTokenNote:
|
||
'Token 仅限 log 命名空间,泄露影响面小;服务端加密存储。轮换:删除该 Secret 重建。',
|
||
contextLabel: '上下文(可选)',
|
||
contextPlaceholder: '留空则使用默认上下文',
|
||
submitAdd: '添加集群',
|
||
submitSave: '保存修改',
|
||
submittingAdd: '添加中...',
|
||
submittingSave: '保存中...',
|
||
validation: {
|
||
nameRequired: '请输入集群名称',
|
||
kubeconfigRequired: '请填写 kubeconfig 内容',
|
||
apiServerRequired: '请填写 API Server 地址',
|
||
tokenRequired: '请填写 Token',
|
||
},
|
||
},
|
||
detail: {
|
||
loadError: '加载集群详情失败',
|
||
version: '版本',
|
||
unknown: '未知',
|
||
currentContext: '当前上下文',
|
||
defaultContext: '默认',
|
||
nodesCount: '节点({{count}})',
|
||
nodeReady: '就绪',
|
||
nodeNotReady: '未就绪',
|
||
nodeIp: 'IP:{{value}}',
|
||
nodeOs: '系统:{{os}}/{{arch}}',
|
||
nodeVersion: '版本:{{version}}',
|
||
namespaces: '命名空间',
|
||
},
|
||
}
|