Files
LokiStack/frontend/src/i18n/locales/zh/clusters.ts
T
opsx bad2a1e624 fix(hosts,collectors,usage): 主机验证结果失真 + 主机模式系统日志解析 + metrics 单位
=== 一、主机「测试连接」永远显示旧错误(真实 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
2026-10-28 17:58:30 +00:00

89 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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: '命名空间',
},
}