feat(collectors): Promtail DaemonSet 的部署命名空间固定为 log,表单隐藏该字段
CI / Backend (go vet + test) (push) Waiting to run
CI / Frontend (lint + build + test) (push) Waiting to run

=== 需求 ===
创建 Loki 部署后添加采集策略(Promtail DaemonSet)时,"部署节点命名空间"
不该让用户选 —— 采集器必须和 LokiStack 放在一起(log)。

=== 前端 ===
CollectorFormDialog:选择 k8s-daemonset 时整块隐藏 namespace 字段
(连同分类型提示、手动输入开关一起),改为一条只读说明:
  「采集器部署命名空间固定为 Loki 所在命名空间(通常 log),与 LokiStack
    放在一起,无需选择。要限制采集范围请用下面的『只采集这些命名空间』。」
提交时 DaemonSet 不传 namespace(原来会传用户填的值)。
顺带修掉隐藏后暴露的 tsc 报错:placeholder 里 `collectorType === 'k8s-daemonset'`
在收窄后的分支里已成不可能比较,改为常量 'default'。

=== 后端(强制约束,不只靠前端)===
services/collector.go:
  Create:type == k8s-daemonset 时强制清空 req.Namespace
          → 渲染与部署两侧都会回退到 d.loki.Namespace
  Update:DaemonSet 忽略 updates["namespace"]
原始渲染逻辑本就有"为空则用 LokiDeployment.Namespace,再兜底 log"。

为什么后端也要拦:API 直接调用(脚本/其他客户端)不该能把采集器
部署到任意命名空间——那样会出现"平台显示在 log、实际 DaemonSet 在别处"
的状态漂移。

=== 实测(0108617e4180)===
  现有采集器 promtail-pre: type=k8s-daemonset namespace='log'
  PUT {"namespace":"evil-ns"} → 返回 success,但读回仍是 'log' ✅ 被忽略
  tsc 通过;Pod = Hub latest = 0108617e4180
This commit is contained in:
opsx committed 2026-10-31 01:56:15 +00:00
1 parent 2e97c04f84
commit 9448868a71
4 files changed
+26 -2

No files matched your search

+12
View File
@@ -274,6 +274,13 @@ func (s *CollectorService) Create(req *CreateCollectorRequest) (*models.Collecto
refType = "host"
}
// DaemonSet 的部署命名空间固定为 Loki 所在命名空间(通常 log):
// 采集器与 LokiStack 放在一起,用户不需要也不应该选。
// 这里强制清空,渲染与部署两侧都会回退到 d.loki.Namespace。
if req.Type == "k8s-daemonset" {
req.Namespace = ""
}
collector := models.Collector{
ID: repository.GetDB().NextID("collectors"),
Name: req.Name,
@@ -374,6 +381,11 @@ func (s *CollectorService) Update(id uint, updates map[string]interface{}) error
if v, ok := updates["labels"].(string); ok {
db.Collectors[i].Labels = v
}
// DaemonSet 的 namespace 一律不接受修改(固定跟随 Loki 所在命名空间)
if v, ok := updates["namespace"].(string); ok && v != "" && db.Collectors[i].Type != "k8s-daemonset" {
db.Collectors[i].Namespace = v
db.Collectors[i].StatusMessage = "部署命名空间已保存,点击部署以应用新配置"
}
// targetNamespaces: 采集哪些命名空间([]string;空=全集群)
if v, ok := updates["targetNamespaces"]; ok {
var nss []string